Thread (61 messages) 61 messages, 6 authors, 2008-08-16

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help