lkml.org 
[lkml]   [2008]   [Jan]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 44/49] ext4: fix uniniatilized extent splitting error
    Date
    From: Dmitry Monakhov <dmonakhov@openvz.org>

    Fix bug reported by Dmitry Monakhov caused by lost error code

    Testcase:

    blksize = 0x1000;
    fd = open(argv[1], O_RDWR|O_CREAT, 0700);
    unsigned long long sz = 0x10000000UL;
    /* allocating big blocks chunk */
    syscall(__NR_fallocate, fd, 0, 0UL, sz)
    /* grab all other available filesystem space */
    tfd = open("tmp", O_RDWR|O_CREAT|O_DIRECT, 0700);
    while( write(tfd, buf, 4096) > 0); /* loop untill ENOSPC */
    fsync(fd); /* just in case */
    while (pos < sz) {
    /* each seek+ write operation result in splits uninitialized extent
    in three extents. Splitting may result in new extent allocation
    which probably will fail because of ENOSPC*/
    lseek(fd, blksize*2 -1, SEEK_CUR);
    if ((ret = write(fd, 'a', 1)) != 1)
    exit(1);
    pos += blksize * 2;
    }
    Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
    Signed-off-by: Mingming Cao <cmm@us.ibm.com>
    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
    ---
    fs/ext4/extents.c | 5 +++--
    1 files changed, 3 insertions(+), 2 deletions(-)
    diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
    index 8cf5545..13e3e8c 100644
    --- a/fs/ext4/extents.c
    +++ b/fs/ext4/extents.c
    @@ -2373,9 +2373,10 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
    ret = ext4_ext_convert_to_initialized(handle, inode,
    path, iblock,
    max_blocks);
    - if (ret <= 0)
    + if (ret <= 0) {
    + err = ret;
    goto out2;
    - else
    + } else
    allocated = ret;
    goto outnew;
    }
    --
    1.5.4.rc3.31.g1271-dirty


    \
     
     \ /
      Last update: 2008-01-22 04:07    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean