aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2006-06-30 04:56:19 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-30 14:25:41 -0400
commit5c04c46aec16b3267d8fe03af886f2d41e448cd0 (patch)
treec46f4e70423f4f37f73f9e875a7059c0ca2ccf3f
parente142ede8e064cb1ae9c2bfb17f36ab145b95ccd2 (diff)
[PATCH] knfsd: nfsd: mark rqstp to prevent use of sendfile in privacy case
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 <bfields@citi.umich.edu> Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/nfsd/vfs.c2
-rw-r--r--include/linux/sunrpc/svc.h4
-rw-r--r--net/sunrpc/svc.c2
3 files changed, 6 insertions, 2 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index 423e1ba07044..e170030d45da 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,
837 if (ra && ra->p_set) 837 if (ra && ra->p_set)
838 file->f_ra = ra->p_ra; 838 file->f_ra = ra->p_ra;
839 839
840 if (file->f_op->sendfile) { 840 if (file->f_op->sendfile && rqstp->rq_sendfile_ok) {
841 svc_pushback_unused_pages(rqstp); 841 svc_pushback_unused_pages(rqstp);
842 err = file->f_op->sendfile(file, &offset, *count, 842 err = file->f_op->sendfile(file, &offset, *count,
843 nfsd_read_actor, rqstp); 843 nfsd_read_actor, rqstp);
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index 503564384545..7b27c09b5604 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -159,7 +159,9 @@ struct svc_rqst {
159 * determine what device number 159 * determine what device number
160 * to report (real or virtual) 160 * to report (real or virtual)
161 */ 161 */
162 162 int rq_sendfile_ok; /* turned off in gss privacy
163 * to prevent encrypting page
164 * cache pages */
163 wait_queue_head_t rq_wait; /* synchronization */ 165 wait_queue_head_t rq_wait; /* synchronization */
164}; 166};
165 167
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index b08419e1fc68..fb168a30fd3f 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)
281 rqstp->rq_res.page_len = 0; 281 rqstp->rq_res.page_len = 0;
282 rqstp->rq_res.buflen = PAGE_SIZE; 282 rqstp->rq_res.buflen = PAGE_SIZE;
283 rqstp->rq_res.tail[0].iov_len = 0; 283 rqstp->rq_res.tail[0].iov_len = 0;
284 /* Will be turned off only in gss privacy case: */
285 rqstp->rq_sendfile_ok = 1;
284 /* tcp needs a space for the record length... */ 286 /* tcp needs a space for the record length... */
285 if (rqstp->rq_prot == IPPROTO_TCP) 287 if (rqstp->rq_prot == IPPROTO_TCP)
286 svc_putu32(resv, 0); 288 svc_putu32(resv, 0);