From 85ad5b840cc16e3cfc56d82d99410f0143988301 Mon Sep 17 00:00:00 2001 From: Maxim Patlasov Date: Sun, 10 Jul 2011 19:37:48 -0400 Subject: [PATCH] --- yaml --- r: 262090 b: refs/heads/master c: 7132de744ba76930d13033061018ddd7e3e8cd91 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/ext4/ext4.h | 1 + trunk/fs/ext4/extents.c | 4 +++- trunk/fs/ext4/mballoc.c | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 6f9886e7ea27..f563b9b3b679 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 275d3ba6b40d0f098693b9089c6fee9bd4e55d74 +refs/heads/master: 7132de744ba76930d13033061018ddd7e3e8cd91 diff --git a/trunk/fs/ext4/ext4.h b/trunk/fs/ext4/ext4.h index 49d2cea47382..d13f3b509886 100644 --- a/trunk/fs/ext4/ext4.h +++ b/trunk/fs/ext4/ext4.h @@ -526,6 +526,7 @@ struct ext4_new_group_data { #define EXT4_FREE_BLOCKS_METADATA 0x0001 #define EXT4_FREE_BLOCKS_FORGET 0x0002 #define EXT4_FREE_BLOCKS_VALIDATED 0x0004 +#define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE 0x0008 /* * ioctl commands diff --git a/trunk/fs/ext4/extents.c b/trunk/fs/ext4/extents.c index 31ae5fbe89e5..a86213882655 100644 --- a/trunk/fs/ext4/extents.c +++ b/trunk/fs/ext4/extents.c @@ -3565,12 +3565,14 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); if (err) { + int fb_flags = flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE ? + EXT4_FREE_BLOCKS_NO_QUOT_UPDATE : 0; /* free data blocks we just allocated */ /* not a good idea to call discard here directly, * but otherwise we'd need to call it every free() */ ext4_discard_preallocations(inode); ext4_free_blocks(handle, inode, NULL, ext4_ext_pblock(&newex), - ext4_ext_get_actual_len(&newex), 0); + ext4_ext_get_actual_len(&newex), fb_flags); goto out2; } diff --git a/trunk/fs/ext4/mballoc.c b/trunk/fs/ext4/mballoc.c index 389386b41c98..1900ec7a1579 100644 --- a/trunk/fs/ext4/mballoc.c +++ b/trunk/fs/ext4/mballoc.c @@ -4637,7 +4637,7 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, } ext4_mark_super_dirty(sb); error_return: - if (freed) + if (freed && !(flags & EXT4_FREE_BLOCKS_NO_QUOT_UPDATE)) dquot_free_block(inode, freed); brelse(bitmap_bh); ext4_std_error(sb, err);