aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext4/inode.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 2d54c822c4c3..5e17d5f22a7e 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1005,6 +1005,9 @@ static int ext4_indirect_calc_metadata_amount(struct inode *inode, int blocks)
1005 */ 1005 */
1006static int ext4_calc_metadata_amount(struct inode *inode, int blocks) 1006static int ext4_calc_metadata_amount(struct inode *inode, int blocks)
1007{ 1007{
1008 if (!blocks)
1009 return 0;
1010
1008 if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) 1011 if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)
1009 return ext4_ext_calc_metadata_amount(inode, blocks); 1012 return ext4_ext_calc_metadata_amount(inode, blocks);
1010 1013
@@ -1559,7 +1562,25 @@ static void ext4_da_release_space(struct inode *inode, int to_free)
1559 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); 1562 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
1560 int total, mdb, mdb_free, release; 1563 int total, mdb, mdb_free, release;
1561 1564
1565 if (!to_free)
1566 return; /* Nothing to release, exit */
1567
1562 spin_lock(&EXT4_I(inode)->i_block_reservation_lock); 1568 spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
1569
1570 if (!EXT4_I(inode)->i_reserved_data_blocks) {
1571 /*
1572 * if there is no reserved blocks, but we try to free some
1573 * then the counter is messed up somewhere.
1574 * but since this function is called from invalidate
1575 * page, it's harmless to return without any action
1576 */
1577 printk(KERN_INFO "ext4 delalloc try to release %d reserved "
1578 "blocks for inode %lu, but there is no reserved "
1579 "data blocks\n", to_free, inode->i_ino);
1580 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
1581 return;
1582 }
1583
1563 /* recalculate the number of metablocks still need to be reserved */ 1584 /* recalculate the number of metablocks still need to be reserved */
1564 total = EXT4_I(inode)->i_reserved_data_blocks - to_free; 1585 total = EXT4_I(inode)->i_reserved_data_blocks - to_free;
1565 mdb = ext4_calc_metadata_amount(inode, total); 1586 mdb = ext4_calc_metadata_amount(inode, total);