--- /dev/null
+ - 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;
+ }
+