diff options
author | harshads <harshads@google.com> | 2018-03-23 11:32:49 -0700 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2018-03-24 11:14:06 -0400 |
commit | 7cc4cf5c7c010a01b38c89065e4ee0465f3692b4 (patch) | |
tree | c5c44a4efde971092229982b1d38e72d73453043 | |
parent | 6a6393964f045d1d85503f9f4202811bde840875 (diff) | |
download | e2fsprogs-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.c | 15 |
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, |