Re: [PATCH] cifs: set rc to -ENOENT if we can not get a dentry for the cached dir

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Lightly updated to deal with merge conflict with "cifs: use
LIST_HEAD() and list_move() to simplify code" and merged into
cifs-2.6.git for-next pending review and testing

See attached update patch.

On Mon, Oct 17, 2022 at 6:32 PM Ronnie Sahlberg <lsahlber@xxxxxxxxxx> wrote:
>
> 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@xxxxxxxxxx>
> Reported-by: coverity-bot <keescook+coverity-bot@xxxxxxxxxxxx>
> 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@xxxxxxxxxx>
> ---
>  fs/cifs/cached_dir.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/fs/cifs/cached_dir.c b/fs/cifs/cached_dir.c
> index fe88b67c863f..ffc924296e59 100644
> --- a/fs/cifs/cached_dir.c
> +++ b/fs/cifs/cached_dir.c
> @@ -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;
> @@ -387,13 +389,13 @@ void invalidate_all_cached_dirs(struct cifs_tcon *tcon)
>                 list_add(&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) {
> --
> 2.35.3
>


-- 
Thanks,

Steve
From 1b028682528ca86559cad5311eb52b57333cecf0 Mon Sep 17 00:00:00 2001
From: Ronnie Sahlberg <lsahlber@xxxxxxxxxx>
Date: Mon, 17 Oct 2022 18:48:26 -0500
Subject: [PATCH] cifs: set rc to -ENOENT if we can not get a dentry for the
 cached dir

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@xxxxxxxxxx>
Reported-by: coverity-bot <keescook+coverity-bot@xxxxxxxxxxxx>
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@xxxxxxxxxx>
---
 fs/cifs/cached_dir.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/fs/cifs/cached_dir.c b/fs/cifs/cached_dir.c
index 8cad528a8722..20efc9e22761 100644
--- a/fs/cifs/cached_dir.c
+++ b/fs/cifs/cached_dir.c
@@ -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) {
-- 
2.34.1


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux