Patch "NFS: fix disabling of swap" has been added to the 6.2-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    NFS: fix disabling of swap

to the 6.2-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     nfs-fix-disabling-of-swap.patch
and it can be found in the queue-6.2 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 697b3e35d61fbdf81985f863e3c167181bf21c5e
Author: NeilBrown <neilb@xxxxxxx>
Date:   Wed Feb 8 15:45:38 2023 +1100

    NFS: fix disabling of swap
    
    [ Upstream commit 5bab56fff53ce161ed859d9559a10361d4f79578 ]
    
    When swap is activated to a file on an NFSv4 mount we arrange that the
    state manager thread is always present as starting a new thread requires
    memory allocations that might block waiting for swap.
    
    Unfortunately the code for allowing the state manager thread to exit when
    swap is disabled was not tested properly and does not work.
    This can be seen by examining /proc/fs/nfsfs/servers after disabling swap
    and unmounting the filesystem.  The servers file will still list one
    entry.  Also a "ps" listing will show the state manager thread is still
    present.
    
    There are two problems.
     1/ rpc_clnt_swap_deactivate() doesn't walk up the ->cl_parent list to
        find the primary client on which the state manager runs.
    
     2/ The thread is not woken up properly and it immediately goes back to
        sleep without checking whether it is really needed.  Using
        nfs4_schedule_state_manager() ensures a proper wake-up.
    
    Reported-by: Olga Kornievskaia <aglo@xxxxxxxxx>
    Fixes: 4dc73c679114 ("NFSv4: keep state manager thread active if swap is enabled")
    Signed-off-by: NeilBrown <neilb@xxxxxxx>
    Signed-off-by: Anna Schumaker <Anna.Schumaker@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 40d749f29ed3f..4214286e01450 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -10604,7 +10604,9 @@ static void nfs4_disable_swap(struct inode *inode)
 	/* The state manager thread will now exit once it is
 	 * woken.
 	 */
-	wake_up_var(&NFS_SERVER(inode)->nfs_client->cl_state);
+	struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
+
+	nfs4_schedule_state_manager(clp);
 }
 
 static const struct inode_operations nfs4_dir_inode_operations = {
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 0b0b9f1eed469..fd7e1c630493e 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -3350,6 +3350,8 @@ rpc_clnt_swap_deactivate_callback(struct rpc_clnt *clnt,
 void
 rpc_clnt_swap_deactivate(struct rpc_clnt *clnt)
 {
+	while (clnt != clnt->cl_parent)
+		clnt = clnt->cl_parent;
 	if (atomic_dec_if_positive(&clnt->cl_swapper) == 0)
 		rpc_clnt_iterate_for_each_xprt(clnt,
 				rpc_clnt_swap_deactivate_callback, NULL);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux