Whamcloud - gitweb
Branch b1_4
authoradilger <adilger>
Wed, 1 Jun 2005 18:45:09 +0000 (18:45 +0000)
committeradilger <adilger>
Wed, 1 Jun 2005 18:45:09 +0000 (18:45 +0000)
b=5275 : NFSD is looking up ".." which was broken in ext3 directories
that had grown large enough to become hashed.  Now, when looking up
"." or ".." in a hashed directory we explicitly search block 0, which
is where those entries will be kept (in addition to the htree index root)
instead of the hash of "." or "..".  Patch is included in 2.6-mm.
r=sct

12 files changed:
ldiskfs/kernel_patches/patches/ext3-htree-dot-2.6.patch [new file with mode: 0644]
ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series
ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series
lustre/ChangeLog
lustre/kernel_patches/patches/ext-2.4-patch-1-2.4.19-suse.patch
lustre/kernel_patches/patches/ext-2.4-patch-1.patch
lustre/kernel_patches/patches/ext3-htree-2.4.21-rhel.patch
lustre/kernel_patches/patches/ext3-htree-2.4.22-rh.patch
lustre/kernel_patches/patches/ext3-htree-dot-2.6.5-suse.patch [new file with mode: 0644]
lustre/kernel_patches/patches/ext3-htree-dot-2.6.patch [new file with mode: 0644]
lustre/kernel_patches/series/ldiskfs-2.6-rhel4.series
lustre/kernel_patches/series/ldiskfs-2.6-suse.series

diff --git a/ldiskfs/kernel_patches/patches/ext3-htree-dot-2.6.patch b/ldiskfs/kernel_patches/patches/ext3-htree-dot-2.6.patch
new file mode 100644 (file)
index 0000000..9192112
--- /dev/null
@@ -0,0 +1,23 @@
+Index: linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891/fs/ext3/namei.c
+===================================================================
+--- linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891.orig/fs/ext3/namei.c 2005-04-04 05:06:46.000000000 -0600
++++ linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891/fs/ext3/namei.c      2005-04-04 05:09:18.000000000 -0600
+@@ -926,8 +926,16 @@
+       struct inode *dir = dentry->d_parent->d_inode;
+       sb = dir->i_sb;
+-      if (!(frame = dx_probe(dentry, NULL, &hinfo, frames, err)))
+-              return NULL;
++      /* NFS may look up ".." - look at dx_root directory block */
++      if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')){
++              if (!(frame = dx_probe(dentry, NULL, &hinfo, frames, err)))
++                      return NULL;
++      } else {
++              frame = frames;
++              frame->bh = NULL;                       /* for dx_release() */
++              frame->at = (struct dx_entry *)frames;  /* hack for zero entry*/
++              dx_set_block(frame->at, 0);             /* dx_root block is 0 */
++      }
+       hash = hinfo.hash;
+       do {
+               block = dx_get_block(frame->at);
index 70e7b12..0980162 100644 (file)
@@ -9,3 +9,4 @@ ext3-include-fixes-2.6-rhel4.patch
 ext3-extents-2.6.9-rhel4.patch
 ext3-mballoc2-2.6.9-rhel4.patch 
 ext3-nlinks-2.6.7.patch
+ext3-htree-dot-2.6.patch
index fd05c25..c44eea3 100644 (file)
@@ -10,3 +10,4 @@ ext3-extents-2.6.5.patch
 ext3-mballoc2-2.6-suse.patch
 ext3-nlinks-2.6.7.patch
 ext3-rename-reserve-2.6-suse.patch
+ext3-htree-dot-2.6.5-suse.patch
index c7ae56f..1f5faab 100644 (file)
@@ -88,6 +88,13 @@ Details    : file's private_data field is used by device data and lustre
             values in there got lost. New field was added to struct file to
             store fs-specific private data.
 
+Severity   : minor
+Frequency  : when exporting Lustre via NFS
+Bugzilla   : 5275
+Description: NFSD failed occasionally when looking up a path component
+Details    : NFSD is looking up ".." which was broken in ext3 directories
+            that had grown large enough to become hashed.
+
 ------------------------------------------------------------------------------
 
 2005-05-05  Cluster File Systems, Inc. <info@clusterfs.com>
index a6b126e..1cdaa93 100644 (file)
@@ -1079,7 +1079,7 @@ Index: linux-2.4.19.SuSE/fs/ext3/namei.c
                        ret = bh;
                        goto cleanup_and_exit;
                } else {
-@@ -198,6 +851,66 @@
+@@ -198,6 +851,74 @@
        return ret;
  }
  
@@ -1098,17 +1098,25 @@ Index: linux-2.4.19.SuSE/fs/ext3/namei.c
 +      int namelen = dentry->d_name.len;
 +      const u8 *name = dentry->d_name.name;
 +      struct inode *dir = dentry->d_parent->d_inode;
-+      
++
 +      sb = dir->i_sb;
-+      if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err)))
-+              return NULL;
++      /* NFS may look up ".." - look at dx_root directory block */
++      if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')){
++              if (!(frame = dx_probe(dentry, 0, &hinfo, frames, err)))
++                      return NULL;
++      } else {
++              frame = frames;
++              frame->bh = NULL;                       /* for dx_release() */
++              frame->at = (struct dx_entry *)frames;  /* hack for zero entry*/
++              dx_set_block(frame->at, 0);             /* dx_root block is 0 */
++      }
 +      hash = hinfo.hash;
 +      do {
 +              block = dx_get_block(frame->at);
 +              if (!(bh = ext3_bread (NULL,dir, block, 0, err)))
 +                      goto errout;
 +              de = (struct ext3_dir_entry_2 *) bh->b_data;
-+              top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize -
++              top = (struct ext3_dir_entry_2 *)((char *)de + sb->s_blocksize -
 +                                     EXT3_DIR_REC_LEN(0));
 +              for (; de < top; de = ext3_next_entry(de))
 +              if (ext3_match (namelen, name, de)) {
index 28a1ad6..c5e1ee0 100644 (file)
                        ret = bh;
                        goto cleanup_and_exit;
                } else {
-@@ -196,6 +849,66 @@ cleanup_and_exit:
+@@ -196,6 +849,74 @@ cleanup_and_exit:
        return ret;
  }
  
 +      int namelen = dentry->d_name.len;
 +      const u8 *name = dentry->d_name.name;
 +      struct inode *dir = dentry->d_parent->d_inode;
-+      
++
 +      sb = dir->i_sb;
-+      if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err)))
-+              return NULL;
++      /* NFS may look up ".." - look at dx_root directory block */
++      if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')){
++              if (!(frame = dx_probe(dentry, 0, &hinfo, frames, err)))
++                      return NULL;
++      } else {
++              frame = frames;
++              frame->bh = NULL;                       /* for dx_release() */
++              frame->at = (struct dx_entry *)frames;  /* hack for zero entry*/
++              dx_set_block(frame->at, 0);             /* dx_root block is 0 */
++      }
 +      hash = hinfo.hash;
 +      do {
 +              block = dx_get_block(frame->at);
 +              if (!(bh = ext3_bread (NULL,dir, block, 0, err)))
 +                      goto errout;
 +              de = (struct ext3_dir_entry_2 *) bh->b_data;
-+              top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize -
++              top = (struct ext3_dir_entry_2 *)((char *)de + sb->s_blocksize -
 +                                     EXT3_DIR_REC_LEN(0));
 +              for (; de < top; de = ext3_next_entry(de))
 +              if (ext3_match (namelen, name, de)) {
index 5fb5951..c42156b 100644 (file)
@@ -1328,7 +1328,7 @@ Index: linux-2.4.21/fs/ext3/namei.c
                        ret = bh;
                        goto cleanup_and_exit;
                } else {
-@@ -198,6 +863,66 @@
+@@ -198,6 +863,74 @@
        return ret;
  }
  
@@ -1347,17 +1347,25 @@ Index: linux-2.4.21/fs/ext3/namei.c
 +      int namelen = dentry->d_name.len;
 +      const u8 *name = dentry->d_name.name;
 +      struct inode *dir = dentry->d_parent->d_inode;
-+      
++
 +      sb = dir->i_sb;
-+      if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err)))
-+              return NULL;
++      /* NFS may look up ".." - look at dx_root directory block */
++      if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')){
++              if (!(frame = dx_probe(dentry, 0, &hinfo, frames, err)))
++                      return NULL;
++      } else {
++              frame = frames;
++              frame->bh = NULL;                       /* for dx_release() */
++              frame->at = (struct dx_entry *)frames;  /* hack for zero entry*/
++              dx_set_block(frame->at, 0);             /* dx_root block is 0 */
++      }
 +      hash = hinfo.hash;
 +      do {
 +              block = dx_get_block(frame->at);
 +              if (!(bh = ext3_bread (NULL,dir, block, 0, err)))
 +                      goto errout;
 +              de = (struct ext3_dir_entry_2 *) bh->b_data;
-+              top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize -
++              top = (struct ext3_dir_entry_2 *)((char *)de + sb->s_blocksize -
 +                                     EXT3_DIR_REC_LEN(0));
 +              for (; de < top; de = ext3_next_entry(de))
 +              if (ext3_match (namelen, name, de)) {
@@ -2521,16 +2529,3 @@ Index: linux-2.4.21/include/linux/ext3_jbd.h
  int
  ext3_mark_iloc_dirty(handle_t *handle, 
                     struct inode *inode,
-Index: linux-2.4.21/lib/rbtree.c
-===================================================================
---- linux-2.4.21.orig/lib/rbtree.c     2004-09-11 10:16:18.000000000 -0400
-+++ linux-2.4.21/lib/rbtree.c  2004-09-16 19:40:16.000000000 -0400
-@@ -17,6 +17,8 @@
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-   linux/lib/rbtree.c
-+
-+  rb_get_first and rb_get_next written by Theodore Ts'o, 9/8/2002
- */
- #include <linux/rbtree.h>
index ca2cacf..7895513 100644 (file)
                        ret = bh;
                        goto cleanup_and_exit;
                } else {
-@@ -197,6 +862,66 @@ cleanup_and_exit:
+@@ -197,6 +862,74 @@ cleanup_and_exit:
        return ret;
  }
  
 +      int namelen = dentry->d_name.len;
 +      const u8 *name = dentry->d_name.name;
 +      struct inode *dir = dentry->d_parent->d_inode;
-+      
++
 +      sb = dir->i_sb;
-+      if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err)))
-+              return NULL;
++      /* NFS may look up ".." - look at dx_root directory block */
++      if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')){
++              if (!(frame = dx_probe(dentry, 0, &hinfo, frames, err)))
++                      return NULL;
++      } else {
++              frame = frames;
++              frame->bh = NULL;                       /* for dx_release() */
++              frame->at = (struct dx_entry *)frames;  /* hack for zero entry*/
++              dx_set_block(frame->at, 0);             /* dx_root block is 0 */
++      }
 +      hash = hinfo.hash;
 +      do {
 +              block = dx_get_block(frame->at);
 +              if (!(bh = ext3_bread (NULL,dir, block, 0, err)))
 +                      goto errout;
 +              de = (struct ext3_dir_entry_2 *) bh->b_data;
-+              top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize -
++              top = (struct ext3_dir_entry_2 *)((char *)de + sb->s_blocksize -
 +                                     EXT3_DIR_REC_LEN(0));
 +              for (; de < top; de = ext3_next_entry(de))
 +              if (ext3_match (namelen, name, de)) {
diff --git a/lustre/kernel_patches/patches/ext3-htree-dot-2.6.5-suse.patch b/lustre/kernel_patches/patches/ext3-htree-dot-2.6.5-suse.patch
new file mode 100644 (file)
index 0000000..e8ed192
--- /dev/null
@@ -0,0 +1,23 @@
+Index: linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891/fs/ext3/namei.c
+===================================================================
+--- linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891.orig/fs/ext3/namei.c 2005-04-04 05:06:46.000000000 -0600
++++ linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891/fs/ext3/namei.c      2005-04-04 05:09:18.000000000 -0600
+@@ -926,8 +926,16 @@
+       struct inode *dir = dentry->d_parent->d_inode;
+       sb = dir->i_sb;
+-      if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err)))
+-              return NULL;
++      /* NFS may look up ".." - look at dx_root directory block */
++      if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')){
++              if (!(frame = dx_probe(dentry, NULL, &hinfo, frames, err)))
++                      return NULL;
++      } else {
++              frame = frames;
++              frame->bh = NULL;                       /* for dx_release() */
++              frame->at = (struct dx_entry *)frames;  /* hack for zero entry*/
++              dx_set_block(frame->at, 0);             /* dx_root block is 0 */
++      }
+       hash = hinfo.hash;
+       do {
+               block = dx_get_block(frame->at);
diff --git a/lustre/kernel_patches/patches/ext3-htree-dot-2.6.patch b/lustre/kernel_patches/patches/ext3-htree-dot-2.6.patch
new file mode 100644 (file)
index 0000000..9192112
--- /dev/null
@@ -0,0 +1,23 @@
+Index: linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891/fs/ext3/namei.c
+===================================================================
+--- linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891.orig/fs/ext3/namei.c 2005-04-04 05:06:46.000000000 -0600
++++ linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891/fs/ext3/namei.c      2005-04-04 05:09:18.000000000 -0600
+@@ -926,8 +926,16 @@
+       struct inode *dir = dentry->d_parent->d_inode;
+       sb = dir->i_sb;
+-      if (!(frame = dx_probe(dentry, NULL, &hinfo, frames, err)))
+-              return NULL;
++      /* NFS may look up ".." - look at dx_root directory block */
++      if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')){
++              if (!(frame = dx_probe(dentry, NULL, &hinfo, frames, err)))
++                      return NULL;
++      } else {
++              frame = frames;
++              frame->bh = NULL;                       /* for dx_release() */
++              frame->at = (struct dx_entry *)frames;  /* hack for zero entry*/
++              dx_set_block(frame->at, 0);             /* dx_root block is 0 */
++      }
+       hash = hinfo.hash;
+       do {
+               block = dx_get_block(frame->at);
index 70e7b12..0980162 100644 (file)
@@ -9,3 +9,4 @@ ext3-include-fixes-2.6-rhel4.patch
 ext3-extents-2.6.9-rhel4.patch
 ext3-mballoc2-2.6.9-rhel4.patch 
 ext3-nlinks-2.6.7.patch
+ext3-htree-dot-2.6.patch
index fd05c25..c44eea3 100644 (file)
@@ -10,3 +10,4 @@ ext3-extents-2.6.5.patch
 ext3-mballoc2-2.6-suse.patch
 ext3-nlinks-2.6.7.patch
 ext3-rename-reserve-2.6-suse.patch
+ext3-htree-dot-2.6.5-suse.patch