From: J. Bruce Fields Add a rq_sendfile_ok flag to svc_rqst which will be cleared in the privacy case so that the wrapping code will get copies of the read data instead of real page cache pages. This makes life simpler when we encrypt the response. Signed-off-by: J. Bruce Fields Signed-off-by: Neil Brown Signed-off-by: Andrew Morton --- fs/nfsd/vfs.c | 2 +- include/linux/sunrpc/svc.h | 4 +++- net/sunrpc/svc.c | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff -puN fs/nfsd/vfs.c~knfsd-nfsd-mark-rqstp-to-prevent-use-of-sendfile-in-privacy-case fs/nfsd/vfs.c --- a/fs/nfsd/vfs.c~knfsd-nfsd-mark-rqstp-to-prevent-use-of-sendfile-in-privacy-case +++ a/fs/nfsd/vfs.c @@ -837,7 +837,7 @@ nfsd_vfs_read(struct svc_rqst *rqstp, st 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 -puN include/linux/sunrpc/svc.h~knfsd-nfsd-mark-rqstp-to-prevent-use-of-sendfile-in-privacy-case include/linux/sunrpc/svc.h --- a/include/linux/sunrpc/svc.h~knfsd-nfsd-mark-rqstp-to-prevent-use-of-sendfile-in-privacy-case +++ a/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 -puN net/sunrpc/svc.c~knfsd-nfsd-mark-rqstp-to-prevent-use-of-sendfile-in-privacy-case net/sunrpc/svc.c --- a/net/sunrpc/svc.c~knfsd-nfsd-mark-rqstp-to-prevent-use-of-sendfile-in-privacy-case +++ a/net/sunrpc/svc.c @@ -281,6 +281,8 @@ svc_process(struct svc_serv *serv, struc 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); _