- minor fixes - multiblock get_block() for direct I/O Index: linux-2.6.9-full/include/linux/ext3_extents.h =================================================================== --- linux-2.6.9-full.orig/include/linux/ext3_extents.h 2007-03-23 15:57:00.000000000 +0300 +++ linux-2.6.9-full/include/linux/ext3_extents.h 2007-03-28 00:59:32.000000000 +0400 @@ -205,7 +205,7 @@ typedef int (*ext_prepare_callback)(stru #define EXT_DEPTH(__tree__) (EXT_ROOT_HDR(__tree__)->eh_depth) #define EXT_GENERATION(__tree__) EXT_HDR_GEN(EXT_ROOT_HDR(__tree__)) -#define EXT_ASSERT(__x__) if (!(__x__)) BUG(); +#define EXT_ASSERT(__x__) if (unlikely(!(__x__))) BUG(); #define EXT_CHECK_PATH(tree,path) \ { \ Index: linux-2.6.9-full/fs/ext3/extents.c =================================================================== --- linux-2.6.9-full.orig/fs/ext3/extents.c 2007-03-23 15:57:00.000000000 +0300 +++ linux-2.6.9-full/fs/ext3/extents.c 2007-03-28 00:59:41.000000000 +0400 @@ -895,6 +895,8 @@ repeat: /* if we found index with free entry, then use that * entry: create all needed subtree and add new leaf */ err = ext3_ext_split(handle, tree, path, newext, i); + if (err) + goto out; /* refill path */ ext3_ext_drop_refs(path); @@ -904,12 +906,16 @@ repeat: } else { /* tree is full, time to grow in depth */ err = ext3_ext_grow_indepth(handle, tree, path, newext); + if (err) + goto out; /* refill path */ ext3_ext_drop_refs(path); path = ext3_ext_find_extent(tree, newext->ee_block, path); - if (IS_ERR(path)) + if (IS_ERR(path)) { err = PTR_ERR(path); + goto out; + } /* * only first (depth 0 -> 1) produces free space @@ -922,10 +928,8 @@ repeat: } } - if (err) - return err; - - return 0; +out: + return err; } /* @@ -1992,21 +1996,10 @@ static int ext3_new_block_cb(handle_t *h EXT_ASSERT(ex->ee_start); EXT_ASSERT(ex->ee_len); - /* reuse block from the extent to order data/metadata */ - newblock = ex->ee_start++; - ex->ee_len--; - if (ex->ee_len == 0) { - ex->ee_len = 1; - /* allocate new block for the extent */ - goal = ext3_ext_find_goal(inode, path, ex->ee_block); - ex->ee_start = ext3_new_block(handle, inode, goal, err); - ex->ee_start_hi = 0; - if (ex->ee_start == 0) { - /* error occured: restore old extent */ - ex->ee_start = newblock; - return 0; - } - } + /* allocate new block for the extent */ + goal = ext3_ext_find_goal(inode, path, ex->ee_block); + newblock = ext3_new_block(handle, inode, goal, err); + return newblock; }