After setting NFS4CLNT_RUN_MANAGER we need a full memory barrier before it is safe to call wake_up_var(). As that setting is "atomic" it is sufficient to use smp_mb__after_atomic(). Signed-off-by: NeilBrown <neilb@xxxxxxx> --- fs/nfs/nfs4proc.c | 1 + fs/nfs/nfs4state.c | 1 + 2 files changed, 2 insertions(+) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 405f17e6e0b4..37c8aa1f3e1b 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -10847,6 +10847,7 @@ static void nfs4_disable_swap(struct inode *inode) set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state); clear_bit(NFS4CLNT_MANAGER_AVAILABLE, &clp->cl_state); + smp_mb__after_atomic(); wake_up_var(&clp->cl_state); } diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 556b521f17eb..189d7b57cb74 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -1207,6 +1207,7 @@ void nfs4_schedule_state_manager(struct nfs_client *clp) swapon = !test_and_set_bit(NFS4CLNT_MANAGER_AVAILABLE, &clp->cl_state); if (!swapon) { + smp_mb__after_atomic(); wake_up_var(&clp->cl_state); return; } -- 2.47.0