• Jens Axboe's avatar
    splice: __generic_file_splice_read: fix read/truncate race · 620a324b
    Jens Axboe authored
    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: default avatarJens Axboe <jens.axboe@oracle.com>
    620a324b
splice.c 35.1 KB