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>
        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;
 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)