From 9dd3b93b1f85c1755b7419a74fadfc5f9a805659 Mon Sep 17 00:00:00 2001 From: adilger Date: Wed, 1 Jun 2005 18:45:09 +0000 Subject: [PATCH] Branch b1_4 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 --- .../patches/ext3-htree-dot-2.6.patch | 23 ++++++++++++++++ .../kernel_patches/series/ldiskfs-2.6-rhel4.series | 1 + .../kernel_patches/series/ldiskfs-2.6-suse.series | 1 + lustre/ChangeLog | 7 +++++ .../patches/ext-2.4-patch-1-2.4.19-suse.patch | 18 +++++++++---- .../kernel_patches/patches/ext-2.4-patch-1.patch | 18 +++++++++---- .../patches/ext3-htree-2.4.21-rhel.patch | 31 +++++++++------------- .../patches/ext3-htree-2.4.22-rh.patch | 18 +++++++++---- .../patches/ext3-htree-dot-2.6.5-suse.patch | 23 ++++++++++++++++ .../patches/ext3-htree-dot-2.6.patch | 23 ++++++++++++++++ .../kernel_patches/series/ldiskfs-2.6-rhel4.series | 1 + .../kernel_patches/series/ldiskfs-2.6-suse.series | 1 + 12 files changed, 132 insertions(+), 33 deletions(-) create mode 100644 ldiskfs/kernel_patches/patches/ext3-htree-dot-2.6.patch create mode 100644 lustre/kernel_patches/patches/ext3-htree-dot-2.6.5-suse.patch create mode 100644 lustre/kernel_patches/patches/ext3-htree-dot-2.6.patch 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 index 0000000..9192112 --- /dev/null +++ b/ldiskfs/kernel_patches/patches/ext3-htree-dot-2.6.patch @@ -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); diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series index 70e7b12..0980162 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series @@ -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 diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series index fd05c25..c44eea3 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series @@ -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 diff --git a/lustre/ChangeLog b/lustre/ChangeLog index c7ae56f..1f5faab 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -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. diff --git a/lustre/kernel_patches/patches/ext-2.4-patch-1-2.4.19-suse.patch b/lustre/kernel_patches/patches/ext-2.4-patch-1-2.4.19-suse.patch index a6b126e..1cdaa93 100644 --- a/lustre/kernel_patches/patches/ext-2.4-patch-1-2.4.19-suse.patch +++ b/lustre/kernel_patches/patches/ext-2.4-patch-1-2.4.19-suse.patch @@ -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)) { diff --git a/lustre/kernel_patches/patches/ext-2.4-patch-1.patch b/lustre/kernel_patches/patches/ext-2.4-patch-1.patch index 28a1ad6..c5e1ee0 100644 --- a/lustre/kernel_patches/patches/ext-2.4-patch-1.patch +++ b/lustre/kernel_patches/patches/ext-2.4-patch-1.patch @@ -1303,7 +1303,7 @@ ret = bh; goto cleanup_and_exit; } else { -@@ -196,6 +849,66 @@ cleanup_and_exit: +@@ -196,6 +849,74 @@ cleanup_and_exit: return ret; } @@ -1322,17 +1322,25 @@ + 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-2.4.21-rhel.patch b/lustre/kernel_patches/patches/ext3-htree-2.4.21-rhel.patch index 5fb5951..c42156b 100644 --- a/lustre/kernel_patches/patches/ext3-htree-2.4.21-rhel.patch +++ b/lustre/kernel_patches/patches/ext3-htree-2.4.21-rhel.patch @@ -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 diff --git a/lustre/kernel_patches/patches/ext3-htree-2.4.22-rh.patch b/lustre/kernel_patches/patches/ext3-htree-2.4.22-rh.patch index ca2cacf..7895513 100644 --- a/lustre/kernel_patches/patches/ext3-htree-2.4.22-rh.patch +++ b/lustre/kernel_patches/patches/ext3-htree-2.4.22-rh.patch @@ -1318,7 +1318,7 @@ ret = bh; goto cleanup_and_exit; } else { -@@ -197,6 +862,66 @@ cleanup_and_exit: +@@ -197,6 +862,74 @@ cleanup_and_exit: return ret; } @@ -1337,17 +1337,25 @@ + 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 index 0000000..e8ed192 --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-htree-dot-2.6.5-suse.patch @@ -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 index 0000000..9192112 --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-htree-dot-2.6.patch @@ -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); diff --git a/lustre/kernel_patches/series/ldiskfs-2.6-rhel4.series b/lustre/kernel_patches/series/ldiskfs-2.6-rhel4.series index 70e7b12..0980162 100644 --- a/lustre/kernel_patches/series/ldiskfs-2.6-rhel4.series +++ b/lustre/kernel_patches/series/ldiskfs-2.6-rhel4.series @@ -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 diff --git a/lustre/kernel_patches/series/ldiskfs-2.6-suse.series b/lustre/kernel_patches/series/ldiskfs-2.6-suse.series index fd05c25..c44eea3 100644 --- a/lustre/kernel_patches/series/ldiskfs-2.6-suse.series +++ b/lustre/kernel_patches/series/ldiskfs-2.6-suse.series @@ -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 -- 1.8.3.1