Re: Patch "CIFS: Fix splice read for non-cached files" has been added to the 4.4-stable tree

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

 



On Wed, Mar 08, 2017 at 11:27:22AM +0100, gregkh@xxxxxxxxxxxxxxxxxxx wrote:
> 
> This is a note to let you know that I've just added the patch titled
> 
>     CIFS: Fix splice read for non-cached files
> 
> to the 4.4-stable tree which can be found at:
>     http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
> 
> The filename of the patch is:
>      cifs-fix-splice-read-for-non-cached-files.patch
> and it can be found in the queue-4.4 subdirectory.
> 
> If you, or anyone else, feels it should not be added to the stable tree,
> please let <stable@xxxxxxxxxxxxxxx> know about it.

Oops, nope, this breaks the build on 4.4-stable.  If it belongs there,
please send a properly backported version to me.

thanks,

greg k-h


> >From 9c25702cee1405099f982894c865c163de7909a8 Mon Sep 17 00:00:00 2001
> From: Pavel Shilovsky <pshilov@xxxxxxxxxxxxx>
> Date: Thu, 19 Jan 2017 13:53:15 -0800
> Subject: CIFS: Fix splice read for non-cached files
> 
> From: Pavel Shilovsky <pshilov@xxxxxxxxxxxxx>
> 
> commit 9c25702cee1405099f982894c865c163de7909a8 upstream.
> 
> Currently we call copy_page_to_iter() for uncached reading into a pipe.
> This is wrong because it treats pages as VFS cache pages and copies references
> rather than actual data. When we are trying to read from the pipe we end up
> calling page_cache_pipe_buf_confirm() which returns -ENODATA. This error
> is translated into 0 which is returned to a user.
> 
> This issue is reproduced by running xfs-tests suite (generic test #249)
> against mount points with "cache=none". Fix it by mapping pages manually
> and calling copy_to_iter() that copies data into the pipe.
> 
> Signed-off-by: Pavel Shilovsky <pshilov@xxxxxxxxxxxxx>
> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
> 
> ---
>  fs/cifs/file.c |   10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -2840,7 +2840,15 @@ cifs_readdata_to_iov(struct cifs_readdat
>  	for (i = 0; i < rdata->nr_pages; i++) {
>  		struct page *page = rdata->pages[i];
>  		size_t copy = min_t(size_t, remaining, PAGE_SIZE);
> -		size_t written = copy_page_to_iter(page, 0, copy, iter);
> +		size_t written;
> +
> +		if (unlikely(iter->type & ITER_PIPE)) {
> +			void *addr = kmap_atomic(page);
> +
> +			written = copy_to_iter(addr, copy, iter);
> +			kunmap_atomic(addr);
> +		} else
> +			written = copy_page_to_iter(page, 0, copy, iter);
>  		remaining -= written;
>  		if (written < copy && iov_iter_count(iter) > 0)
>  			break;
> 
> 
> Patches currently in stable-queue which might be from pshilov@xxxxxxxxxxxxx are
> 
> queue-4.4/cifs-fix-splice-read-for-non-cached-files.patch



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]