nfs: Initialize cb_sequenceres information before validate_seqid()
authorKinglong Mee <kinglongmee@gmail.com>
Tue, 2 Jun 2015 10:59:01 +0000 (18:59 +0800)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 12 Jun 2015 01:09:06 +0000 (21:09 -0400)
For a cb_layoutrecall replay, nfsd got CB_SEQUENCE status of zero,
but all informations of cb_sequenceres are zero too !!!

validate_seqid() return NFS4ERR_RETRY_UNCACHED_REP for a replay,
and skip the initlize cb_sequenceres.

Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/callback_proc.c

index 7e9653aae5d8383bfb051579142c6441e6317ea6..17a5c571a006be4b03d3511268e80890958dd730 100644 (file)
@@ -445,6 +445,13 @@ __be32 nfs4_callback_sequence(struct cb_sequenceargs *args,
                goto out;
        }
 
+       memcpy(&res->csr_sessionid, &args->csa_sessionid,
+              sizeof(res->csr_sessionid));
+       res->csr_sequenceid = args->csa_sequenceid;
+       res->csr_slotid = args->csa_slotid;
+       res->csr_highestslotid = NFS41_BC_MAX_CALLBACKS - 1;
+       res->csr_target_highestslotid = NFS41_BC_MAX_CALLBACKS - 1;
+
        status = validate_seqid(tbl, args);
        spin_unlock(&tbl->slot_tbl_lock);
        if (status)
@@ -462,13 +469,6 @@ __be32 nfs4_callback_sequence(struct cb_sequenceargs *args,
                goto out;
        }
 
-       memcpy(&res->csr_sessionid, &args->csa_sessionid,
-              sizeof(res->csr_sessionid));
-       res->csr_sequenceid = args->csa_sequenceid;
-       res->csr_slotid = args->csa_slotid;
-       res->csr_highestslotid = NFS41_BC_MAX_CALLBACKS - 1;
-       res->csr_target_highestslotid = NFS41_BC_MAX_CALLBACKS - 1;
-
        /*
         * RFC5661 20.9.3
         * If CB_SEQUENCE returns an error, then the state of the slot