]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nfsd: no need get cache ref when protected by rcu
authorYang Erkun <yangerkun@huawei.com>
Wed, 25 Dec 2024 06:59:06 +0000 (14:59 +0800)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 6 Jan 2025 14:37:41 +0000 (09:37 -0500)
rcu_read_lock/rcu_read_unlock has already provide protection for the
pointer we will reference when we call e_show. Therefore, there is no
need to obtain a cache reference to help protect cache_head.
Additionally, the .put such as expkey_put/svc_export_put will invoke
dput, which can sleep and break rcu. Stop get cache reference to fix
them all.

Fixes: ae74136b4bb6 ("SUNRPC: Allow cache lookups to use RCU protection rather than the r/w spinlock")
Suggested-by: NeilBrown <neilb@suse.de>
Signed-off-by: Yang Erkun <yangerkun@huawei.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/export.c

index aa4712362b3b3d5823eb4211887c3d7e45960cee..c6168bccfb6c692d68495c2a7c03a93536060518 100644 (file)
@@ -1425,13 +1425,9 @@ static int e_show(struct seq_file *m, void *p)
                return 0;
        }
 
-       if (!cache_get_rcu(&exp->h))
+       if (cache_check_rcu(cd, &exp->h, NULL))
                return 0;
 
-       if (cache_check(cd, &exp->h, NULL))
-               return 0;
-
-       exp_put(exp);
        return svc_export_show(m, cd, cp);
 }