nfsd41: expand solo sequence check
Andy Adamson [Thu, 27 Aug 2009 16:07:40 +0000 (12:07 -0400)]
Compounds consisting of only a sequence operation don't need any
additional caching beyond the sequence information we store in the slot
entry.  Fix nfsd4_is_solo_sequence to identify this case correctly.

The additional check for a failed sequence in nfsd4_store_cache_entry()
is redundant, since the nfsd4_is_solo_sequence call lower down catches
this case.

The final ce_cachethis set in nfsd4_sequence is also redundant.

Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>

fs/nfsd/nfs4state.c
include/linux/nfsd/xdr4.h

index 5f634d2..b44a2cf 100644 (file)
@@ -991,16 +991,10 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
 {
        struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry;
        struct svc_rqst *rqstp = resp->rqstp;
-       struct nfsd4_compoundargs *args = rqstp->rq_argp;
-       struct nfsd4_op *op = &args->ops[resp->opcnt];
        struct kvec *resv = &rqstp->rq_res.head[0];
 
        dprintk("--> %s entry %p\n", __func__, entry);
 
-       /* Don't cache a failed OP_SEQUENCE. */
-       if (resp->opcnt == 1 && op->opnum == OP_SEQUENCE && resp->cstate.status)
-               return;
-
        nfsd4_release_respages(entry->ce_respages, entry->ce_resused);
        entry->ce_opcnt = resp->opcnt;
        entry->ce_status = resp->cstate.status;
@@ -1490,9 +1484,6 @@ nfsd4_sequence(struct svc_rqst *rqstp,
        slot->sl_inuse = true;
        slot->sl_seqid = seq->seqid;
        slot->sl_cache_entry.ce_cachethis = seq->cachethis;
-       /* Always set the cache entry cachethis for solo sequence */
-       if (nfsd4_is_solo_sequence(resp))
-               slot->sl_cache_entry.ce_cachethis = 1;
 
        cstate->slot = slot;
        cstate->session = session;
index 5e4beb0..3f71660 100644 (file)
@@ -467,7 +467,7 @@ struct nfsd4_compoundres {
 static inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp)
 {
        struct nfsd4_compoundargs *args = resp->rqstp->rq_argp;
-       return args->opcnt == 1;
+       return resp->opcnt == 1 && args->ops[0].opnum == OP_SEQUENCE;
 }
 
 static inline bool nfsd4_not_cached(struct nfsd4_compoundres *resp)