diff options
author | J. Bruce Fields <bfields@citi.umich.edu> | 2006-06-30 04:56:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-30 14:25:41 -0400 |
commit | 5c04c46aec16b3267d8fe03af886f2d41e448cd0 (patch) | |
tree | c46f4e70423f4f37f73f9e875a7059c0ca2ccf3f | |
parent | e142ede8e064cb1ae9c2bfb17f36ab145b95ccd2 (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.c | 2 | ||||
-rw-r--r-- | include/linux/sunrpc/svc.h | 4 | ||||
-rw-r--r-- | net/sunrpc/svc.c | 2 |
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); |