lkml.org 
[lkml]   [2019]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.3 133/180] ext4: Fix credit estimate for final inode freeing
    Date
    From: Jan Kara <jack@suse.cz>

    commit 65db869c754e7c271691dd5feabf884347e694f5 upstream.

    Estimate for the number of credits needed for final freeing of inode in
    ext4_evict_inode() was to small. We may modify 4 blocks (inode & sb for
    orphan deletion, bitmap & group descriptor for inode freeing) and not
    just 3.

    [ Fixed minor whitespace nit. -- TYT ]

    Fixes: e50e5129f384 ("ext4: xattr-in-inode support")
    CC: stable@vger.kernel.org
    Signed-off-by: Jan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20191105164437.32602-6-jack@suse.cz
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

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

    --- a/fs/ext4/inode.c
    +++ b/fs/ext4/inode.c
    @@ -196,7 +196,12 @@ void ext4_evict_inode(struct inode *inod
    {
    handle_t *handle;
    int err;
    - int extra_credits = 3;
    + /*
    + * Credits for final inode cleanup and freeing:
    + * sb + inode (ext4_orphan_del()), block bitmap, group descriptor
    + * (xattr block freeing), bitmap, group descriptor (inode freeing)
    + */
    + int extra_credits = 6;
    struct ext4_xattr_inode_array *ea_inode_array = NULL;

    trace_ext4_evict_inode(inode);
    @@ -252,8 +257,12 @@ void ext4_evict_inode(struct inode *inod
    if (!IS_NOQUOTA(inode))
    extra_credits += EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb);

    + /*
    + * Block bitmap, group descriptor, and inode are accounted in both
    + * ext4_blocks_for_truncate() and extra_credits. So subtract 3.
    + */
    handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE,
    - ext4_blocks_for_truncate(inode)+extra_credits);
    + ext4_blocks_for_truncate(inode) + extra_credits - 3);
    if (IS_ERR(handle)) {
    ext4_std_error(inode->i_sb, PTR_ERR(handle));
    /*

    \
     
     \ /
      Last update: 2019-12-16 19:31    [W:3.480 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site