On Fri, Aug 15, 2008 at 05:38:33PM -0700, Mingming Cao wrote: > > Ext4: journal credits reservation fixes for extent file writepage > > From: Mingming Cao <cmm@xxxxxxxxxx> > > This patch modified the writepage/write_begin credit caculation for > extent files, to use the credits caculation helper function. > > The current calculation of how many index/leaf blocks should be > accounted is too conservetive, it always consider the worse case, where > the tree level is 5, and in the case of multiple chunk allocation, it > always multiple the needed credits. This path uses the accurate depth of > the inode with some extras to caluate the index blocks, and also less > conservetive in the case of multiple allocation accounting. > > Signed-off-by: Mingming Cao <cmm@xxxxxxxxxx> > --- > --- > fs/ext4/ext4_extents.h | 3 + > fs/ext4/extents.c | 88 ++++++++++++++++--------------------------------- > fs/ext4/migrate.c | 3 + > 3 files changed, 34 insertions(+), 60 deletions(-) > > Index: linux-2.6.27-rc3/fs/ext4/ext4_extents.h > =================================================================== > --- linux-2.6.27-rc3.orig/fs/ext4/ext4_extents.h 2008-08-15 14:43:20.000000000 -0700 > +++ linux-2.6.27-rc3/fs/ext4/ext4_extents.h 2008-08-15 14:44:15.000000000 -0700 > @@ -216,7 +216,9 @@ extern int ext4_ext_calc_metadata_amount > extern ext4_fsblk_t idx_pblock(struct ext4_extent_idx *); > extern void ext4_ext_store_pblock(struct ext4_extent *, ext4_fsblk_t); > extern int ext4_extent_tree_init(handle_t *, struct inode *); > -extern int ext4_ext_calc_credits_for_insert(struct inode *, struct ext4_ext_path *); > +extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode, > + int num, > + struct ext4_ext_path *path); > extern int ext4_ext_try_to_merge(struct inode *inode, > struct ext4_ext_path *path, > struct ext4_extent *); > Index: linux-2.6.27-rc3/fs/ext4/extents.c > =================================================================== > --- linux-2.6.27-rc3.orig/fs/ext4/extents.c 2008-08-15 14:43:20.000000000 -0700 > +++ linux-2.6.27-rc3/fs/ext4/extents.c 2008-08-15 14:51:07.000000000 -0700 > @@ -1747,54 +1747,62 @@ static int ext4_ext_rm_idx(handle_t *han > } > > /* > - * ext4_ext_calc_credits_for_insert: > - * This routine returns max. credits that the extent tree can consume. > - * It should be OK for low-performance paths like ->writepage() > - * To allow many writing processes to fit into a single transaction, > - * the caller should calculate credits under i_data_sem and > - * pass the actual path. > + * ext4_ext_calc_credits_for_single_extent: > + * This routine returns max. credits that needed to insert an extent > + * to the extent tree. > + * When pass the actual path, the caller should calculate credits > + * under i_data_sem. > */ > -int ext4_ext_calc_credits_for_insert(struct inode *inode, > +int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int num, > struct ext4_ext_path *path) > { s/num/nrblocks/ > - int depth, needed; > - > if (path) { > + int depth = ext_depth(inode); > + int ret; > + > /* probably there is space in leaf? */ > - depth = ext_depth(inode); > if (le16_to_cpu(path[depth].p_hdr->eh_entries) > - < le16_to_cpu(path[depth].p_hdr->eh_max)) > - return 1; > - } > - > - /* > - * given 32-bit logical block (4294967296 blocks), max. tree > - * can be 4 levels in depth -- 4 * 340^4 == 53453440000. > - * Let's also add one more level for imbalance. > - */ > - depth = 5; > + < le16_to_cpu(path[depth].p_hdr->eh_max)) { > > - /* allocation of new data block(s) */ > - needed = 2; -aneesh -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html