• Jan Kara's avatar
    xfs: Fix missed holes in SEEK_HOLE implementation · 5375023a
    Jan Kara authored
    XFS SEEK_HOLE implementation could miss a hole in an unwritten extent as
    can be seen by the following command:
    
    xfs_io -c "falloc 0 256k" -c "pwrite 0 56k" -c "pwrite 128k 8k"
           -c "seek -h 0" file
    wrote 57344/57344 bytes at offset 0
    56 KiB, 14 ops; 0.0000 sec (49.312 MiB/sec and 12623.9856 ops/sec)
    wrote 8192/8192 bytes at offset 131072
    8 KiB, 2 ops; 0.0000 sec (70.383 MiB/sec and 18018.0180 ops/sec)
    Whence	Result
    HOLE	139264
    
    Where we can see that hole at offset 56k was just ignored by SEEK_HOLE
    implementation. The bug is in xfs_find_get_desired_pgoff() which does
    not properly detect the case when pages are not contiguous.
    
    Fix the problem by properly detecting when found page has larger offset
    than expected.
    
    CC: stable@vger.kernel.org
    Fixes: d126d43fSigned-off-by: default avatarJan Kara <jack@suse.cz>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    5375023a
xfs_file.c 39.3 KB