48 lines
1.6 KiB
Diff
48 lines
1.6 KiB
Diff
From c860b8340bf921de66aa7871f40507dd5628926f Mon Sep 17 00:00:00 2001
|
|
From: Li Lingfeng <lilingfeng3@huawei.com>
|
|
Date: Mon, 14 Apr 2025 22:38:52 +0800
|
|
Subject: nfsd: Initialize ssc before laundromat_work to prevent NULL
|
|
dereference
|
|
|
|
In nfs4_state_start_net(), laundromat_work may access nfsd_ssc through
|
|
nfs4_laundromat -> nfsd4_ssc_expire_umount. If nfsd_ssc isn't initialized,
|
|
this can cause NULL pointer dereference.
|
|
|
|
Normally the delayed start of laundromat_work allows sufficient time for
|
|
nfsd_ssc initialization to complete. However, when the kernel waits too
|
|
long for userspace responses (e.g. in nfs4_state_start_net ->
|
|
nfsd4_end_grace -> nfsd4_record_grace_done -> nfsd4_cld_grace_done ->
|
|
cld_pipe_upcall -> __cld_pipe_upcall -> wait_for_completion path), the
|
|
delayed work may start before nfsd_ssc initialization finishes.
|
|
|
|
Fix this by moving nfsd_ssc initialization before starting laundromat_work.
|
|
|
|
Fixes: f4e44b393389 ("NFSD: delay unmount source's export after inter-server copy completed.")
|
|
Cc: stable@vger.kernel.org
|
|
Reviewed-by: Jeff Layton <jlayton@kernel.org>
|
|
Signed-off-by: Li Lingfeng <lilingfeng3@huawei.com>
|
|
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
|
|
---
|
|
fs/nfsd/nfssvc.c | 6 +++---
|
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
|
|
--- a/fs/nfsd/nfssvc.c
|
|
+++ b/fs/nfsd/nfssvc.c
|
|
@@ -396,13 +396,13 @@ static int nfsd_startup_net(struct net *
|
|
if (ret)
|
|
goto out_filecache;
|
|
|
|
+#ifdef CONFIG_NFSD_V4_2_INTER_SSC
|
|
+ nfsd4_ssc_init_umount_work(nn);
|
|
+#endif
|
|
ret = nfs4_state_start_net(net);
|
|
if (ret)
|
|
goto out_reply_cache;
|
|
|
|
-#ifdef CONFIG_NFSD_V4_2_INTER_SSC
|
|
- nfsd4_ssc_init_umount_work(nn);
|
|
-#endif
|
|
nn->nfsd_net_up = true;
|
|
return 0;
|
|
|