]> git.baikalelectronics.ru Git - kernel.git/commitdiff
nfsd: fix race to check ls_layouts
authorBenjamin Coddington <bcodding@redhat.com>
Fri, 27 Jan 2023 16:18:56 +0000 (11:18 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 11 Mar 2023 15:43:49 +0000 (16:43 +0100)
[ Upstream commit fb610c4dbc996415d57d7090957ecddd4fd64fb6 ]

Its possible for __break_lease to find the layout's lease before we've
added the layout to the owner's ls_layouts list.  In that case, setting
ls_recalled = true without actually recalling the layout will cause the
server to never send a recall callback.

Move the check for ls_layouts before setting ls_recalled.

Fixes: 00dd9aef9522 ("nfsd: implement pNFS layout recalls")
Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfsd/nfs4layouts.c

index e12409eca7cc42facf54b4af0d8a636e6bc7fb0e..215362144aece91f4d5eb6b88a6bf5addbb293df 100644 (file)
@@ -322,11 +322,11 @@ nfsd4_recall_file_layout(struct nfs4_layout_stateid *ls)
        if (ls->ls_recalled)
                goto out_unlock;
 
-       ls->ls_recalled = true;
-       atomic_inc(&ls->ls_stid.sc_file->fi_lo_recalls);
        if (list_empty(&ls->ls_layouts))
                goto out_unlock;
 
+       ls->ls_recalled = true;
+       atomic_inc(&ls->ls_stid.sc_file->fi_lo_recalls);
        trace_nfsd_layout_recall(&ls->ls_stid.sc_stateid);
 
        refcount_inc(&ls->ls_stid.sc_count);