Re: [PATCH 1/6 ]Ext4 credits caclulation cleanup and fix that for nonextent writepage
From: Aneesh Kumar K.V <hidden>
Date: 2008-08-13 10:19:57
On Tue, Aug 12, 2008 at 09:25:54AM -0700, Mingming Cao wrote:
+int ext4_meta_trans_blocks(struct inode* inode, int nrblocks, int idxblocks)
+{
+ int groups, gdpblocks;
+ int ret = 0;
+
+ groups = nrblocks + idxblocks;
+ gdpblocks = groups;
+ if (groups > EXT4_SB(inode->i_sb)->s_groups_count)
+ groups = EXT4_SB(inode->i_sb)->s_groups_count;
+ if (groups > EXT4_SB(inode->i_sb)->s_gdb_count)
+ gdpblocks = EXT4_SB(inode->i_sb)->s_gdb_count;I guess we should pass chunk to ext4_meta_trans_blocks also. if (chunk) we should update only one group descriptor and one bitmap block ie, if(chunk) groups = 1 + idxblocks;
+ + /* bitmaps and block group descriptor blocks */ + ret += groups + gdpblocks; + + ret += idxblocks; + + /* journalled mode, include buffer to modify data blocks */ + if (ext4_should_journal_data(inode)) + ret += nrblocks; + + /* Blocks for super block, inode, quota and xattr blocks */ + ret += EXT4_META_TRANS_BLOCKS(inode->i_sb); + + return ret; +} +
.... ...
+static int ext4_writeblocks_trans_credits_old(struct inode *inode, int nrblocks,
+ int chunk)
{
- int bpp = ext4_journal_blocks_per_page(inode);
- int indirects = (EXT4_NDIR_BLOCKS % bpp) ? 5 : 3;
+ int indirects;
int ret;
- if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)
- return ext4_ext_writepage_trans_blocks(inode, bpp);
-
- if (ext4_should_journal_data(inode))
- ret = 3 * (bpp + indirects) + 2;
- else
- ret = 2 * (bpp + indirects) + 2;
+ /*
+ * How many index blocks need to touch to modify nrblocks?
+ * The "Chunk" flag indicating whether the nrblocks is
+ * physically contigous on disk
+ *
+ * For Direct IO and fallocate, they calls get_block to allocate
+ * one single extent at a time, so they could set the "Chunk" flag
+ */
+ indirects = ext4_indirect_trans_blocks(inode, nrblocks, chunk);
-#ifdef CONFIG_QUOTA
- /* We know that structure was already allocated during DQUOT_INIT so
- * we will be updating only the data blocks + inodes */
- ret += 2*EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb);
-#endif
+ /* Account for block group bitmaps and block groups
+ * descriptors.Worse case, the nrblocks+indirects blocks spread
+ * over different block groups
+ */
+ ret = ext4_meta_trans_blocks(inode, nrblocks, indirects);
return ret;
}-aneesh