]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nfsd: move nfsd4_cstate_assign_replay() earlier in open handling.
authorNeilBrown <neilb@suse.de>
Mon, 8 Apr 2024 02:09:16 +0000 (12:09 +1000)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 6 May 2024 13:07:15 +0000 (09:07 -0400)
Rather than taking the rp_mutex (via nfsd4_cstate_assign_replay) in
nfsd4_cleanup_open_state() (which seems counter-intuitive), take it and
assign rp_owner as soon as possible - in nfsd4_process_open1().

This will support a future change when nfsd4_cstate_assign_replay() might
fail.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4state.c

index 65225b3d1d93c9e0d3e1d6fc9a9a2cc09ecf7bbc..43bdff49aa03b7ea1af040076a6d29650a1c7f98 100644 (file)
@@ -5346,6 +5346,7 @@ nfsd4_process_open1(struct nfsd4_compound_state *cstate,
        open->op_openowner = oo;
        if (!oo)
                return nfserr_jukebox;
+       nfsd4_cstate_assign_replay(cstate, &oo->oo_owner);
        status = nfsd4_check_seqid(cstate, &oo->oo_owner, open->op_seqid);
        if (status)
                return status;
@@ -6120,12 +6121,8 @@ out:
 void nfsd4_cleanup_open_state(struct nfsd4_compound_state *cstate,
                              struct nfsd4_open *open)
 {
-       if (open->op_openowner) {
-               struct nfs4_stateowner *so = &open->op_openowner->oo_owner;
-
-               nfsd4_cstate_assign_replay(cstate, so);
-               nfs4_put_stateowner(so);
-       }
+       if (open->op_openowner)
+               nfs4_put_stateowner(&open->op_openowner->oo_owner);
        if (open->op_file)
                kmem_cache_free(file_slab, open->op_file);
        if (open->op_stp)