X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fext2%2Fballoc.c;h=5fbe1ca0bc212bd6f221e3a599adee5c1d68346a;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=f5a6b336f708f8c1fbd72a313548828207a03734;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index f5a6b336f..5fbe1ca0b 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -16,6 +16,8 @@ #include #include #include +#include +#include /* * balloc.c contains the blocks allocation and deallocation routines @@ -88,8 +90,8 @@ read_block_bitmap(struct super_block *sb, unsigned int block_group) if (!bh) ext2_error (sb, "read_block_bitmap", "Cannot read block bitmap - " - "block_group = %d, block_bitmap = %lu", - block_group, (unsigned long) desc->bg_block_bitmap); + "block_group = %d, block_bitmap = %u", + block_group, le32_to_cpu(desc->bg_block_bitmap)); error_out: return bh; } @@ -108,6 +110,8 @@ static int reserve_blocks(struct super_block *sb, int count) free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); root_blocks = le32_to_cpu(es->s_r_blocks_count); + DLIMIT_ADJUST_BLOCK(sb, vx_current_xid(), &free_blocks, &root_blocks); + if (free_blocks < count) count = free_blocks; @@ -258,6 +262,7 @@ do_more: } error_return: brelse(bitmap_bh); + DLIMIT_FREE_BLOCK(sb, inode->i_xid, freed); release_blocks(sb, freed); DQUOT_FREE_BLOCK(inode, freed); } @@ -361,6 +366,10 @@ int ext2_new_block(struct inode *inode, unsigned long goal, *err = -ENOSPC; goto out_dquot; } + if (DLIMIT_ALLOC_BLOCK(sb, inode->i_xid, es_alloc)) { + *err = -ENOSPC; + goto out_dlimit; + } ext2_debug ("goal=%lu.\n", goal); @@ -508,6 +517,8 @@ got_block: *err = 0; out_release: group_release_blocks(sb, group_no, desc, gdp_bh, group_alloc); + DLIMIT_FREE_BLOCK(sb, inode->i_xid, es_alloc); +out_dlimit: release_blocks(sb, es_alloc); out_dquot: DQUOT_FREE_BLOCK(inode, dq_alloc);