From f30469fc21e7bce66be09e1b7c1784243b7043a5 Mon Sep 17 00:00:00 2001 From: green Date: Mon, 27 Sep 2004 11:17:49 +0000 Subject: [PATCH] b=4134 r=adilger Deliver bug 4134 fixes for 2.4 kernels to b1_2 (already present in b1_4 for some time). Also add a sanity test. --- .../patches/nfs_export_kernel-2.4.21-chaos.patch | 12 ++++++++++++ .../patches/vfs_intent-2.4.18-18-chaos65.patch | 9 ++++++++- .../patches/vfs_intent-2.4.19-suse.patch | 9 ++++++++- .../kernel_patches/patches/vfs_intent-2.4.20-hp.patch | 9 ++++++++- .../kernel_patches/patches/vfs_intent-2.4.20-rh.patch | 9 ++++++++- .../patches/vfs_intent-2.4.20-vanilla.patch | 9 ++++++++- .../patches/vfs_intent-2.4.21-chaos.patch | 7 +++++++ .../patches/vfs_intent-2.4.21-suse2.patch | 9 ++++++++- .../kernel_patches/patches/vfs_intent-2.4.22-rh.patch | 9 ++++++++- lustre/tests/sanity.sh | 18 ++++++++++++++++++ 10 files changed, 93 insertions(+), 7 deletions(-) diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch index c2f0e2b..e2b5faa 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch @@ -630,6 +630,18 @@ Index: linux-2.4.21-chaos/fs/nfsd/vfs.c if (!err) { if (EX_ISSYNC(fhp->fh_export)) nfsd_sync_dir(dentry); +@@ -1148,7 +1329,10 @@ nfsd_symlink(struct svc_rqst *rqstp, str + iap->ia_valid |= ATTR_CTIME; + iap->ia_mode = (iap->ia_mode&S_IALLUGO) + | S_IFLNK; +- err = notify_change(dnew, iap); ++ if (dnew->d_inode->i_op && dnew->d_inode->i_op->setattr_raw) ++ err = setattr_raw(dnew->d_inode, iap); ++ else ++ err = notify_change(dnew, iap); + if (err) + err = nfserrno(err); + else if (EX_ISSYNC(fhp->fh_export)) @@ -1211,7 +1392,10 @@ dold = tfhp->fh_dentry; dest = dold->d_inode; diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.18-18-chaos65.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.18-18-chaos65.patch index 4ddd53d..497044f 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.18-18-chaos65.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.18-18-chaos65.patch @@ -458,7 +458,7 @@ Index: linux-2.4.18-p4smp/fs/namei.c break; } goto return_base; -@@ -645,6 +684,27 @@ return_reval: +@@ -645,6 +684,34 @@ return_reval: * Check the cached dentry for staleness. */ dentry = nd->dentry; @@ -482,6 +482,13 @@ Index: linux-2.4.18-p4smp/fs/namei.c + } + if (!nd->dentry->d_inode) + goto no_inode; ++ if (lookup_flags & LOOKUP_DIRECTORY) { ++ err = -ENOTDIR; ++ if (!nd->dentry->d_inode->i_op || ++ (!nd->dentry->d_inode->i_op->lookup && ++ !nd->dentry->d_inode->i_op->lookup_it)) ++ break; ++ } + } else if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { err = -ESTALE; diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch index d8e28ca..340ce7c 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch @@ -302,7 +302,7 @@ Index: linux-2.4.19.SuSE/fs/namei.c break; } goto return_base; -@@ -643,6 +681,25 @@ +@@ -643,6 +681,32 @@ * Check the cached dentry for staleness. */ dentry = nd->dentry; @@ -326,6 +326,13 @@ Index: linux-2.4.19.SuSE/fs/namei.c + } + if (!nd->dentry->d_inode) + goto no_inode; ++ if (lookup_flags & LOOKUP_DIRECTORY) { ++ err = -ENOTDIR; ++ if (!nd->dentry->d_inode->i_op || ++ (!nd->dentry->d_inode->i_op->lookup && ++ !nd->dentry->d_inode->i_op->lookup_it)) ++ break; ++ } + } else if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { err = -ESTALE; diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch index 1bb500f..8c3a879 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch @@ -474,7 +474,7 @@ Index: linux/fs/namei.c break; } goto return_base; -@@ -633,6 +687,27 @@ +@@ -633,6 +687,34 @@ * Check the cached dentry for staleness. */ dentry = nd->dentry; @@ -498,6 +498,13 @@ Index: linux/fs/namei.c + } + if (!nd->dentry->d_inode) + goto no_inode; ++ if (lookup_flags & LOOKUP_DIRECTORY) { ++ err = -ENOTDIR; ++ if (!nd->dentry->d_inode->i_op || ++ (!nd->dentry->d_inode->i_op->lookup && ++ !nd->dentry->d_inode->i_op->lookup_it)) ++ break; ++ } + } else if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { err = -ESTALE; diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch index 501e139..0b02eb2 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch @@ -364,7 +364,7 @@ Index: linux-2.4.20/fs/namei.c break; } goto return_base; -@@ -645,6 +698,27 @@ +@@ -645,6 +698,34 @@ * Check the cached dentry for staleness. */ dentry = nd->dentry; @@ -388,6 +388,13 @@ Index: linux-2.4.20/fs/namei.c + } + if (!nd->dentry->d_inode) + goto no_inode; ++ if (lookup_flags & LOOKUP_DIRECTORY) { ++ err = -ENOTDIR; ++ if (!nd->dentry->d_inode->i_op || ++ (!nd->dentry->d_inode->i_op->lookup && ++ !nd->dentry->d_inode->i_op->lookup_it)) ++ break; ++ } + } else if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { err = -ESTALE; diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch index cf51f54..46f1bed 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch @@ -411,7 +411,7 @@ Index: linux-2.4.24/fs/namei.c break; } goto return_base; -@@ -635,6 +672,27 @@ return_reval: +@@ -635,6 +672,34 @@ return_reval: * Check the cached dentry for staleness. */ dentry = nd->dentry; @@ -435,6 +435,13 @@ Index: linux-2.4.24/fs/namei.c + } + if (!nd->dentry->d_inode) + goto no_inode; ++ if (lookup_flags & LOOKUP_DIRECTORY) { ++ err = -ENOTDIR; ++ if (!nd->dentry->d_inode->i_op || ++ (!nd->dentry->d_inode->i_op->lookup && ++ !nd->dentry->d_inode->i_op->lookup_it)) ++ break; ++ } + } else if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { err = -ESTALE; diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch index 0e12d54..29dc451 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch @@ -324,6 +324,13 @@ Index: linux-ia64/fs/namei.c + } + if (!nd->dentry->d_inode) + goto no_inode; ++ if (lookup_flags & LOOKUP_DIRECTORY) { ++ err = -ENOTDIR; ++ if (!nd->dentry->d_inode->i_op || ++ (!nd->dentry->d_inode->i_op->lookup && ++ !nd->dentry->d_inode->i_op->lookup_it)) ++ break; ++ } + } else if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { err = -ESTALE; diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch index 15af47e..d6b6e52 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch @@ -300,7 +300,7 @@ Index: linux-2.4.21-x86_64/fs/namei.c break; } goto return_base; -@@ -643,6 +680,27 @@ +@@ -643,6 +680,34 @@ * Check the cached dentry for staleness. */ dentry = nd->dentry; @@ -324,6 +324,13 @@ Index: linux-2.4.21-x86_64/fs/namei.c + } + if (!nd->dentry->d_inode) + goto no_inode; ++ if (lookup_flags & LOOKUP_DIRECTORY) { ++ err = -ENOTDIR; ++ if (!nd->dentry->d_inode->i_op || ++ (!nd->dentry->d_inode->i_op->lookup && ++ !nd->dentry->d_inode->i_op->lookup_it)) ++ break; ++ } + } else if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { err = -ESTALE; diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch index b51ff06..2d75566 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch @@ -288,7 +288,7 @@ break; } goto return_base; -@@ -635,6 +672,25 @@ return_reval: +@@ -635,6 +672,32 @@ return_reval: * Check the cached dentry for staleness. */ dentry = nd->dentry; @@ -310,6 +310,13 @@ + dput(dentry); + nd->dentry = new; + } ++ if (lookup_flags & LOOKUP_DIRECTORY) { ++ err = -ENOTDIR; ++ if (!nd->dentry->d_inode->i_op || ++ (!nd->dentry->d_inode->i_op->lookup && ++ !nd->dentry->d_inode->i_op->lookup_it)) ++ break; ++ } + } else if (dentry && dentry->d_sb && (dentry->d_sb->s_type->fs_flags & FS_ALWAYS_REVAL)) { diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 5d6a069..fc5ced6 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -1671,6 +1671,24 @@ test_48d() { # bug 2350 } run_test 48d "Access removed parent subdir (should return errors)" +test_48e() { # bug 4134 +# check_kernel_version 36 || return 0 + #sysctl -w portals.debug=-1 + #set -vx + mkdir -p $DIR/d48e/dir + # On a buggy kernel addition of "; touch file" after cd .. will + # produce kernel oops in lookup_hash_it + ( cd $DIR/d48e/dir ; sleep 2 ; cd -P .. ) & + cdpid=$! + $TRACE rmdir $DIR/d48e/dir || error "remove cwd $DIR/d48e/dir failed" + $TRACE rmdir $DIR/d48e || error "remove parent $DIR/d48e failed" + $TRACE touch $DIR/d48e || error "'touch $DIR/d48e' failed" + $TRACE chmod +x $DIR/d48e || error "'chmod +x $DIR/d48e' failed" + $TRACE wait $cdpid && error "'cd ..' worked after recreate parent" + $TRACE rm $DIR/d48e || error "'$DIR/d48e' failed" +} +run_test 48e "Access to removed and recreated parent subdir (should return errors)" + test_50() { # bug 1485 mkdir $DIR/d50 -- 1.8.3.1