summaryrefslogtreecommitdiff
path: root/fs/ext4/resize.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2019-11-05 17:44:29 +0100
committerTheodore Ts'o <tytso@mit.edu>2019-11-05 16:00:49 -0500
commit83448bdfb59731c2f54784ed3f4a93ff95be6e7e (patch)
tree1565589f99ab6ca22e94e2167c21b94934ab8ce3 /fs/ext4/resize.c
parentd090707edab59cb07047d6d7e138ffcc3bdc42be (diff)
ext4: Reserve revoke credits for freed blocks
So far we have reserved only relatively high fixed amount of revoke credits for each transaction. We over-reserved by large amount for most cases but when freeing large directories or files with data journalling, the fixed amount is not enough. In fact the worst case estimate is inconveniently large (maximum extent size) for freeing of one extent. We fix this by doing proper estimate of the amount of blocks that need to be revoked when removing blocks from the inode due to truncate or hole punching and otherwise reserve just a small amount of revoke credits for each transaction to accommodate freeing of xattrs block or so. Signed-off-by: Jan Kara <jack@suse.cz> Link: https://lore.kernel.org/r/20191105164437.32602-23-jack@suse.cz Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/resize.c')
-rw-r--r--fs/ext4/resize.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
index 3e4286b3901f..a8c0f2b5b6e1 100644
--- a/fs/ext4/resize.c
+++ b/fs/ext4/resize.c
@@ -388,6 +388,12 @@ static struct buffer_head *bclean(handle_t *handle, struct super_block *sb,
return bh;
}
+static int ext4_resize_ensure_credits_batch(handle_t *handle, int credits)
+{
+ return ext4_journal_ensure_credits_fn(handle, credits,
+ EXT4_MAX_TRANS_DATA, 0, 0);
+}
+
/*
* set_flexbg_block_bitmap() mark clusters [@first_cluster, @last_cluster] used.
*
@@ -427,7 +433,7 @@ static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle,
continue;
}
- err = ext4_journal_ensure_credits_batch(handle, 1);
+ err = ext4_resize_ensure_credits_batch(handle, 1);
if (err < 0)
return err;
@@ -520,7 +526,7 @@ static int setup_new_flex_group_blocks(struct super_block *sb,
struct buffer_head *gdb;
ext4_debug("update backup group %#04llx\n", block);
- err = ext4_journal_ensure_credits_batch(handle, 1);
+ err = ext4_resize_ensure_credits_batch(handle, 1);
if (err < 0)
goto out;
@@ -578,7 +584,7 @@ handle_bb:
/* Initialize block bitmap of the @group */
block = group_data[i].block_bitmap;
- err = ext4_journal_ensure_credits_batch(handle, 1);
+ err = ext4_resize_ensure_credits_batch(handle, 1);
if (err < 0)
goto out;
@@ -607,7 +613,7 @@ handle_ib:
/* Initialize inode bitmap of the @group */
block = group_data[i].inode_bitmap;
- err = ext4_journal_ensure_credits_batch(handle, 1);
+ err = ext4_resize_ensure_credits_batch(handle, 1);
if (err < 0)
goto out;
/* Mark unused entries in inode bitmap used */
@@ -1085,7 +1091,7 @@ static void update_backups(struct super_block *sb, sector_t blk_off, char *data,
ext4_fsblk_t backup_block;
/* Out of journal space, and can't get more - abort - so sad */
- err = ext4_journal_ensure_credits_batch(handle, 1);
+ err = ext4_resize_ensure_credits_batch(handle, 1);
if (err < 0)
break;