kNFSd - Allow nfsv3 readdir to return more than one page of directory entries.
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): 20040224111006.26176.patches@notabene
PATCH 1/1 kNFSd - Allow nfsv3 readdir to return more than one page of directory entries.
This requires checking if the entry will fit in the current page and, if it doesn't, encoding it into the next page, and then copying it back to lie across the boundary between two pages.
From: Bruce Allan <[email protected]>
----------- Diffstat output ------------
./fs/nfsd/nfs3proc.c | 30 +++++--- ./fs/nfsd/nfs3xdr.c | 190 ++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 172 insertions(+), 48 deletions(-)
fs/nfsd/nfs3proc.c renamed from fs/nfsd/nfs3proc.c~current~ +22 -8
@@ -456,29 +456,43 @@ static int nfsd3_proc_readdirplus(struct svc_rqst *rqstp, struct nfsd3_readdirargs *argp, struct nfsd3_readdirres *resp) { - int nfserr, count; + int nfserr, count = 0;loff_t offset; +int i; +caddr_t page_addr =NULL ;dprintk ("nfsd: READDIR+(3) %s %d bytes at %d\n" ,SVCFH_fmt (&argp->fh), argp->count, (u32 ) argp->cookie); -/* Make sure we've room for the NULL ptr & eof flag, and shrink to -* client read size */ - count = (argp->count >>2 ) -2 ; +/* Convert byte count to number of words (i.e. >> 2), +* and reserve room for the NULL ptr & eof flag (-2 words) */ + resp->count = (argp->count >>2 ) -2 ;/* Read directory and encode entries on the fly */ fh_copy (&resp->fh, &argp->fh); - resp->buflen = count; resp->common.err = nfs_ok; resp->buffer = argp->buffer; + resp->buflen = resp->count; resp->rqstp = rqstp; offset = argp->cookie; - nfserr =nfsd_readdir (rqstp, &resp->fh, &offset, - &resp->common, nfs3svc_encode_entry_plus); + nfserr =nfsd_readdir (rqstp, &resp->fh, + &offset, + &resp->common, + nfs3svc_encode_entry_plus);memcpy (resp->verf, argp->verf,8 ); - resp->count = resp->buffer - argp->buffer; +for (i=1 ; i<rqstp->rq_resused ; i++) { + page_addr =page_address (rqstp->rq_respages[i]); + +if (((caddr_t )resp->buffer >= page_addr) && + ((caddr_t )resp->buffer < page_addr +PAGE_SIZE )) { + count += (caddr_t )resp->buffer - page_addr; +break ; + } + count +=PAGE_SIZE ; + } + resp->count = count >>2 ;if (resp->offset)xdr_encode_hyper (resp->offset, offset);
fs/nfsd/nfs3xdr.c renamed from fs/nfsd/nfs3xdr.c~current~ +150 -40
236 lines not on this page · raw message
-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now. Build and deploy apps & Web services for Linux with a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs