]> 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)
commit828f5473f41071f4d6d58ac788e396c6ee1f385b
tree66f3e447de5bc9efc02a7366145ba7730ed49c62
parent327322b7ba2aac4374a0bcfd92bc673d52e3480c
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