Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c04c46a authored by J. Bruce Fields's avatar J. Bruce Fields Committed by Linus Torvalds
Browse files

[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: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e142ede8
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -837,7 +837,7 @@ nfsd_vfs_read(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
	if (ra && ra->p_set)
	if (ra && ra->p_set)
		file->f_ra = ra->p_ra;
		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);
		svc_pushback_unused_pages(rqstp);
		err = file->f_op->sendfile(file, &offset, *count,
		err = file->f_op->sendfile(file, &offset, *count,
						 nfsd_read_actor, rqstp);
						 nfsd_read_actor, rqstp);
+3 −1
Original line number Original line Diff line number Diff line
@@ -159,7 +159,9 @@ struct svc_rqst {
						 * determine what device number
						 * determine what device number
						 * to report (real or virtual)
						 * 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 */
	wait_queue_head_t	rq_wait;	/* synchronization */
};
};


+2 −0
Original line number Original line Diff line number Diff line
@@ -281,6 +281,8 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
	rqstp->rq_res.page_len = 0;
	rqstp->rq_res.page_len = 0;
	rqstp->rq_res.buflen = PAGE_SIZE;
	rqstp->rq_res.buflen = PAGE_SIZE;
	rqstp->rq_res.tail[0].iov_len = 0;
	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... */
	/* tcp needs a space for the record length... */
	if (rqstp->rq_prot == IPPROTO_TCP)
	if (rqstp->rq_prot == IPPROTO_TCP)
		svc_putu32(resv, 0);
		svc_putu32(resv, 0);