• Andreas Gruenbacher's avatar
    vfs: Add page_cache_seek_hole_data helper · 334fd34d
    Andreas Gruenbacher authored
    Both ext4 and xfs implement seeking for the next hole or piece of data
    in unwritten extents by scanning the page cache, and both versions share
    the same bug when iterating the buffers of a page: the start offset into
    the page isn't taken into account, so when a page fits more than two
    filesystem blocks, things will go wrong.  For example, on a filesystem
    with a block size of 1k, the following command will fail:
    
      xfs_io -f -c "falloc 0 4k" \
                -c "pwrite 1k 1k" \
                -c "pwrite 3k 1k" \
                -c "seek -a -r 0" foo
    
    In this example, neither lseek(fd, 1024, SEEK_HOLE) nor lseek(fd, 2048,
    SEEK_DATA) will return the correct result.
    
    Introduce a generic vfs helper for seeking in the page cache that gets
    this right.  The next commits will replace the filesystem specific
    implementations.
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    [hch: dropped the export]
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    334fd34d
buffer.c 94.3 KB