aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/inode.c
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2008-10-10 09:39:00 -0400
committerTheodore Ts'o <tytso@mit.edu>2008-10-10 09:39:00 -0400
commit6bc6e63fcd7dac9e633ea29f1fddd9580ab28f3f (patch)
tree144d53023af5faeb94b9b3aa28e186a33e6c5b98 /fs/ext4/inode.c
parent030ba6bc67b4f2bc5cd174f57785a1745c929abe (diff)
ext4: Add percpu dirty block accounting.
This patch adds dirty block accounting using percpu_counters. Delayed allocation block reservation is now done by updating dirty block counter. In a later patch we switch to non delalloc mode if the filesystem free blocks is greater than 150% of total filesystem dirty blocks Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Mingming Cao<cmm@us.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r--fs/ext4/inode.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index eb9d449817d0..7875a2dd54b9 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1030,19 +1030,20 @@ static void ext4_da_update_reserve_space(struct inode *inode, int used)
1030 BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks); 1030 BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
1031 mdb_free = EXT4_I(inode)->i_reserved_meta_blocks - mdb; 1031 mdb_free = EXT4_I(inode)->i_reserved_meta_blocks - mdb;
1032 1032
1033 /* Account for allocated meta_blocks */ 1033 if (mdb_free) {
1034 mdb_free -= EXT4_I(inode)->i_allocated_meta_blocks; 1034 /* Account for allocated meta_blocks */
1035 1035 mdb_free -= EXT4_I(inode)->i_allocated_meta_blocks;
1036 /* update fs free blocks counter for truncate case */ 1036
1037 percpu_counter_add(&sbi->s_freeblocks_counter, mdb_free); 1037 /* update fs dirty blocks counter */
1038 percpu_counter_sub(&sbi->s_dirtyblocks_counter, mdb_free);
1039 EXT4_I(inode)->i_allocated_meta_blocks = 0;
1040 EXT4_I(inode)->i_reserved_meta_blocks = mdb;
1041 }
1038 1042
1039 /* update per-inode reservations */ 1043 /* update per-inode reservations */
1040 BUG_ON(used > EXT4_I(inode)->i_reserved_data_blocks); 1044 BUG_ON(used > EXT4_I(inode)->i_reserved_data_blocks);
1041 EXT4_I(inode)->i_reserved_data_blocks -= used; 1045 EXT4_I(inode)->i_reserved_data_blocks -= used;
1042 1046
1043 BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
1044 EXT4_I(inode)->i_reserved_meta_blocks = mdb;
1045 EXT4_I(inode)->i_allocated_meta_blocks = 0;
1046 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); 1047 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
1047} 1048}
1048 1049
@@ -1588,8 +1589,8 @@ static void ext4_da_release_space(struct inode *inode, int to_free)
1588 1589
1589 release = to_free + mdb_free; 1590 release = to_free + mdb_free;
1590 1591
1591 /* update fs free blocks counter for truncate case */ 1592 /* update fs dirty blocks counter for truncate case */
1592 percpu_counter_add(&sbi->s_freeblocks_counter, release); 1593 percpu_counter_sub(&sbi->s_dirtyblocks_counter, release);
1593 1594
1594 /* update per-inode reservations */ 1595 /* update per-inode reservations */
1595 BUG_ON(to_free > EXT4_I(inode)->i_reserved_data_blocks); 1596 BUG_ON(to_free > EXT4_I(inode)->i_reserved_data_blocks);
@@ -2471,7 +2472,6 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping,
2471 index = pos >> PAGE_CACHE_SHIFT; 2472 index = pos >> PAGE_CACHE_SHIFT;
2472 from = pos & (PAGE_CACHE_SIZE - 1); 2473 from = pos & (PAGE_CACHE_SIZE - 1);
2473 to = from + len; 2474 to = from + len;
2474
2475retry: 2475retry:
2476 /* 2476 /*
2477 * With delayed allocation, we don't log the i_disksize update 2477 * With delayed allocation, we don't log the i_disksize update