Whamcloud - gitweb
b=4134
authorgreen <green>
Mon, 27 Sep 2004 11:17:49 +0000 (11:17 +0000)
committergreen <green>
Mon, 27 Sep 2004 11:17:49 +0000 (11:17 +0000)
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.

lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch
lustre/kernel_patches/patches/vfs_intent-2.4.18-18-chaos65.patch
lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch
lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch
lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch
lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch
lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch
lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch
lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch
lustre/tests/sanity.sh

index c2f0e2b..e2b5faa 100644 (file)
@@ -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;
index 4ddd53d..497044f 100644 (file)
@@ -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;
index d8e28ca..340ce7c 100644 (file)
@@ -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;
index 1bb500f..8c3a879 100644 (file)
@@ -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;
index 501e139..0b02eb2 100644 (file)
@@ -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;
index cf51f54..46f1bed 100644 (file)
@@ -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;
index 0e12d54..29dc451 100644 (file)
@@ -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;
index 15af47e..d6b6e52 100644 (file)
@@ -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;
index b51ff06..2d75566 100644 (file)
                                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;
 +                              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)) {
index 5d6a069..fc5ced6 100644 (file)
@@ -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