Skip to content

Commit b9382e2

Browse files
jtlaytonchucklever
authored andcommitted
nfsd: validate the nfsd_serv pointer before calling svc_wake_up
nfsd_file_dispose_list_delayed can be called from the filecache laundrette, which is shut down after the nfsd threads are shut down and the nfsd_serv pointer is cleared. If nn->nfsd_serv is NULL then there are no threads to wake. Ensure that the nn->nfsd_serv pointer is non-NULL before calling svc_wake_up in nfsd_file_dispose_list_delayed. This is safe since the svc_serv is not freed until after the filecache laundrette is cancelled. Reported-by: Salvatore Bonaccorso <carnil@debian.org> Closes: https://bugs.debian.org/1093734 Fixes: ffb4025 ("nfsd: Don't leave work of closing files to a work queue") Cc: stable@vger.kernel.org Signed-off-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: NeilBrown <neilb@suse.de> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
1 parent 7faf14a commit b9382e2

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

fs/nfsd/filecache.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,11 +445,20 @@ nfsd_file_dispose_list_delayed(struct list_head *dispose)
445445
struct nfsd_file, nf_gc);
446446
struct nfsd_net *nn = net_generic(nf->nf_net, nfsd_net_id);
447447
struct nfsd_fcache_disposal *l = nn->fcache_disposal;
448+
struct svc_serv *serv;
448449

449450
spin_lock(&l->lock);
450451
list_move_tail(&nf->nf_gc, &l->freeme);
451452
spin_unlock(&l->lock);
452-
svc_wake_up(nn->nfsd_serv);
453+
454+
/*
455+
* The filecache laundrette is shut down after the
456+
* nn->nfsd_serv pointer is cleared, but before the
457+
* svc_serv is freed.
458+
*/
459+
serv = nn->nfsd_serv;
460+
if (serv)
461+
svc_wake_up(serv);
453462
}
454463
}
455464

0 commit comments

Comments
 (0)