diff options
Diffstat (limited to 'fs/ext4/mballoc.c')
| -rw-r--r-- | fs/ext4/mballoc.c | 22 | 
1 files changed, 12 insertions, 10 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 54df209d2ee..b423a364dca 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -23,6 +23,7 @@  #include "mballoc.h"  #include <linux/debugfs.h> +#include <linux/slab.h>  #include <trace/events/ext4.h>  /* @@ -2534,6 +2535,17 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn)  		mb_debug(1, "gonna free %u blocks in group %u (0x%p):",  			 entry->count, entry->group, entry); +		if (test_opt(sb, DISCARD)) { +			ext4_fsblk_t discard_block; + +			discard_block = entry->start_blk + +				ext4_group_first_block_no(sb, entry->group); +			trace_ext4_discard_blocks(sb, +					(unsigned long long)discard_block, +					entry->count); +			sb_issue_discard(sb, discard_block, entry->count); +		} +  		err = ext4_mb_load_buddy(sb, entry->group, &e4b);  		/* we expect to find existing buddy because it's pinned */  		BUG_ON(err != 0); @@ -2555,16 +2567,6 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn)  			page_cache_release(e4b.bd_bitmap_page);  		}  		ext4_unlock_group(sb, entry->group); -		if (test_opt(sb, DISCARD)) { -			ext4_fsblk_t discard_block; - -			discard_block = entry->start_blk + -				ext4_group_first_block_no(sb, entry->group); -			trace_ext4_discard_blocks(sb, -					(unsigned long long)discard_block, -					entry->count); -			sb_issue_discard(sb, discard_block, entry->count); -		}  		kmem_cache_free(ext4_free_ext_cachep, entry);  		ext4_mb_release_desc(&e4b);  	}  |