Re: [PATCH 1/6 ]Ext4 credits caclulation cleanup and fix that for nonextent writepage
From: Mingming Cao <hidden>
Date: 2008-08-14 01:02:09
在 2008-08-13三的 15:49 +0530,Aneesh Kumar K.V写道:
On Tue, Aug 12, 2008 at 09:25:54AM -0700, Mingming Cao wrote:quoted
+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;
Agree. will update the patch to do that Mingming
quoted
+ + /* 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; +} +.... ...quoted
+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
-- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html