lkml.org 
[lkml]   [2014]   [Sep]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13 073/103] ext4: update i_disksize coherently with block allocation on error path
    Date
    3.13.11.8 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Dmitry Monakhov <dmonakhov@openvz.org>

    commit 6603120e96eae9a5d6228681ae55c7fdc998d1bb upstream.

    In case of delalloc block i_disksize may be less than i_size. So we
    have to update i_disksize each time we allocated and submitted some
    blocks beyond i_disksize. We weren't doing this on the error paths,
    so fix this.

    testcase: xfstest generic/019

    Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    fs/ext4/inode.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

    diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
    index 23e8c80..2d782aa 100644
    --- a/fs/ext4/inode.c
    +++ b/fs/ext4/inode.c
    @@ -2201,6 +2201,7 @@ static int mpage_map_and_submit_extent(handle_t *handle,
    struct ext4_map_blocks *map = &mpd->map;
    int err;
    loff_t disksize;
    + int progress = 0;

    mpd->io_submit.io_end->offset =
    ((loff_t)map->m_lblk) << inode->i_blkbits;
    @@ -2217,8 +2218,11 @@ static int mpage_map_and_submit_extent(handle_t *handle,
    * is non-zero, a commit should free up blocks.
    */
    if ((err == -ENOMEM) ||
    - (err == -ENOSPC && ext4_count_free_clusters(sb)))
    + (err == -ENOSPC && ext4_count_free_clusters(sb))) {
    + if (progress)
    + goto update_disksize;
    return err;
    + }
    ext4_msg(sb, KERN_CRIT,
    "Delayed block allocation failed for "
    "inode %lu at logical offset %llu with"
    @@ -2235,15 +2239,17 @@ static int mpage_map_and_submit_extent(handle_t *handle,
    *give_up_on_write = true;
    return err;
    }
    + progress = 1;
    /*
    * Update buffer state, submit mapped pages, and get us new
    * extent to map
    */
    err = mpage_map_and_submit_buffers(mpd);
    if (err < 0)
    - return err;
    + goto update_disksize;
    } while (map->m_len);

    +update_disksize:
    /*
    * Update on-disk size after IO is submitted. Races with
    * truncate are avoided by checking i_size under i_data_sem.
    --
    1.9.1


    \
     
     \ /
      Last update: 2014-10-01 00:41    [W:3.531 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site