nfsd41: non-page DRC for solo sequence responses
A session inactivity time compound (lease renewal) or a compound where the sequence operation has sa_cachethis set to FALSE do not require any pages to be held in the v4.1 DRC. This is because struct nfsd4_slot is already caching the session information. Add logic to the nfs41 server to not cache response pages for solo sequence responses. Return nfserr_replay_uncached_rep on the operation following the sequence operation when sa_cachethis is FALSE. Signed-off-by: Andy Adamson <andros@netapp.com> Signed-off-by: Benny Halevy <bhalevy@panasas.com> [nfsd41: use cstate session in nfsd4_replay_cache_entry] [nfsd41: rename nfsd4_no_page_in_cache] [nfsd41 rename nfsd4_enc_no_page_replay] [nfsd41 nfsd4_is_solo_sequence] [nfsd41 change nfsd4_not_cached return] Signed-off-by: Andy Adamson <andros@netapp.com> [changed return type to bool] Signed-off-by: Benny Halevy <bhalevy@panasas.com> [nfsd41 drop parens in nfsd4_is_solo_sequence call] Signed-off-by: Andy Adamson <andros@netapp.com> [changed "== 0" to "!"] Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
committed by
J. Bruce Fields
parent
38eb76a54d
commit
bf864a31d5
@@ -827,6 +827,34 @@ static struct nfsd4_operation nfsd4_ops[];
|
||||
|
||||
static const char *nfsd4_op_name(unsigned opnum);
|
||||
|
||||
/*
|
||||
* This is a replay of a compound for which no cache entry pages
|
||||
* were used. Encode the sequence operation, and if cachethis is FALSE
|
||||
* encode the uncache rep error on the next operation.
|
||||
*/
|
||||
static __be32
|
||||
nfsd4_enc_uncached_replay(struct nfsd4_compoundargs *args,
|
||||
struct nfsd4_compoundres *resp)
|
||||
{
|
||||
struct nfsd4_op *op;
|
||||
|
||||
dprintk("--> %s resp->opcnt %d ce_cachethis %u \n", __func__,
|
||||
resp->opcnt, resp->cstate.slot->sl_cache_entry.ce_cachethis);
|
||||
|
||||
/* Encode the replayed sequence operation */
|
||||
BUG_ON(resp->opcnt != 1);
|
||||
op = &args->ops[resp->opcnt - 1];
|
||||
nfsd4_encode_operation(resp, op);
|
||||
|
||||
/*return nfserr_retry_uncached_rep in next operation. */
|
||||
if (resp->cstate.slot->sl_cache_entry.ce_cachethis == 0) {
|
||||
op = &args->ops[resp->opcnt++];
|
||||
op->status = nfserr_retry_uncached_rep;
|
||||
nfsd4_encode_operation(resp, op);
|
||||
}
|
||||
return op->status;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enforce NFSv4.1 COMPOUND ordering rules.
|
||||
*
|
||||
@@ -895,7 +923,6 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
|
||||
dprintk("nfsv4 compound op #%d/%d: %d (%s)\n",
|
||||
resp->opcnt, args->opcnt, op->opnum,
|
||||
nfsd4_op_name(op->opnum));
|
||||
|
||||
/*
|
||||
* The XDR decode routines may have pre-set op->status;
|
||||
* for example, if there is a miscellaneous XDR error
|
||||
@@ -939,7 +966,10 @@ encode_op:
|
||||
/* Only from SEQUENCE or CREATE_SESSION */
|
||||
if (resp->cstate.status == nfserr_replay_cache) {
|
||||
dprintk("%s NFS4.1 replay from cache\n", __func__);
|
||||
status = op->status;
|
||||
if (nfsd4_not_cached(resp))
|
||||
status = nfsd4_enc_uncached_replay(args, resp);
|
||||
else
|
||||
status = op->status;
|
||||
goto out;
|
||||
}
|
||||
if (op->status == nfserr_replay_me) {
|
||||
|
Reference in New Issue
Block a user