splice: __generic_file_splice_read: fix read/truncate race
authorJens Axboe <jens.axboe@oracle.com>
Thu, 7 Jun 2007 07:39:42 +0000 (09:39 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Fri, 8 Jun 2007 06:34:11 +0000 (08:34 +0200)
commit620a324b744a7d66c3c45a83042f8e7fc9fc5a04
tree07bf593206a2f38a28ba97811572d036c32b7927
parent475ecade683566b19ebb84972de864039ac5fce3
splice: __generic_file_splice_read: fix read/truncate race

Original patch and description from Neil Brown <neilb@suse.de>,
merged and adapted to splice branch by me. Neils text follows:

__generic_file_splice_read() currently samples the i_size at the start
and doesn't do so again unless it needs to call ->readpage to load
a page.  After ->readpage it has to re-sample i_size as a truncate
may have caused that page to be filled with zeros, and the read()
call should not see these.

However there are other activities that might cause ->readpage to be
called on a page between the time that __generic_file_splice_read()
samples i_size and when it finds that it has an uptodate page. These
include at least read-ahead and possibly another thread performing a
read

So we must sample i_size *after* it has an uptodate page.  Thus the
current sampling at the start and after a read can be replaced with a
sampling before page addition into spd.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
fs/splice.c