]> git.baikalelectronics.ru Git - kernel.git/commit
vfs: Add page_cache_seek_hole_data helper
authorAndreas Gruenbacher <agruenba@redhat.com>
Thu, 29 Jun 2017 18:43:20 +0000 (11:43 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 3 Jul 2017 05:46:13 +0000 (22:46 -0700)
commit72b07984814bcd77d440c498bdc5377fd1765768
tree66f3e447de5bc9efc02a7366145ba7730ed49c62
parenta3d60b725879f90160840dc8c4a33c0740cb5830
vfs: Add page_cache_seek_hole_data helper

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: Andreas Gruenbacher <agruenba@redhat.com>
[hch: dropped the export]
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/buffer.c
include/linux/buffer_head.h