Re: [PATCH] nfs: don't zero out the rest of the page if we hit the EOF on a DIO READ

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2012-12-12 at 11:38 -0500, Jeff Layton wrote:
> 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.
> 
> Cc: <stable@xxxxxxxxxxxxxxx> # v3.5+
> Cc: Fred Isaman <iisaman@xxxxxxxxxx>
> Reported-by: Eryu Guan <eguan@xxxxxxxxxx>
> Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
> ---
>  fs/nfs/direct.c | 8 --------
>  1 file changed, 8 deletions(-)
> 
> diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
> index cae26cb..594f4e7 100644
> --- a/fs/nfs/direct.c
> +++ b/fs/nfs/direct.c
> @@ -266,14 +266,6 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
>  		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)

I'm not saying that should be in the same patch, but it looks to me as
if we need to respect the EOF boundary for the page dirtying code too.

-- 
Trond Myklebust
Linux NFS client maintainer

NetApp
Trond.Myklebust@xxxxxxxxxx
www.netapp.com
��.n��������+%������w��{.n�����{��w���jg��������ݢj����G�������j:+v���w�m������w�������h�����٥



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux