On Mon, Jun 02, 2008 at 12:14:33PM +0530, Aneesh Kumar K.V wrote: > On Sun, Jun 01, 2008 at 04:35:55PM -0700, Mingming Cao wrote: > > ext4: delalloc ENOSPC handling core > > > > From: Mingming cao <cmm@xxxxxxxxxx> > > > > Core part of delaloc ENOSPC (block reservation.) > > data/meta blocks are reserved on write_begin(), and per-inode reserved counters > > are updated after block allocation. > > > > Signed-off-by: Mingming cao <cmm@xxxxxxxxxx> > > > > --- > > fs/ext4/inode.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- > > 1 file changed, 66 insertions(+), 3 deletions(-) > > > > Index: linux-2.6.26-rc4/fs/ext4/inode.c > > =================================================================== > > --- linux-2.6.26-rc4.orig/fs/ext4/inode.c 2008-06-01 14:26:13.000000000 -0700 > > +++ linux-2.6.26-rc4/fs/ext4/inode.c 2008-06-01 15:04:06.000000000 -0700 > > @@ -38,6 +38,7 @@ > > #include "ext4_jbd2.h" > > #include "xattr.h" > > #include "acl.h" > > +#include "ext4_extents.h" > > > > static void ext4_invalidatepage(struct page *page, unsigned long offset); > > > > @@ -1410,6 +1411,61 @@ static int ext4_journalled_write_end(str > > return ret ? ret : copied; > > } > > > > +static int ext4_da_reserve_space(struct inode *inode, int nrblocks) > > +{ > > + struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); > > + unsigned long md_needed, mdblocks, total = 0; > > + > > + /* > > + * calculate the amount of metadata blocks to reserve > > recalculate the amount of metadata blocks to reserve. > > > > > > + * in order to allocate nrblocks > > + * worse case is one extent per block > > + */ > > + total = EXT4_I(inode)->i_reserved_data_blocks + nrblocks; > > + mdblocks = ext4_ext_calc_metadata_amount(inode, total); > > + BUG_ON(mdblocks < EXT4_I(inode)->i_reserved_meta_blocks); > > + > > + md_needed = mdblocks - EXT4_I(inode)->i_reserved_meta_blocks; > > + total = md_needed + nrblocks; > > + > > + if (ext4_has_free_blocks(sbi, total) < total) > > + return -ENOSPC; > > + > > + /* reduce fs free blocks counter */ > > + percpu_counter_sub(&sbi->s_freeblocks_counter, total); > > + > > + EXT4_I(inode)->i_reserved_data_blocks += nrblocks; > > + EXT4_I(inode)->i_reserved_meta_blocks += md_needed; > > Better written as > EXT4_I(inode)->i_reserved_meta_blocks += mdblocks; > > EXT4_I(inode)->i_reserved_meta_blocks = mdblocks; -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