Whamcloud - gitweb
- make HEAD from b_post_cmd3
[fs/lustre-release.git] / lustre / kernel_patches / patches / ext3-extents-fixes-2.6.9-rhel4.patch
diff --git a/lustre/kernel_patches/patches/ext3-extents-fixes-2.6.9-rhel4.patch b/lustre/kernel_patches/patches/ext3-extents-fixes-2.6.9-rhel4.patch
new file mode 100644 (file)
index 0000000..ffb9700
--- /dev/null
@@ -0,0 +1,86 @@
+ - 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;
+ }