cifs: set rc to -ENOENT if we can not get a dentry for the cached dir
authorRonnie Sahlberg <lsahlber@redhat.com>
Mon, 17 Oct 2022 23:48:26 +0000 (18:48 -0500)
committerSteve French <stfrench@microsoft.com>
Tue, 18 Oct 2022 16:33:43 +0000 (11:33 -0500)
We already set rc to this return code further down in the function but
we can set it earlier in order to suppress a smash warning.

Also fix a false positive for Coverity. The reason this is a false positive is
that this happens during umount after all files and directories have been closed
but mosetting on ->on_list to suppress the warning.

Reported-by: Dan carpenter <dan.carpenter@oracle.com>
Reported-by: coverity-bot <keescook+coverity-bot@chromium.org>
Addresses-Coverity-ID: 1525256 ("Concurrent data access violations")
Fixes: a350d6e73f5e ("cifs: enable caching of directories for which a lease is held")
Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/cached_dir.c

index 8cad528a87228bb902ab0734a8bc4737b3a0cd4c..20efc9e22761d352a29a21fbcf9e127953092a9a 100644 (file)
@@ -253,8 +253,10 @@ int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon,
                dentry = dget(cifs_sb->root);
        else {
                dentry = path_to_dentry(cifs_sb, path);
-               if (IS_ERR(dentry))
+               if (IS_ERR(dentry)) {
+                       rc = -ENOENT;
                        goto oshr_free;
+               }
        }
        cfid->dentry = dentry;
        cfid->tcon = tcon;
@@ -385,13 +387,13 @@ void invalidate_all_cached_dirs(struct cifs_tcon *tcon)
                list_move(&cfid->entry, &entry);
                cfids->num_entries--;
                cfid->is_open = false;
+               cfid->on_list = false;
                /* To prevent race with smb2_cached_lease_break() */
                kref_get(&cfid->refcount);
        }
        spin_unlock(&cfids->cfid_list_lock);
 
        list_for_each_entry_safe(cfid, q, &entry, entry) {
-               cfid->on_list = false;
                list_del(&cfid->entry);
                cancel_work_sync(&cfid->lease_break);
                if (cfid->has_lease) {