nfsd: nfs4_preprocess_seqid_op should only set *stpp on success
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 30 Jun 2014 15:48:34 +0000 (11:48 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 8 Jul 2014 21:14:33 +0000 (17:14 -0400)
Not technically a bugfix, since nothing tries to use the return pointer
if this function doesn't return success, but it could be a problem
with some coming changes.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Jeff Layton <jlayton@primarydata.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index 29788fd..71c442f 100644 (file)
@@ -3953,6 +3953,7 @@ nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
 {
        __be32 status;
        struct nfs4_stid *s;
+       struct nfs4_ol_stateid *stp = NULL;
 
        dprintk("NFSD: %s: seqid=%d stateid = " STATEID_FMT "\n", __func__,
                seqid, STATEID_VAL(stateid));
@@ -3962,11 +3963,14 @@ nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
                                      cstate->minorversion, nn);
        if (status)
                return status;
-       *stpp = openlockstateid(s);
+       stp = openlockstateid(s);
        if (!nfsd4_has_session(cstate))
-               cstate->replay_owner = (*stpp)->st_stateowner;
+               cstate->replay_owner = stp->st_stateowner;
 
-       return nfs4_seqid_op_checks(cstate, stateid, seqid, *stpp);
+       status = nfs4_seqid_op_checks(cstate, stateid, seqid, stp);
+       if (!status)
+               *stpp = stp;
+       return status;
 }
 
 static __be32 nfs4_preprocess_confirmed_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,