From: Andy Adamson <andros@xxxxxxxxxx> Change from page based to memory based NFSv4.1 DRC. We need to allocate memory for the session DRC in the CREATE_SESSION operation because of the guarantee to the client that the memory resource is available for caching responses. In preparation to remove struct nfsd4_cache_entry, add static storage to struct nfsd4_slot to hold up to NFSD_SLOT_CACH_SIZE of all encoded operation data past the encoded sequence operation. Signed-off-by: Andy Adamson <andros@xxxxxxxxxx> --- fs/nfsd/nfs4state.c | 9 +++++++++ fs/nfsd/nfs4xdr.c | 1 + include/linux/nfsd/state.h | 2 ++ include/linux/nfsd/xdr4.h | 1 + 4 files changed, 13 insertions(+), 0 deletions(-) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 187e1da..fecee33 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -1066,6 +1066,7 @@ nfsd4_copy_pages(struct page **topages, struct page **frompages, short count) void nfsd4_store_cache_entry(struct nfsd4_compoundres *resp) { + struct nfsd4_slot *slot = resp->cstate.slot; struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry; struct svc_rqst *rqstp = resp->rqstp; struct nfsd4_compoundargs *args = rqstp->rq_argp; @@ -1090,10 +1091,14 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp) if (nfsd4_not_cached(resp)) { entry->ce_resused = 0; entry->ce_rpchdrlen = 0; + slot->sl_datalen = 0; dprintk("%s Just cache SEQUENCE. ce_cachethis %d\n", __func__, resp->cstate.slot->sl_cache_entry.ce_cachethis); return; } + slot->sl_datalen = (char *)resp->p - (char *)resp->cstate.datap; + memcpy(slot->sl_data, resp->cstate.datap, slot->sl_datalen); + entry->ce_resused = rqstp->rq_resused; if (entry->ce_resused > NFSD_PAGES_PER_SLOT + 1) entry->ce_resused = NFSD_PAGES_PER_SLOT + 1; @@ -1141,6 +1146,7 @@ __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp, struct nfsd4_sequence *seq) { + struct nfsd4_slot *slot = resp->cstate.slot; struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry; __be32 status; @@ -1161,6 +1167,9 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp, return nfs_ok; } + /* The sequence operation has been encoded, cstate->datap set. */ + memcpy(resp->cstate.datap, slot->sl_data, slot->sl_datalen); + if (!nfsd41_copy_replay_data(resp, entry)) { /* * Not enough room to use the replay rpc header, send the diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 238612e..41ac385 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -3111,6 +3111,7 @@ nfsd4_encode_sequence(struct nfsd4_compoundres *resp, int nfserr, WRITE32(0); ADJUST_ARGS(); + resp->cstate.datap = p; /* DRC cache data pointer */ return 0; } diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h index 3580d55..362c684 100644 --- a/include/linux/nfsd/state.h +++ b/include/linux/nfsd/state.h @@ -126,6 +126,8 @@ struct nfsd4_cache_entry { struct nfsd4_slot { bool sl_inuse; u32 sl_seqid; + u32 sl_datalen; + char sl_data[NFSD_SLOT_CACHE_SIZE]; struct nfsd4_cache_entry sl_cache_entry; }; diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h index ac00985..52589ba 100644 --- a/include/linux/nfsd/xdr4.h +++ b/include/linux/nfsd/xdr4.h @@ -52,6 +52,7 @@ struct nfsd4_compound_state { struct nfsd4_session *session; struct nfsd4_slot *slot; __be32 *statp; + __be32 *datap; size_t iovlen; u32 minorversion; u32 status; -- 1.5.4.3 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html