On Tue, 2008-03-04 at 18:10 +0530, Aneesh Kumar K.V wrote: > Put the old extent details back if we fail to split the > uninitialized extent. > Reviewed, add to the patch queue. Mingming > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxxxxxxx> > --- > fs/ext4/extents.c | 26 ++++++++++++++++++++++++-- > 1 files changed, 24 insertions(+), 2 deletions(-) > > diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c > index 39d5315..d315cc1 100644 > --- a/fs/ext4/extents.c > +++ b/fs/ext4/extents.c > @@ -2152,7 +2152,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, > ext4_lblk_t iblock, > unsigned long max_blocks) > { > - struct ext4_extent *ex, newex; > + struct ext4_extent *ex, newex, orig_ex; > struct ext4_extent *ex1 = NULL; > struct ext4_extent *ex2 = NULL; > struct ext4_extent *ex3 = NULL; > @@ -2171,6 +2171,9 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, > allocated = ee_len - (iblock - ee_block); > newblock = iblock - ee_block + ext_pblock(ex); > ex2 = ex; > + orig_ex.ee_block = ex->ee_block; > + orig_ex.ee_len = cpu_to_le16(ee_len); > + ext4_ext_store_pblock(&orig_ex, ext_pblock(ex)); > > err = ext4_ext_get_access(handle, inode, path + depth); > if (err) > @@ -2199,13 +2202,25 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, > ex3->ee_len = cpu_to_le16(allocated - max_blocks); > ext4_ext_mark_uninitialized(ex3); > err = ext4_ext_insert_extent(handle, inode, path, ex3); > - if (err) > + if (err) { > + ex->ee_block = orig_ex.ee_block; > + ex->ee_len = orig_ex.ee_len; > + ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); > + ext4_ext_mark_uninitialized(ex); > + ext4_ext_dirty(handle, inode, path + depth); > goto out; > + } > /* > * The depth, and hence eh & ex might change > * as part of the insert above. > */ > newdepth = ext_depth(inode); > + /* > + * update the extent length after successfull insert of the > + * split extent > + */ > + orig_ex.ee_len = cpu_to_le16(ee_len - > + ext4_ext_get_actual_len(ex3)); > if (newdepth != depth) { > depth = newdepth; > ext4_ext_drop_refs(path); > @@ -2280,6 +2295,13 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, > goto out; > insert: > err = ext4_ext_insert_extent(handle, inode, path, &newex); > + if (err) { > + ex->ee_block = orig_ex.ee_block; > + ex->ee_len = orig_ex.ee_len; > + ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); > + ext4_ext_mark_uninitialized(ex); > + ext4_ext_dirty(handle, inode, path + depth); > + } > out: > return err ? err : allocated; > } -- 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