aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorharshads <harshads@google.com>2018-03-23 11:32:49 -0700
committerTheodore Ts'o <tytso@mit.edu>2018-03-24 11:14:06 -0400
commit7cc4cf5c7c010a01b38c89065e4ee0465f3692b4 (patch)
treec5c44a4efde971092229982b1d38e72d73453043
parent6a6393964f045d1d85503f9f4202811bde840875 (diff)
downloade2fsprogs-7cc4cf5c7c010a01b38c89065e4ee0465f3692b4.tar.gz
debugfs: release clusters only once in release_blocks_proc
While killing file by inode in debugfs (kill_file_by_inode), if bigalloc feature is turned on, release clusters only once. We do it by remembering the last released cluster while releasing blocks. We release a cluster only if it is not already released. Signed-off-by: Harshad Shirwadkar <harshads@google.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r--debugfs/debugfs.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
index bd6949ed8..905c8cdc6 100644
--- a/debugfs/debugfs.c
+++ b/debugfs/debugfs.c
@@ -1792,11 +1792,17 @@ static int release_blocks_proc(ext2_filsys fs, blk64_t *blocknr,
e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)),
blk64_t ref_block EXT2FS_ATTR((unused)),
int ref_offset EXT2FS_ATTR((unused)),
- void *private EXT2FS_ATTR((unused)))
+ void *private)
{
- blk64_t block;
+ blk64_t block = *blocknr;
+ blk64_t *last_cluster = (blk64_t *)private;
+ blk64_t cluster = EXT2FS_B2C(fs, block);
+
+ if (cluster == *last_cluster)
+ return 0;
+
+ *last_cluster = cluster;
- block = *blocknr;
ext2fs_block_alloc_stats2(fs, block, -1);
return 0;
}
@@ -1811,8 +1817,9 @@ static void kill_file_by_inode(ext2_ino_t inode)
if (debugfs_write_inode(inode, &inode_buf, 0))
return;
if (ext2fs_inode_has_valid_blocks2(current_fs, &inode_buf)) {
+ blk64_t last_cluster = 0;
ext2fs_block_iterate3(current_fs, inode, BLOCK_FLAG_READ_ONLY,
- NULL, release_blocks_proc, NULL);
+ NULL, release_blocks_proc, &last_cluster);
}
printf("\n");
ext2fs_inode_alloc_stats2(current_fs, inode, -1,