lkml.org 
[lkml]   [2010]   [Jan]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[39/39] ext4: fix sleep inside spinlock issue with quota and dealloc (#14739)
    2.6.31-stable review patch.  If anyone has any objections, please let us know.

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

    From: Dmitry Monakhov <dmonakhov@openvz.org>

    commit 39bc680a8160bb9d6743f7873b535d553ff61058 upstream.

    Unlock i_block_reservation_lock before vfs_dq_reserve_block().
    This patch fixes http://bugzilla.kernel.org/show_bug.cgi?id=14739

    Cc: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    fs/ext4/inode.c | 11 +++++------
    1 file changed, 5 insertions(+), 6 deletions(-)

    --- a/fs/ext4/inode.c
    +++ b/fs/ext4/inode.c
    @@ -1859,19 +1859,17 @@ repeat:

    md_needed = mdblocks - EXT4_I(inode)->i_reserved_meta_blocks;
    total = md_needed + nrblocks;
    + spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);

    /*
    * Make quota reservation here to prevent quota overflow
    * later. Real quota accounting is done at pages writeout
    * time.
    */
    - if (vfs_dq_reserve_block(inode, total)) {
    - spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
    + if (vfs_dq_reserve_block(inode, total))
    return -EDQUOT;
    - }

    if (ext4_claim_free_blocks(sbi, total)) {
    - spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
    vfs_dq_release_reservation_block(inode, total);
    if (ext4_should_retry_alloc(inode->i_sb, &retries)) {
    yield();
    @@ -1879,10 +1877,11 @@ repeat:
    }
    return -ENOSPC;
    }
    + spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
    EXT4_I(inode)->i_reserved_data_blocks += nrblocks;
    - EXT4_I(inode)->i_reserved_meta_blocks = mdblocks;
    -
    + EXT4_I(inode)->i_reserved_meta_blocks += md_needed;
    spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
    +
    return 0; /* success */
    }




    \
     
     \ /
      Last update: 2010-01-05 21:11    [W:0.022 / U:65.048 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site