lkml.org 
[lkml]   [2009]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 24/49] ext4: fix for fiemap last-block test
    Date
    From: Eric Sandeen <sandeen@redhat.com>

    Carl Henrik Lunde reported and debugged this; the test for the
    last allocated block was comparing bytes to blocks in this test:

    if (logical + length - 1 == EXT_MAX_BLOCK ||
    ext4_ext_next_allocated_block(path) == EXT_MAX_BLOCK)
    flags |= FIEMAP_EXTENT_LAST;

    so any extent which ended right at 4G was stopping the extent
    walk. Just replacing these values with the extent block &
    length should fix it.

    Also give blksize_bits a saner type, and reverse the order
    of the tests to make the more likely case tested first.

    Signed-off-by: Eric Sandeen <sandeen@redhat.com>
    Reported-by: Carl Henrik Lunde <chlunde@ping.uio.no>
    Tested-by: Carl Henrik Lunde <chlunde@ping.uio.no>
    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
    ---
    fs/ext4/extents.c | 6 +++---
    1 files changed, 3 insertions(+), 3 deletions(-)

    diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
    index ea5c476..5f72952 100644
    --- a/fs/ext4/extents.c
    +++ b/fs/ext4/extents.c
    @@ -3196,7 +3196,7 @@ static int ext4_ext_fiemap_cb(struct inode *inode, struct ext4_ext_path *path,
    void *data)
    {
    struct fiemap_extent_info *fieinfo = data;
    - unsigned long blksize_bits = inode->i_sb->s_blocksize_bits;
    + unsigned char blksize_bits = inode->i_sb->s_blocksize_bits;
    __u64 logical;
    __u64 physical;
    __u64 length;
    @@ -3243,8 +3243,8 @@ static int ext4_ext_fiemap_cb(struct inode *inode, struct ext4_ext_path *path,
    *
    * XXX this might miss a single-block extent at EXT_MAX_BLOCK
    */
    - if (logical + length - 1 == EXT_MAX_BLOCK ||
    - ext4_ext_next_allocated_block(path) == EXT_MAX_BLOCK)
    + if (ext4_ext_next_allocated_block(path) == EXT_MAX_BLOCK ||
    + newex->ec_block + newex->ec_len - 1 == EXT_MAX_BLOCK)
    flags |= FIEMAP_EXTENT_LAST;

    error = fiemap_fill_next_extent(fieinfo, logical, physical,
    --
    1.6.3.2.1.gb9f7d.dirty


    \
     
     \ /
      Last update: 2009-06-08 22:03    [W:0.025 / U:91.772 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site