lkml.org 
[lkml]   [2009]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 49/60] ext4: Fix discard of inode prealloc space with delayed allocation.

    -stable review patch. If anyone has any objections, please let us know.

    ------------------
    From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

    (cherry picked from commit d6014301b5599fba395c42a1e96a7fe86f7d0b2d)

    With delayed allocation we should not/cannot discard inode prealloc
    space during file close. We would still have dirty pages for which we
    haven't allocated blocks yet. With this fix after each get_blocks
    request we check whether we have zero reserved blocks and if yes and
    we don't have any writers on the file we discard inode prealloc space.

    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    ---
    fs/ext4/file.c | 3 ++-
    fs/ext4/inode.c | 8 ++++++++
    2 files changed, 10 insertions(+), 1 deletion(-)

    --- a/fs/ext4/file.c
    +++ b/fs/ext4/file.c
    @@ -39,7 +39,8 @@ static int ext4_release_file (struct ino
    }
    /* if we are the last writer on the inode, drop the block reservation */
    if ((filp->f_mode & FMODE_WRITE) &&
    - (atomic_read(&inode->i_writecount) == 1))
    + (atomic_read(&inode->i_writecount) == 1) &&
    + !EXT4_I(inode)->i_reserved_data_blocks)
    {
    down_write(&EXT4_I(inode)->i_data_sem);
    ext4_discard_reservation(inode);
    --- a/fs/ext4/inode.c
    +++ b/fs/ext4/inode.c
    @@ -1046,6 +1046,14 @@ static void ext4_da_update_reserve_space
    EXT4_I(inode)->i_reserved_meta_blocks = mdb;
    EXT4_I(inode)->i_allocated_meta_blocks = 0;
    spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
    +
    + /*
    + * If we have done all the pending block allocations and if
    + * there aren't any writers on the inode, we can discard the
    + * inode's preallocations.
    + */
    + if (!total && (atomic_read(&inode->i_writecount) == 0))
    + ext4_discard_reservation(inode);
    }

    /*



    \
     
     \ /
      Last update: 2009-06-10 05:53    [W:0.020 / U:0.200 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site