diff options
-rw-r--r-- | fs/ext4/extents.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index c92ef8735ba2..82df3ce9874a 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -2743,10 +2743,15 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode, | |||
2743 | err = ext4_ext_correct_indexes(handle, inode, path); | 2743 | err = ext4_ext_correct_indexes(handle, inode, path); |
2744 | 2744 | ||
2745 | /* | 2745 | /* |
2746 | * Free the partial cluster only if the current extent does not | 2746 | * If there's a partial cluster and at least one extent remains in |
2747 | * reference it. Otherwise we might free used cluster. | 2747 | * the leaf, free the partial cluster if it isn't shared with the |
2748 | * current extent. If there's a partial cluster and no extents | ||
2749 | * remain in the leaf, it can't be freed here. It can only be | ||
2750 | * freed when it's possible to determine if it's not shared with | ||
2751 | * any other extent - when the next leaf is processed or when space | ||
2752 | * removal is complete. | ||
2748 | */ | 2753 | */ |
2749 | if (*partial_cluster > 0 && | 2754 | if (*partial_cluster > 0 && eh->eh_entries && |
2750 | (EXT4_B2C(sbi, ext4_ext_pblock(ex) + ex_ee_len - 1) != | 2755 | (EXT4_B2C(sbi, ext4_ext_pblock(ex) + ex_ee_len - 1) != |
2751 | *partial_cluster)) { | 2756 | *partial_cluster)) { |
2752 | int flags = get_default_free_blocks_flags(inode); | 2757 | int flags = get_default_free_blocks_flags(inode); |