diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 423e1ba070442797f65ce9da1ac0ebdbf16b9306..e170030d45da7f5b40c3495fd8a107d3a2eefe73 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -837,7 +837,7 @@ nfsd_vfs_read(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, if (ra && ra->p_set) file->f_ra = ra->p_ra; - if (file->f_op->sendfile) { + if (file->f_op->sendfile && rqstp->rq_sendfile_ok) { svc_pushback_unused_pages(rqstp); err = file->f_op->sendfile(file, &offset, *count, nfsd_read_actor, rqstp); diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 50356438454525d46b951e3fde65058478bf8017..7b27c09b56046e19bef6e499922f628bec5c0a6e 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -159,7 +159,9 @@ struct svc_rqst { * determine what device number * to report (real or virtual) */ - + int rq_sendfile_ok; /* turned off in gss privacy + * to prevent encrypting page + * cache pages */ wait_queue_head_t rq_wait; /* synchronization */ }; diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index b08419e1fc68456c545575a2a8505923729161ed..fb168a30fd3fbcb589e149b9a1e7d5fff8ba5306 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c @@ -281,6 +281,8 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp) rqstp->rq_res.page_len = 0; rqstp->rq_res.buflen = PAGE_SIZE; rqstp->rq_res.tail[0].iov_len = 0; + /* Will be turned off only in gss privacy case: */ + rqstp->rq_sendfile_ok = 1; /* tcp needs a space for the record length... */ if (rqstp->rq_prot == IPPROTO_TCP) svc_putu32(resv, 0);