aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/fs/nfsd/filecache.c
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@kernel.org>2024-10-03 15:34:58 -0400
committerAnna Schumaker <anna.schumaker@oracle.com>2024-10-03 16:19:43 -0400
commit65f2a5c366353da6fa724c68347e1de954928143 (patch)
tree3dbc942931e5b9c55c54519e9fcf846b841cd8be /fs/nfsd/filecache.c
parentNFSv4: Prevent NULL-pointer dereference in nfs42_complete_copies() (diff)
downloadwireguard-linux-65f2a5c366353da6fa724c68347e1de954928143.tar.xz
wireguard-linux-65f2a5c366353da6fa724c68347e1de954928143.zip
nfs_common: fix race in NFS calls to nfsd_file_put_local() and nfsd_serv_put()
Add nfs_to_nfsd_file_put_local() interface to fix race with nfsd module unload. Similarly, use RCU around nfs_open_local_fh()'s error path call to nfs_to->nfsd_serv_put(). Holding RCU ensures that NFS will safely _call and return_ from its nfs_to calls into the NFSD functions nfsd_file_put_local() and nfsd_serv_put(). Otherwise, if RCU isn't used then there is a narrow window when NFS's reference for the nfsd_file and nfsd_serv are dropped and the NFSD module could be unloaded, which could result in a crash from the return instruction for either nfs_to->nfsd_file_put_local() or nfs_to->nfsd_serv_put(). Reported-by: NeilBrown <neilb@suse.de> Signed-off-by: Mike Snitzer <snitzer@kernel.org> Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
Diffstat (limited to 'fs/nfsd/filecache.c')
-rw-r--r--fs/nfsd/filecache.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c
index 19bb88c7eebd..53070e1de3d9 100644
--- a/fs/nfsd/filecache.c
+++ b/fs/nfsd/filecache.c
@@ -398,7 +398,7 @@ nfsd_file_put(struct nfsd_file *nf)
* reference to the associated nn->nfsd_serv.
*/
void
-nfsd_file_put_local(struct nfsd_file *nf)
+nfsd_file_put_local(struct nfsd_file *nf) __must_hold(rcu)
{
struct net *net = nf->nf_net;