| From 67fad106a219e083c91c79695bd1807dde1bf7b9 Mon Sep 17 00:00:00 2001 |
| From: Jeff Layton <jlayton@redhat.com> |
| Date: Wed, 12 Dec 2012 11:38:44 -0500 |
| Subject: nfs: don't zero out the rest of the page if we hit the EOF on a DIO READ |
| |
| From: Jeff Layton <jlayton@redhat.com> |
| |
| commit 67fad106a219e083c91c79695bd1807dde1bf7b9 upstream. |
| |
| Eryu provided a test program that would segfault when attempting to read |
| past the EOF on file that was opened O_DIRECT. The buffer given to the |
| read() call was on the stack, and when he attempted to read past it it |
| would scribble over the rest of the stack page. |
| |
| If we hit the end of the file on a DIO READ request, then we don't want |
| to zero out the rest of the buffer. These aren't pagecache pages after |
| all, and there's no guarantee that the buffers that were passed in |
| represent entire pages. |
| |
| Reported-by: Eryu Guan <eguan@redhat.com> |
| Cc: Fred Isaman <iisaman@netapp.com> |
| Signed-off-by: Jeff Layton <jlayton@redhat.com> |
| Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfs/direct.c | 8 -------- |
| 1 file changed, 8 deletions(-) |
| |
| --- a/fs/nfs/direct.c |
| +++ b/fs/nfs/direct.c |
| @@ -266,14 +266,6 @@ static void nfs_direct_read_completion(s |
| struct nfs_page *req = nfs_list_entry(hdr->pages.next); |
| struct page *page = req->wb_page; |
| |
| - if (test_bit(NFS_IOHDR_EOF, &hdr->flags)) { |
| - if (bytes > hdr->good_bytes) |
| - zero_user(page, 0, PAGE_SIZE); |
| - else if (hdr->good_bytes - bytes < PAGE_SIZE) |
| - zero_user_segment(page, |
| - hdr->good_bytes & ~PAGE_MASK, |
| - PAGE_SIZE); |
| - } |
| if (!PageCompound(page)) { |
| if (test_bit(NFS_IOHDR_ERROR, &hdr->flags)) { |
| if (bytes < hdr->good_bytes) |