splice: fix generic_file_splice_read() race with page invalidation
authorMiklos Szeredi <mszeredi@suse.cz>
Fri, 4 Jul 2008 07:35:17 +0000 (09:35 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Fri, 4 Jul 2008 07:52:14 +0000 (09:52 +0200)
commit32502b8413a77b54b9e19809404109590c32dfb7
treec84b87396be32d529b9902a7261b772b1d919e8b
parent8b3d3567f72aa61d5d6f4ce89d289b154e1ea866
splice: fix generic_file_splice_read() race with page invalidation

If a page was invalidated during splicing from file to a pipe, then
generic_file_splice_read() could return a short or zero count.

This manifested itself in rare I/O errors seen on nfs exported fuse
filesystems.  This is because nfsd uses splice_direct_to_actor() to read
files, and fuse uses invalidate_inode_pages2() to invalidate stale data on
open.

Fix by redoing the page find/create if it was found to be truncated
(invalidated).

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
fs/splice.c