lkml.org 
[lkml]   [2017]   [Nov]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 041/139] ext4: fix SEEK_HOLE/SEEK_DATA for blocksize < pagesize
    Date
    From: Jan Kara <jack@suse.cz>

    commit fcf5ea10992fbac3c7473a1db33d56a139333cd1 upstream.

    ext4_find_unwritten_pgoff() does not properly handle a situation when
    starting index is in the middle of a page and blocksize < pagesize. The
    following command shows the bug on filesystem with 1k blocksize:

    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.

    Fix the problem by neglecting buffers in a page before starting offset.

    Reported-by: Andreas Gruenbacher <agruenba@redhat.com>
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Jan Kara <jack@suse.cz>
    CC: stable@vger.kernel.org # 3.8+
    Signed-off-by: Willy Tarreau <w@1wt.eu>
    ---
    fs/ext4/file.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/fs/ext4/file.c b/fs/ext4/file.c
    index ec9770f..d490d6e 100644
    --- a/fs/ext4/file.c
    +++ b/fs/ext4/file.c
    @@ -382,6 +382,8 @@ static int ext4_find_unwritten_pgoff(struct inode *inode,
    lastoff = page_offset(page);
    bh = head = page_buffers(page);
    do {
    + if (lastoff + bh->b_size <= startoff)
    + goto next;
    if (buffer_uptodate(bh) ||
    buffer_unwritten(bh)) {
    if (whence == SEEK_DATA)
    @@ -396,6 +398,7 @@ static int ext4_find_unwritten_pgoff(struct inode *inode,
    unlock_page(page);
    goto out;
    }
    +next:
    lastoff += bh->b_size;
    bh = bh->b_this_page;
    } while (bh != head);
    --
    2.8.0.rc2.1.gbe9624a
    \
     
     \ /
      Last update: 2017-11-01 22:25    [W:4.192 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site