|
@@ -4585,6 +4585,7 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
|
|
|
struct buffer_head *gd_bh;
|
|
|
ext4_group_t block_group;
|
|
|
struct ext4_sb_info *sbi;
|
|
|
+ struct ext4_inode_info *ei = EXT4_I(inode);
|
|
|
struct ext4_buddy e4b;
|
|
|
unsigned int count_clusters;
|
|
|
int err = 0;
|
|
@@ -4784,7 +4785,6 @@ do_more:
|
|
|
ext4_block_bitmap_csum_set(sb, block_group, gdp, bitmap_bh);
|
|
|
ext4_group_desc_csum_set(sb, block_group, gdp);
|
|
|
ext4_unlock_group(sb, block_group);
|
|
|
- percpu_counter_add(&sbi->s_freeclusters_counter, count_clusters);
|
|
|
|
|
|
if (sbi->s_log_groups_per_flex) {
|
|
|
ext4_group_t flex_group = ext4_flex_group(sbi, block_group);
|
|
@@ -4792,10 +4792,23 @@ do_more:
|
|
|
&sbi->s_flex_groups[flex_group].free_clusters);
|
|
|
}
|
|
|
|
|
|
- ext4_mb_unload_buddy(&e4b);
|
|
|
-
|
|
|
- if (!(flags & EXT4_FREE_BLOCKS_NO_QUOT_UPDATE))
|
|
|
+ if (flags & EXT4_FREE_BLOCKS_RESERVE && ei->i_reserved_data_blocks) {
|
|
|
+ percpu_counter_add(&sbi->s_dirtyclusters_counter,
|
|
|
+ count_clusters);
|
|
|
+ spin_lock(&ei->i_block_reservation_lock);
|
|
|
+ if (flags & EXT4_FREE_BLOCKS_METADATA)
|
|
|
+ ei->i_reserved_meta_blocks += count_clusters;
|
|
|
+ else
|
|
|
+ ei->i_reserved_data_blocks += count_clusters;
|
|
|
+ spin_unlock(&ei->i_block_reservation_lock);
|
|
|
+ if (!(flags & EXT4_FREE_BLOCKS_NO_QUOT_UPDATE))
|
|
|
+ dquot_reclaim_block(inode,
|
|
|
+ EXT4_C2B(sbi, count_clusters));
|
|
|
+ } else if (!(flags & EXT4_FREE_BLOCKS_NO_QUOT_UPDATE))
|
|
|
dquot_free_block(inode, EXT4_C2B(sbi, count_clusters));
|
|
|
+ percpu_counter_add(&sbi->s_freeclusters_counter, count_clusters);
|
|
|
+
|
|
|
+ ext4_mb_unload_buddy(&e4b);
|
|
|
|
|
|
/* We dirtied the bitmap block */
|
|
|
BUFFER_TRACE(bitmap_bh, "dirtied bitmap block");
|