Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-2.6-block.git] / fs / nfsd / nfs3proc.c
index 9eb8086ea841e6a787adc94f90b9cf0816696011..8f933e84cec18221f4645b769ea9d1914bc3e627 100644 (file)
@@ -463,8 +463,19 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
                                        &resp->common, nfs3svc_encode_entry);
        memcpy(resp->verf, argp->verf, 8);
        resp->count = resp->buffer - argp->buffer;
-       if (resp->offset)
-               xdr_encode_hyper(resp->offset, argp->cookie);
+       if (resp->offset) {
+               loff_t offset = argp->cookie;
+
+               if (unlikely(resp->offset1)) {
+                       /* we ended up with offset on a page boundary */
+                       *resp->offset = htonl(offset >> 32);
+                       *resp->offset1 = htonl(offset & 0xffffffff);
+                       resp->offset1 = NULL;
+               } else {
+                       xdr_encode_hyper(resp->offset, offset);
+               }
+               resp->offset = NULL;
+       }
 
        RETURN_STATUS(nfserr);
 }
@@ -533,6 +544,7 @@ nfsd3_proc_readdirplus(struct svc_rqst *rqstp)
                } else {
                        xdr_encode_hyper(resp->offset, offset);
                }
+               resp->offset = NULL;
        }
 
        RETURN_STATUS(nfserr);
@@ -576,7 +588,7 @@ nfsd3_proc_fsinfo(struct svc_rqst *rqstp)
        resp->f_wtmax  = max_blocksize;
        resp->f_wtpref = max_blocksize;
        resp->f_wtmult = PAGE_SIZE;
-       resp->f_dtpref = PAGE_SIZE;
+       resp->f_dtpref = max_blocksize;
        resp->f_maxfilesize = ~(u32) 0;
        resp->f_properties = NFS3_FSF_DEFAULT;