Whamcloud - gitweb
b=3772
[fs/lustre-release.git] / lustre / kernel_patches / patches / vfs_intent-2.4.21-chaos.patch
index 1ceb50d..be9054e 100644 (file)
  kernel/ksyms.c            |    1 
  12 files changed, 558 insertions(+), 128 deletions(-)
 
-Index: linux-2.4.21-chaos/fs/dcache.c
+Index: linux-ia64/fs/dcache.c
 ===================================================================
---- linux-2.4.21-chaos.orig/fs/dcache.c        2003-09-19 03:49:54.000000000 +0400
-+++ linux-2.4.21-chaos/fs/dcache.c     2003-12-12 17:02:47.000000000 +0300
-@@ -186,6 +186,13 @@
+--- linux-ia64.orig/fs/dcache.c        2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/fs/dcache.c     2004-03-17 16:05:28.000000000 -0800
+@@ -186,6 +186,13 @@ int d_invalidate(struct dentry * dentry)
                spin_unlock(&dcache_lock);
                return 0;
        }
@@ -30,7 +30,7 @@ Index: linux-2.4.21-chaos/fs/dcache.c
        /*
         * Check whether to do a partial shrink_dcache
         * to get rid of unused child entries.
-@@ -847,13 +854,19 @@
+@@ -850,13 +857,19 @@ void d_delete(struct dentry * dentry)
   * Adds a dentry to the hash according to its name.
   */
   
@@ -53,11 +53,11 @@ Index: linux-2.4.21-chaos/fs/dcache.c
  }
  
  #define do_switch(x,y) do { \
-Index: linux-2.4.21-chaos/fs/exec.c
+Index: linux-ia64/fs/exec.c
 ===================================================================
---- linux-2.4.21-chaos.orig/fs/exec.c  2003-12-05 07:55:47.000000000 +0300
-+++ linux-2.4.21-chaos/fs/exec.c       2003-12-12 17:02:47.000000000 +0300
-@@ -119,8 +119,10 @@
+--- linux-ia64.orig/fs/exec.c  2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/fs/exec.c       2004-03-17 16:05:28.000000000 -0800
+@@ -119,8 +119,10 @@ asmlinkage long sys_uselib(const char * 
        struct file * file;
        struct nameidata nd;
        int error;
@@ -69,7 +69,7 @@ Index: linux-2.4.21-chaos/fs/exec.c
        if (error)
                goto out;
  
-@@ -132,7 +134,8 @@
+@@ -132,7 +134,8 @@ asmlinkage long sys_uselib(const char * 
        if (error)
                goto exit;
  
@@ -79,7 +79,7 @@ Index: linux-2.4.21-chaos/fs/exec.c
        error = PTR_ERR(file);
        if (IS_ERR(file))
                goto out;
-@@ -400,8 +403,10 @@
+@@ -400,8 +403,10 @@ struct file *open_exec(const char *name)
        struct inode *inode;
        struct file *file;
        int err = 0;
@@ -91,7 +91,7 @@ Index: linux-2.4.21-chaos/fs/exec.c
        file = ERR_PTR(err);
        if (!err) {
                inode = nd.dentry->d_inode;
-@@ -413,7 +418,8 @@
+@@ -413,7 +418,8 @@ struct file *open_exec(const char *name)
                                err = -EACCES;
                        file = ERR_PTR(err);
                        if (!err) {
@@ -101,7 +101,7 @@ Index: linux-2.4.21-chaos/fs/exec.c
                                if (!IS_ERR(file)) {
                                        err = deny_write_access(file);
                                        if (err) {
-@@ -425,6 +431,7 @@
+@@ -425,6 +431,7 @@ out:
                                return file;
                        }
                }
@@ -109,7 +109,7 @@ Index: linux-2.4.21-chaos/fs/exec.c
                path_release(&nd);
        }
        goto out;
-@@ -1348,7 +1355,7 @@
+@@ -1348,7 +1355,7 @@ int do_coredump(long signr, int exit_cod
                goto close_fail;
        if (!file->f_op->write)
                goto close_fail;
@@ -118,10 +118,10 @@ Index: linux-2.4.21-chaos/fs/exec.c
                goto close_fail;
  
        retval = binfmt->core_dump(signr, regs, file);
-Index: linux-2.4.21-chaos/fs/namei.c
+Index: linux-ia64/fs/namei.c
 ===================================================================
---- linux-2.4.21-chaos.orig/fs/namei.c 2003-07-15 04:41:01.000000000 +0400
-+++ linux-2.4.21-chaos/fs/namei.c      2003-12-12 17:03:37.000000000 +0300
+--- linux-ia64.orig/fs/namei.c 2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/fs/namei.c      2004-03-17 16:06:13.000000000 -0800
 @@ -94,6 +94,13 @@
   * XEmacs seems to be relying on it...
   */
@@ -136,7 +136,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  /* In order to reduce some races, while at the same time doing additional
   * checking and hopefully speeding things up, we copy filenames to the
   * kernel data space before using them..
-@@ -260,10 +267,19 @@
+@@ -260,10 +267,19 @@ void path_release(struct nameidata *nd)
   * Internal lookup() using the new generic dcache.
   * SMP-safe
   */
@@ -147,7 +147,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        struct dentry * dentry = d_lookup(parent, name);
  
 +      if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+              if (!dentry->d_op->d_revalidate_it(dentry, flags, it) &&
++              if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) &&
 +                  !d_invalidate(dentry)) {
 +                      dput(dentry);
 +                      dentry = NULL;
@@ -157,7 +157,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
                if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
                        dput(dentry);
-@@ -281,11 +297,15 @@
+@@ -281,11 +297,15 @@ static struct dentry * cached_lookup(str
   * make sure that nobody added the entry to the dcache in the meantime..
   * SMP-safe
   */
@@ -174,22 +174,22 @@ Index: linux-2.4.21-chaos/fs/namei.c
        down(&dir->i_sem);
        /*
         * First re-do the cached lookup just in case it was created
-@@ -300,6 +320,9 @@
+@@ -300,6 +320,9 @@ static struct dentry * real_lookup(struc
                result = ERR_PTR(-ENOMEM);
                if (dentry) {
                        lock_kernel();
 +                      if (dir->i_op->lookup_it)
-+                              result = dir->i_op->lookup_it(dir, dentry, it, flags);
++                              result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags);
 +                      else
                        result = dir->i_op->lookup(dir, dentry);
                        unlock_kernel();
                        if (result)
-@@ -321,6 +344,15 @@
+@@ -321,6 +344,15 @@ static struct dentry * real_lookup(struc
                        dput(result);
                        result = ERR_PTR(-ENOENT);
                }
 +      } else if (result->d_op && result->d_op->d_revalidate_it) {
-+              if (!result->d_op->d_revalidate_it(result, flags, it) &&
++              if (!result->d_op->d_revalidate_it(result, flags, NULL, it) &&
 +                  !d_invalidate(result)) {
 +                      dput(result);
 +                      if (counter > 10)
@@ -200,7 +200,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        }
        return result;
  }
-@@ -332,7 +364,8 @@
+@@ -332,7 +364,8 @@ static struct dentry * real_lookup(struc
   * Without that kind of total limit, nasty chains of consecutive
   * symlinks can cause almost arbitrarily long lookups. 
   */
@@ -210,7 +210,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  {
        int err;
        if (current->link_count >= 8)
-@@ -346,10 +379,12 @@
+@@ -346,10 +379,12 @@ static inline int do_follow_link(struct 
        current->link_count++;
        current->total_link_count++;
        UPDATE_ATIME(dentry->d_inode);
@@ -223,7 +223,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        path_release(nd);
        return -ELOOP;
  }
-@@ -447,7 +482,8 @@
+@@ -447,7 +482,8 @@ static inline void follow_dotdot(struct 
   *
   * We expect 'base' to be positive and a directory.
   */
@@ -233,7 +233,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  {
        struct dentry *dentry;
        struct inode *inode;
-@@ -524,12 +560,12 @@
+@@ -524,12 +560,12 @@ int link_path_walk(const char * name, st
                                break;
                }
                /* This does the actual lookups.. */
@@ -248,7 +248,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                        err = PTR_ERR(dentry);
                        if (IS_ERR(dentry))
                                break;
-@@ -547,7 +583,7 @@
+@@ -547,7 +583,7 @@ int link_path_walk(const char * name, st
                        goto out_dput;
  
                if (inode->i_op->follow_link) {
@@ -257,7 +257,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                        dput(dentry);
                        if (err)
                                goto return_err;
-@@ -563,7 +599,7 @@
+@@ -563,7 +599,7 @@ int link_path_walk(const char * name, st
                        nd->dentry = dentry;
                }
                err = -ENOTDIR; 
@@ -266,7 +266,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                        break;
                continue;
                /* here ends the main loop */
-@@ -590,12 +626,12 @@
+@@ -590,12 +626,12 @@ last_component:
                        if (err < 0)
                                break;
                }
@@ -281,7 +281,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                        err = PTR_ERR(dentry);
                        if (IS_ERR(dentry))
                                break;
-@@ -605,7 +641,7 @@
+@@ -605,7 +641,7 @@ last_component:
                inode = dentry->d_inode;
                if ((lookup_flags & LOOKUP_FOLLOW)
                    && inode && inode->i_op && inode->i_op->follow_link) {
@@ -290,7 +290,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                        dput(dentry);
                        if (err)
                                goto return_err;
-@@ -619,7 +655,8 @@
+@@ -619,7 +655,8 @@ last_component:
                        goto no_inode;
                if (lookup_flags & LOOKUP_DIRECTORY) {
                        err = -ENOTDIR; 
@@ -300,33 +300,35 @@ Index: linux-2.4.21-chaos/fs/namei.c
                                break;
                }
                goto return_base;
-@@ -643,6 +680,25 @@
+@@ -643,6 +680,27 @@ return_reval:
                 * Check the cached dentry for staleness.
                 */
                dentry = nd->dentry;
 +              if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
 +                      err = -ESTALE;
-+                      if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) {
++                      if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) {
 +                              struct dentry *new;
 +                              err = permission(dentry->d_parent->d_inode,
-+                                              MAY_EXEC);
++                                               MAY_EXEC);
 +                              if (err)
 +                                      break;
 +                              new = real_lookup(dentry->d_parent,
-+                                              &dentry->d_name, 0, NULL);
-+                              d_invalidate(dentry);
-+                              dput(dentry);
-+                              if (IS_ERR(new)) { 
++                                                &dentry->d_name, 0, it);
++                              if (IS_ERR(new)) {
 +                                      err = PTR_ERR(new);
 +                                      break;
 +                              }
++                              d_invalidate(dentry);
++                              dput(dentry);
 +                              nd->dentry = new;
 +                      }
++                      if (!nd->dentry->d_inode)
++                              goto no_inode;
 +              } else
                if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
                        err = -ESTALE;
                        if (!dentry->d_op->d_revalidate(dentry, 0)) {
-@@ -656,15 +712,28 @@
+@@ -656,15 +714,28 @@ out_dput:
                dput(dentry);
                break;
        }
@@ -356,7 +358,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  }
  
  /* SMP-safe */
-@@ -749,6 +818,17 @@
+@@ -749,6 +820,17 @@ walk_init_root(const char *name, struct 
  }
  
  /* SMP-safe */
@@ -374,7 +376,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  int path_lookup(const char *path, unsigned flags, struct nameidata *nd)
  {
        int error = 0;
-@@ -763,6 +843,7 @@
+@@ -763,6 +845,7 @@ int path_init(const char *name, unsigned
  {
        nd->last_type = LAST_ROOT; /* if there are only slashes... */
        nd->flags = flags;
@@ -382,7 +384,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        if (*name=='/')
                return walk_init_root(name,nd);
        read_lock(&current->fs->lock);
-@@ -777,7 +858,8 @@
+@@ -777,7 +860,8 @@ int path_init(const char *name, unsigned
   * needs parent already locked. Doesn't follow mounts.
   * SMP-safe.
   */
@@ -392,7 +394,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  {
        struct dentry * dentry;
        struct inode *inode;
-@@ -800,13 +882,16 @@
+@@ -800,13 +884,16 @@ struct dentry * lookup_hash(struct qstr 
                        goto out;
        }
  
@@ -405,12 +407,12 @@ Index: linux-2.4.21-chaos/fs/namei.c
                        goto out;
                lock_kernel();
 +              if (inode->i_op->lookup_it)
-+                      dentry = inode->i_op->lookup_it(inode, new, it, 0);
++                      dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0);
 +              else
                dentry = inode->i_op->lookup(inode, new);
                unlock_kernel();
                if (!dentry)
-@@ -818,6 +903,12 @@
+@@ -818,6 +905,12 @@ out:
        return dentry;
  }
  
@@ -423,7 +425,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  /* SMP-safe */
  struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
  {
-@@ -839,7 +930,7 @@
+@@ -839,7 +932,7 @@ struct dentry * lookup_one_len(const cha
        }
        this.hash = end_name_hash(hash);
  
@@ -432,7 +434,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  access:
        return ERR_PTR(-EACCES);
  }
-@@ -870,6 +961,23 @@
+@@ -870,6 +963,23 @@ int __user_walk(const char *name, unsign
        return err;
  }
  
@@ -456,7 +458,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  /*
   * It's inline, so penalty for filesystems that don't use sticky bit is
   * minimal.
-@@ -967,7 +1075,8 @@
+@@ -967,7 +1077,8 @@ static inline int lookup_flags(unsigned 
        return retval;
  }
  
@@ -466,7 +468,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  {
        int error;
  
-@@ -980,12 +1089,15 @@
+@@ -980,12 +1091,15 @@ int vfs_create(struct inode *dir, struct
                goto exit_lock;
  
        error = -EACCES;        /* shouldn't it be ENOSYS? */
@@ -484,7 +486,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        unlock_kernel();
  exit_lock:
        up(&dir->i_zombie);
-@@ -994,6 +1106,11 @@
+@@ -994,6 +1108,11 @@ exit_lock:
        return error;
  }
  
@@ -496,7 +498,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  /*
   *    open_namei()
   *
-@@ -1008,7 +1125,8 @@
+@@ -1008,7 +1127,8 @@ exit_lock:
   * for symlinks (where the permissions are checked later).
   * SMP-safe
   */
@@ -506,7 +508,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  {
        int acc_mode, error = 0;
        struct inode *inode;
-@@ -1018,11 +1136,14 @@
+@@ -1018,11 +1138,14 @@ int open_namei(const char * pathname, in
  
        acc_mode = ACC_MODE(flag);
  
@@ -522,7 +524,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                if (error)
                        return error;
                dentry = nd->dentry;
-@@ -1032,6 +1153,10 @@
+@@ -1032,6 +1155,10 @@ int open_namei(const char * pathname, in
        /*
         * Create - we need to know the parent.
         */
@@ -533,7 +535,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        error = path_lookup(pathname, LOOKUP_PARENT, nd);
        if (error)
                return error;
-@@ -1047,7 +1172,7 @@
+@@ -1047,7 +1174,7 @@ int open_namei(const char * pathname, in
  
        dir = nd->dentry;
        down(&dir->d_inode->i_sem);
@@ -542,7 +544,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  
  do_last:
        error = PTR_ERR(dentry);
-@@ -1056,11 +1181,12 @@
+@@ -1056,11 +1183,12 @@ do_last:
                goto exit;
        }
  
@@ -552,11 +554,11 @@ Index: linux-2.4.21-chaos/fs/namei.c
                if (!IS_POSIXACL(dir->d_inode))
                        mode &= ~current->fs->umask;
 -              error = vfs_create(dir->d_inode, dentry, mode);
-+              error = vfs_create_it(dir->d_inode, dentry, mode, it);
++              error = vfs_create_it(dir->d_inode, dentry, mode, it);
                up(&dir->d_inode->i_sem);
                dput(nd->dentry);
                nd->dentry = dentry;
-@@ -1164,7 +1290,7 @@
+@@ -1164,7 +1292,7 @@ ok:
                if (!error) {
                        DQUOT_INIT(inode);
                        
@@ -565,7 +567,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                }
                put_write_access(inode);
                if (error)
-@@ -1176,8 +1302,10 @@
+@@ -1176,8 +1304,10 @@ ok:
        return 0;
  
  exit_dput:
@@ -576,7 +578,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        path_release(nd);
        return error;
  
-@@ -1196,7 +1324,10 @@
+@@ -1196,7 +1326,10 @@ do_link:
         * are done. Procfs-like symlinks just set LAST_BIND.
         */
        UPDATE_ATIME(dentry->d_inode);
@@ -587,7 +589,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        dput(dentry);
        if (error)
                return error;
-@@ -1218,13 +1349,20 @@
+@@ -1218,13 +1351,20 @@ do_link:
        }
        dir = nd->dentry;
        down(&dir->d_inode->i_sem);
@@ -605,12 +607,12 @@ Index: linux-2.4.21-chaos/fs/namei.c
 +
  /* SMP-safe */
 -static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
-+static struct dentry *lookup_create(struct nameidata *nd, int is_dir,
++struct dentry *lookup_create(struct nameidata *nd, int is_dir,
 +                                  struct lookup_intent *it)
  {
        struct dentry *dentry;
  
-@@ -1232,7 +1370,7 @@
+@@ -1232,7 +1372,7 @@ static struct dentry *lookup_create(stru
        dentry = ERR_PTR(-EEXIST);
        if (nd->last_type != LAST_NORM)
                goto fail;
@@ -619,12 +621,16 @@ Index: linux-2.4.21-chaos/fs/namei.c
        if (IS_ERR(dentry))
                goto fail;
        if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1288,7 +1426,16 @@
+@@ -1288,7 +1428,20 @@ asmlinkage long sys_mknod(const char * f
        error = path_lookup(tmp, LOOKUP_PARENT, &nd);
        if (error)
                goto out;
 -      dentry = lookup_create(&nd, 0);
 +
++      if (nd.last_type != LAST_NORM) {
++              error = -EEXIST;
++              goto out2;
++      }
 +      if (nd.dentry->d_inode->i_op->mknod_raw) {
 +              struct inode_operations *op = nd.dentry->d_inode->i_op;
 +              error = op->mknod_raw(&nd, mode, dev);
@@ -637,7 +643,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        error = PTR_ERR(dentry);
  
        if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1310,6 +1457,7 @@
+@@ -1310,6 +1463,7 @@ asmlinkage long sys_mknod(const char * f
                dput(dentry);
        }
        up(&nd.dentry->d_inode->i_sem);
@@ -645,11 +651,15 @@ Index: linux-2.4.21-chaos/fs/namei.c
        path_release(&nd);
  out:
        putname(tmp);
-@@ -1357,7 +1505,14 @@
+@@ -1357,7 +1511,18 @@ asmlinkage long sys_mkdir(const char * p
                error = path_lookup(tmp, LOOKUP_PARENT, &nd);
                if (error)
                        goto out;
 -              dentry = lookup_create(&nd, 1);
++              if (nd.last_type != LAST_NORM) {
++                      error = -EEXIST;
++                      goto out2;
++              }
 +              if (nd.dentry->d_inode->i_op->mkdir_raw) {
 +                      struct inode_operations *op = nd.dentry->d_inode->i_op;
 +                      error = op->mkdir_raw(&nd, mode);
@@ -661,7 +671,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                error = PTR_ERR(dentry);
                if (!IS_ERR(dentry)) {
                        if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1366,6 +1521,7 @@
+@@ -1366,6 +1531,7 @@ asmlinkage long sys_mkdir(const char * p
                        dput(dentry);
                }
                up(&nd.dentry->d_inode->i_sem);
@@ -669,7 +679,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                path_release(&nd);
  out:
                putname(tmp);
-@@ -1466,8 +1622,16 @@
+@@ -1466,8 +1632,16 @@ asmlinkage long sys_rmdir(const char * p
                        error = -EBUSY;
                        goto exit1;
        }
@@ -687,7 +697,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        error = PTR_ERR(dentry);
        if (!IS_ERR(dentry)) {
                error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1525,8 +1689,15 @@
+@@ -1525,8 +1699,15 @@ asmlinkage long sys_unlink(const char * 
        error = -EISDIR;
        if (nd.last_type != LAST_NORM)
                goto exit1;
@@ -704,11 +714,15 @@ Index: linux-2.4.21-chaos/fs/namei.c
        error = PTR_ERR(dentry);
        if (!IS_ERR(dentry)) {
                /* Why not before? Because we want correct error value */
-@@ -1593,15 +1764,23 @@
+@@ -1593,15 +1774,27 @@ asmlinkage long sys_symlink(const char *
                error = path_lookup(to, LOOKUP_PARENT, &nd);
                if (error)
                        goto out;
 -              dentry = lookup_create(&nd, 0);
++              if (nd.last_type != LAST_NORM) {
++                      error = -EEXIST;
++                      goto out2;
++              }
 +              if (nd.dentry->d_inode->i_op->symlink_raw) {
 +                      struct inode_operations *op = nd.dentry->d_inode->i_op;
 +                      error = op->symlink_raw(&nd, from);
@@ -730,11 +744,15 @@ Index: linux-2.4.21-chaos/fs/namei.c
                putname(to);
        }
        putname(from);
-@@ -1677,7 +1856,14 @@
+@@ -1677,7 +1870,18 @@ asmlinkage long sys_link(const char * ol
                error = -EXDEV;
                if (old_nd.mnt != nd.mnt)
                        goto out_release;
 -              new_dentry = lookup_create(&nd, 0);
++              if (nd.last_type != LAST_NORM) {
++                      error = -EEXIST;
++                      goto out_release;
++              }
 +              if (nd.dentry->d_inode->i_op->link_raw) {
 +                      struct inode_operations *op = nd.dentry->d_inode->i_op;
 +                      error = op->link_raw(&old_nd, &nd);
@@ -746,7 +764,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
                error = PTR_ERR(new_dentry);
                if (!IS_ERR(new_dentry)) {
                        error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1721,7 +1907,7 @@
+@@ -1721,7 +1925,7 @@ exit:
   *       locking].
   */
  int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
@@ -755,7 +773,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  {
        int error;
        struct inode *target;
-@@ -1800,7 +1986,7 @@
+@@ -1800,7 +2004,7 @@ out_unlock:
  }
  
  int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
@@ -764,7 +782,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  {
        int error;
  
-@@ -1888,9 +2074,18 @@
+@@ -1888,9 +2092,18 @@ static inline int do_rename(const char *
        if (newnd.last_type != LAST_NORM)
                goto exit2;
  
@@ -784,7 +802,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        error = PTR_ERR(old_dentry);
        if (IS_ERR(old_dentry))
                goto exit3;
-@@ -1906,16 +2101,16 @@
+@@ -1906,16 +2119,16 @@ static inline int do_rename(const char *
                if (newnd.last.name[newnd.last.len])
                        goto exit4;
        }
@@ -803,7 +821,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
        dput(new_dentry);
  exit4:
        dput(old_dentry);
-@@ -1966,20 +2161,26 @@
+@@ -1966,20 +2179,26 @@ out:
  }
  
  static inline int
@@ -832,7 +850,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  out:
        if (current->link_count || res || nd->last_type!=LAST_NORM)
                return res;
-@@ -2003,7 +2204,13 @@
+@@ -2003,7 +2222,13 @@ fail:
  
  int vfs_follow_link(struct nameidata *nd, const char *link)
  {
@@ -847,7 +865,7 @@ Index: linux-2.4.21-chaos/fs/namei.c
  }
  
  /* get the link contents into pagecache */
-@@ -2045,7 +2252,7 @@
+@@ -2045,7 +2270,7 @@ int page_follow_link(struct dentry *dent
  {
        struct page *page = NULL;
        char *s = page_getlink(dentry, &page);
@@ -856,11 +874,11 @@ Index: linux-2.4.21-chaos/fs/namei.c
        if (page) {
                kunmap(page);
                page_cache_release(page);
-Index: linux-2.4.21-chaos/fs/namespace.c
+Index: linux-ia64/fs/namespace.c
 ===================================================================
---- linux-2.4.21-chaos.orig/fs/namespace.c     2003-07-15 04:41:01.000000000 +0400
-+++ linux-2.4.21-chaos/fs/namespace.c  2003-12-12 17:02:47.000000000 +0300
-@@ -98,6 +98,7 @@
+--- linux-ia64.orig/fs/namespace.c     2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/fs/namespace.c  2004-03-17 16:05:28.000000000 -0800
+@@ -98,6 +98,7 @@ static void detach_mnt(struct vfsmount *
  {
        old_nd->dentry = mnt->mnt_mountpoint;
        old_nd->mnt = mnt->mnt_parent;
@@ -868,7 +886,7 @@ Index: linux-2.4.21-chaos/fs/namespace.c
        mnt->mnt_parent = mnt;
        mnt->mnt_mountpoint = mnt->mnt_root;
        list_del_init(&mnt->mnt_child);
-@@ -109,6 +110,7 @@
+@@ -109,6 +110,7 @@ static void attach_mnt(struct vfsmount *
  {
        mnt->mnt_parent = mntget(nd->mnt);
        mnt->mnt_mountpoint = dget(nd->dentry);
@@ -876,7 +894,16 @@ Index: linux-2.4.21-chaos/fs/namespace.c
        list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
        list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
        nd->dentry->d_mounted++;
-@@ -488,14 +490,17 @@
+@@ -286,7 +293,7 @@
+       }
+ }
+-static int do_umount(struct vfsmount *mnt, int flags)
++int do_umount(struct vfsmount *mnt, int flags)
+ {
+       struct super_block * sb = mnt->mnt_sb;
+       int retval = 0;
+@@ -488,14 +490,17 @@ static int do_loopback(struct nameidata 
  {
        struct nameidata old_nd;
        struct vfsmount *mnt = NULL;
@@ -896,7 +923,7 @@ Index: linux-2.4.21-chaos/fs/namespace.c
  
        down_write(&current->namespace->sem);
        err = -EINVAL;
-@@ -518,6 +523,7 @@
+@@ -518,6 +523,7 @@ static int do_loopback(struct nameidata 
        }
  
        up_write(&current->namespace->sem);
@@ -904,7 +931,7 @@ Index: linux-2.4.21-chaos/fs/namespace.c
        path_release(&old_nd);
        return err;
  }
-@@ -701,6 +707,7 @@
+@@ -701,6 +707,7 @@ long do_mount(char * dev_name, char * di
                  unsigned long flags, void *data_page)
  {
        struct nameidata nd;
@@ -912,7 +939,7 @@ Index: linux-2.4.21-chaos/fs/namespace.c
        int retval = 0;
        int mnt_flags = 0;
  
-@@ -725,10 +732,11 @@
+@@ -725,9 +732,11 @@ long do_mount(char * dev_name, char * di
        flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
  
        /* ... and get the mountpoint */
@@ -922,12 +949,11 @@ Index: linux-2.4.21-chaos/fs/namespace.c
 +      if (retval) {
 +              intent_release(&it);
                return retval;
--
 +      }
        if (flags & MS_REMOUNT)
                retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
-                                   data_page);
-@@ -739,6 +747,8 @@
+@@ -739,6 +747,8 @@ long do_mount(char * dev_name, char * di
        else
                retval = do_add_mount(&nd, type_page, flags, mnt_flags,
                                      dev_name, data_page);
@@ -936,7 +962,7 @@ Index: linux-2.4.21-chaos/fs/namespace.c
        path_release(&nd);
        return retval;
  }
-@@ -904,6 +914,8 @@
+@@ -904,6 +914,8 @@ asmlinkage long sys_pivot_root(const cha
  {
        struct vfsmount *tmp;
        struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
@@ -945,7 +971,7 @@ Index: linux-2.4.21-chaos/fs/namespace.c
        int error;
  
        if (!capable(CAP_SYS_ADMIN))
-@@ -911,14 +923,14 @@
+@@ -911,14 +923,14 @@ asmlinkage long sys_pivot_root(const cha
  
        lock_kernel();
  
@@ -962,7 +988,7 @@ Index: linux-2.4.21-chaos/fs/namespace.c
        if (error)
                goto out1;
  
-@@ -973,8 +985,10 @@
+@@ -973,8 +985,10 @@ out2:
        up(&old_nd.dentry->d_inode->i_zombie);
        up_write(&current->namespace->sem);
        path_release(&user_nd);
@@ -973,10 +999,10 @@ Index: linux-2.4.21-chaos/fs/namespace.c
        path_release(&new_nd);
  out0:
        unlock_kernel();
-Index: linux-2.4.21-chaos/fs/open.c
+Index: linux-ia64/fs/open.c
 ===================================================================
---- linux-2.4.21-chaos.orig/fs/open.c  2003-07-15 04:41:01.000000000 +0400
-+++ linux-2.4.21-chaos/fs/open.c       2003-12-12 17:02:47.000000000 +0300
+--- linux-ia64.orig/fs/open.c  2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/fs/open.c       2004-03-17 16:05:28.000000000 -0800
 @@ -19,6 +19,8 @@
  #include <asm/uaccess.h>
  
@@ -986,7 +1012,7 @@ Index: linux-2.4.21-chaos/fs/open.c
  
  int vfs_statfs(struct super_block *sb, struct statfs *buf)
  {
-@@ -95,9 +97,10 @@
+@@ -95,9 +97,10 @@ void fd_install(unsigned int fd, struct 
        write_unlock(&files->file_lock);
  }
  
@@ -998,7 +1024,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        int error;
        struct iattr newattrs;
  
-@@ -109,7 +112,13 @@
+@@ -109,7 +112,13 @@ int do_truncate(struct dentry *dentry, l
        down(&inode->i_sem);
        newattrs.ia_size = length;
        newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
@@ -1013,7 +1039,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        up(&inode->i_sem);
        up_write(&inode->i_alloc_sem);
        return error;
-@@ -120,12 +129,13 @@
+@@ -120,12 +129,13 @@ static inline long do_sys_truncate(const
        struct nameidata nd;
        struct inode * inode;
        int error;
@@ -1028,7 +1054,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        if (error)
                goto out;
        inode = nd.dentry->d_inode;
-@@ -165,11 +175,13 @@
+@@ -165,11 +175,13 @@ static inline long do_sys_truncate(const
        error = locks_verify_truncate(inode, NULL, length);
        if (!error) {
                DQUOT_INIT(inode);
@@ -1043,7 +1069,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        path_release(&nd);
  out:
        return error;
-@@ -217,7 +229,7 @@
+@@ -217,7 +229,7 @@ static inline long do_sys_ftruncate(unsi
  
        error = locks_verify_truncate(inode, file, length);
        if (!error)
@@ -1052,7 +1078,7 @@ Index: linux-2.4.21-chaos/fs/open.c
  out_putf:
        fput(file);
  out:
-@@ -262,11 +274,13 @@
+@@ -262,11 +274,13 @@ asmlinkage long sys_utime(char * filenam
        struct inode * inode;
        struct iattr newattrs;
  
@@ -1067,7 +1093,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        error = -EROFS;
        if (IS_RDONLY(inode))
                goto dput_and_out;
-@@ -281,11 +295,25 @@
+@@ -281,11 +295,25 @@ asmlinkage long sys_utime(char * filenam
                        goto dput_and_out;
  
                newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
@@ -1094,7 +1120,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        error = notify_change(nd.dentry, &newattrs);
  dput_and_out:
        path_release(&nd);
-@@ -306,12 +334,14 @@
+@@ -306,12 +334,14 @@ asmlinkage long sys_utimes(char * filena
        struct inode * inode;
        struct iattr newattrs;
  
@@ -1110,7 +1136,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        error = -EROFS;
        if (IS_RDONLY(inode))
                goto dput_and_out;
-@@ -326,7 +356,20 @@
+@@ -326,7 +356,20 @@ asmlinkage long sys_utimes(char * filena
                newattrs.ia_atime = times[0].tv_sec;
                newattrs.ia_mtime = times[1].tv_sec;
                newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
@@ -1132,7 +1158,7 @@ Index: linux-2.4.21-chaos/fs/open.c
                if (current->fsuid != inode->i_uid &&
                    (error = permission(inode,MAY_WRITE)) != 0)
                        goto dput_and_out;
-@@ -349,6 +392,7 @@
+@@ -349,6 +392,7 @@ asmlinkage long sys_access(const char * 
        int old_fsuid, old_fsgid;
        kernel_cap_t old_cap;
        int res;
@@ -1140,7 +1166,7 @@ Index: linux-2.4.21-chaos/fs/open.c
  
        if (mode & ~S_IRWXO)    /* where's F_OK, X_OK, W_OK, R_OK? */
                return -EINVAL;
-@@ -366,13 +410,14 @@
+@@ -366,13 +410,14 @@ asmlinkage long sys_access(const char * 
        else
                current->cap_effective = current->cap_permitted;
  
@@ -1156,7 +1182,7 @@ Index: linux-2.4.21-chaos/fs/open.c
                path_release(&nd);
        }
  
-@@ -387,8 +432,9 @@
+@@ -387,8 +432,9 @@ asmlinkage long sys_chdir(const char * f
  {
        int error;
        struct nameidata nd;
@@ -1167,7 +1193,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        if (error)
                goto out;
  
-@@ -399,6 +445,7 @@
+@@ -399,6 +445,7 @@ asmlinkage long sys_chdir(const char * f
        set_fs_pwd(current->fs, nd.mnt, nd.dentry);
  
  dput_and_out:
@@ -1175,7 +1201,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        path_release(&nd);
  out:
        return error;
-@@ -438,9 +485,10 @@
+@@ -438,9 +485,10 @@ asmlinkage long sys_chroot(const char * 
  {
        int error;
        struct nameidata nd;
@@ -1184,11 +1210,11 @@ Index: linux-2.4.21-chaos/fs/open.c
 -      error = __user_walk(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
 -                    LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
 +      error = __user_walk_it(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
-+                    LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
++                             LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
        if (error)
                goto out;
  
-@@ -456,39 +504,56 @@
+@@ -456,39 +504,56 @@ asmlinkage long sys_chroot(const char * 
        set_fs_altroot();
        error = 0;
  dput_and_out:
@@ -1259,7 +1285,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        fput(file);
  out:
        return err;
-@@ -497,30 +562,14 @@
+@@ -497,30 +562,14 @@ out:
  asmlinkage long sys_chmod(const char * filename, mode_t mode)
  {
        struct nameidata nd;
@@ -1291,7 +1317,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        path_release(&nd);
  out:
        return error;
-@@ -540,6 +589,20 @@
+@@ -540,6 +589,20 @@ static int chown_common(struct dentry * 
        error = -EROFS;
        if (IS_RDONLY(inode))
                goto out;
@@ -1312,7 +1338,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        error = -EPERM;
        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                goto out;
-@@ -644,6 +707,7 @@
+@@ -644,6 +707,7 @@ struct file *filp_open(const char * file
  {
        int namei_flags, error;
        struct nameidata nd;
@@ -1320,7 +1346,7 @@ Index: linux-2.4.21-chaos/fs/open.c
  
        namei_flags = flags;
        if ((namei_flags+1) & O_ACCMODE)
-@@ -651,14 +715,15 @@
+@@ -651,14 +715,15 @@ struct file *filp_open(const char * file
        if (namei_flags & O_TRUNC)
                namei_flags |= 2;
  
@@ -1341,7 +1367,7 @@ Index: linux-2.4.21-chaos/fs/open.c
  {
        struct file * f;
        struct inode *inode;
-@@ -695,7 +760,9 @@
+@@ -695,7 +760,9 @@ struct file *dentry_open(struct dentry *
        }
  
        if (f->f_op && f->f_op->open) {
@@ -1351,7 +1377,7 @@ Index: linux-2.4.21-chaos/fs/open.c
                if (error)
                        goto cleanup_all;
        }
-@@ -708,6 +775,7 @@
+@@ -708,6 +775,7 @@ struct file *dentry_open(struct dentry *
                                        inode->i_mapping->a_ops->direct_sector_IO)))
                goto cleanup_all;
  
@@ -1359,7 +1385,7 @@ Index: linux-2.4.21-chaos/fs/open.c
        return f;
  
  cleanup_all:
-@@ -722,11 +790,17 @@
+@@ -722,11 +790,17 @@ cleanup_all:
  cleanup_file:
        put_filp(f);
  cleanup_dentry:
@@ -1377,11 +1403,11 @@ Index: linux-2.4.21-chaos/fs/open.c
  /*
   * Find an empty file descriptor entry, and mark it busy.
   */
-Index: linux-2.4.21-chaos/fs/stat.c
+Index: linux-ia64/fs/stat.c
 ===================================================================
---- linux-2.4.21-chaos.orig/fs/stat.c  2003-09-19 03:49:54.000000000 +0400
-+++ linux-2.4.21-chaos/fs/stat.c       2003-12-12 17:02:47.000000000 +0300
-@@ -17,10 +17,14 @@
+--- linux-ia64.orig/fs/stat.c  2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/fs/stat.c       2004-03-17 16:06:13.000000000 -0800
+@@ -17,10 +17,12 @@
   * Revalidate the inode. This is required for proper NFS attribute caching.
   */
  static __inline__ int
@@ -1390,15 +1416,13 @@ Index: linux-2.4.21-chaos/fs/stat.c
  {
        struct inode * inode = dentry->d_inode;
 -      if (inode->i_op && inode->i_op->revalidate)
-+        if (!inode)
-+                return -ENOENT;
 +      if (inode->i_op && inode->i_op->revalidate_it)
 +              return inode->i_op->revalidate_it(dentry, it);
 +      else if (inode->i_op && inode->i_op->revalidate)
                return inode->i_op->revalidate(dentry);
        return 0;
  }
-@@ -143,13 +147,15 @@
+@@ -143,13 +145,15 @@ static int cp_new_stat(struct inode * in
  asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
  {
        struct nameidata nd;
@@ -1416,7 +1440,7 @@ Index: linux-2.4.21-chaos/fs/stat.c
                path_release(&nd);
        }
        return error;
-@@ -159,13 +165,15 @@
+@@ -159,13 +163,15 @@ asmlinkage long sys_stat(char * filename
  asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
  {
        struct nameidata nd;
@@ -1434,7 +1458,7 @@ Index: linux-2.4.21-chaos/fs/stat.c
                path_release(&nd);
        }
        return error;
-@@ -180,13 +188,15 @@
+@@ -180,13 +186,15 @@ asmlinkage long sys_newstat(char * filen
  asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
  {
        struct nameidata nd;
@@ -1452,7 +1476,7 @@ Index: linux-2.4.21-chaos/fs/stat.c
                path_release(&nd);
        }
        return error;
-@@ -197,13 +207,15 @@
+@@ -197,13 +205,15 @@ asmlinkage long sys_lstat(char * filenam
  asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
  {
        struct nameidata nd;
@@ -1470,7 +1494,7 @@ Index: linux-2.4.21-chaos/fs/stat.c
                path_release(&nd);
        }
        return error;
-@@ -224,7 +236,7 @@
+@@ -224,7 +234,7 @@ asmlinkage long sys_fstat(unsigned int f
        if (f) {
                struct dentry * dentry = f->f_dentry;
  
@@ -1479,7 +1503,7 @@ Index: linux-2.4.21-chaos/fs/stat.c
                if (!err)
                        err = cp_old_stat(dentry->d_inode, statbuf);
                fput(f);
-@@ -243,7 +255,7 @@
+@@ -243,7 +253,7 @@ asmlinkage long sys_newfstat(unsigned in
        if (f) {
                struct dentry * dentry = f->f_dentry;
  
@@ -1488,7 +1512,7 @@ Index: linux-2.4.21-chaos/fs/stat.c
                if (!err)
                        err = cp_new_stat(dentry->d_inode, statbuf);
                fput(f);
-@@ -265,7 +277,7 @@
+@@ -265,7 +275,7 @@ asmlinkage long sys_readlink(const char 
  
                error = -EINVAL;
                if (inode->i_op && inode->i_op->readlink &&
@@ -1497,7 +1521,7 @@ Index: linux-2.4.21-chaos/fs/stat.c
                        UPDATE_ATIME(inode);
                        error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
                }
-@@ -341,12 +353,14 @@
+@@ -341,12 +351,14 @@ asmlinkage long sys_stat64(char * filena
  {
        struct nameidata nd;
        int error;
@@ -1514,7 +1538,7 @@ Index: linux-2.4.21-chaos/fs/stat.c
                path_release(&nd);
        }
        return error;
-@@ -356,12 +370,14 @@
+@@ -356,12 +368,14 @@ asmlinkage long sys_lstat64(char * filen
  {
        struct nameidata nd;
        int error;
@@ -1531,7 +1555,7 @@ Index: linux-2.4.21-chaos/fs/stat.c
                path_release(&nd);
        }
        return error;
-@@ -376,7 +392,7 @@
+@@ -376,7 +390,7 @@ asmlinkage long sys_fstat64(unsigned lon
        if (f) {
                struct dentry * dentry = f->f_dentry;
  
@@ -1540,11 +1564,11 @@ Index: linux-2.4.21-chaos/fs/stat.c
                if (!err)
                        err = cp_new_stat64(dentry->d_inode, statbuf);
                fput(f);
-Index: linux-2.4.21-chaos/include/linux/dcache.h
+Index: linux-ia64/include/linux/dcache.h
 ===================================================================
---- linux-2.4.21-chaos.orig/include/linux/dcache.h     2003-12-05 16:54:33.000000000 +0300
-+++ linux-2.4.21-chaos/include/linux/dcache.h  2003-12-12 17:02:47.000000000 +0300
-@@ -6,6 +6,51 @@
+--- linux-ia64.orig/include/linux/dcache.h     2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/include/linux/dcache.h  2004-03-17 16:05:28.000000000 -0800
+@@ -6,6 +6,52 @@
  #include <asm/atomic.h>
  #include <linux/mount.h>
  #include <linux/kernel.h>
@@ -1559,6 +1583,7 @@ Index: linux-2.4.21-chaos/include/linux/dcache.h
 +#define IT_GETXATTR 0x0040
 +#define IT_EXEC     0x0080
 +#define IT_PIN      0x0100
++#define IT_CHDIR    0x0200
 +
 +#define IT_FL_LOCKED   0x0001
 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
@@ -1596,11 +1621,20 @@ Index: linux-2.4.21-chaos/include/linux/dcache.h
  
  /*
   * linux/include/linux/dcache.h
-@@ -96,8 +141,22 @@
+@@ -84,6 +130,8 @@
+       unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
+ };
++struct nameidata;
++
+ struct dentry_operations {
+       int (*d_revalidate)(struct dentry *, int);
+       int (*d_hash) (struct dentry *, struct qstr *);
+@@ -96,8 +141,22 @@ struct dentry_operations {
        int (*d_delete)(struct dentry *);
        void (*d_release)(struct dentry *);
        void (*d_iput)(struct dentry *, struct inode *);
-+      int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *);
++      int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *);
 +      void (*d_pin)(struct dentry *, struct vfsmount * , int);
 +      void (*d_unpin)(struct dentry *, struct vfsmount *, int);
  };
@@ -1619,7 +1653,7 @@ Index: linux-2.4.21-chaos/include/linux/dcache.h
  /* the dentry parameter passed to d_hash and d_compare is the parent
   * directory of the entries to be compared. It is used in case these
   * functions need any directory specific information for determining
-@@ -129,6 +188,7 @@
+@@ -129,6 +188,7 @@ d_iput:            no              no              yes
                                         * s_nfsd_free_path semaphore will be down
                                         */
  #define DCACHE_REFERENCED     0x0008  /* Recently used, don't discard. */
@@ -1627,11 +1661,11 @@ Index: linux-2.4.21-chaos/include/linux/dcache.h
  
  extern spinlock_t dcache_lock;
  
-Index: linux-2.4.21-chaos/include/linux/fs.h
+Index: linux-ia64/include/linux/fs.h
 ===================================================================
---- linux-2.4.21-chaos.orig/include/linux/fs.h 2003-12-12 17:02:46.000000000 +0300
-+++ linux-2.4.21-chaos/include/linux/fs.h      2003-12-12 17:02:47.000000000 +0300
-@@ -73,6 +73,7 @@
+--- linux-ia64.orig/include/linux/fs.h 2004-03-17 16:05:28.000000000 -0800
++++ linux-ia64/include/linux/fs.h      2004-03-17 16:05:52.000000000 -0800
+@@ -73,6 +73,7 @@ extern int leases_enable, dir_notify_ena
  
  #define FMODE_READ 1
  #define FMODE_WRITE 2
@@ -1639,17 +1673,17 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
  
  #define READ 0
  #define WRITE 1
-@@ -359,6 +360,9 @@
+@@ -359,6 +360,9 @@ extern void set_bh_page(struct buffer_he
  #define ATTR_MTIME_SET        256
  #define ATTR_FORCE    512     /* Not a change, but a change it */
  #define ATTR_ATTR_FLAG        1024
 +#define ATTR_RAW      0x0800  /* file system, not vfs will massage attrs */
 +#define ATTR_FROM_OPEN        0x1000  /* called from open path, ie O_TRUNC */
-+#define ATTR_CTIME_SET 0x2000
++#define ATTR_CTIME_SET        0x2000
  
  /*
   * This is the Inode Attributes structure, used for notify_change().  It
-@@ -496,6 +500,7 @@
+@@ -496,6 +500,7 @@ struct inode {
        struct pipe_inode_info  *i_pipe;
        struct block_device     *i_bdev;
        struct char_device      *i_cdev;
@@ -1657,7 +1691,7 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
  
        unsigned long           i_dnotify_mask; /* Directory notify events */
        struct dnotify_struct   *i_dnotify; /* for directory notifications */
-@@ -598,6 +603,7 @@
+@@ -598,6 +603,7 @@ struct file {
  
        /* needed for tty driver, and maybe others */
        void                    *private_data;
@@ -1665,7 +1699,7 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
  
        /* preallocated helper kiobuf to speedup O_DIRECT */
        struct kiobuf           *f_iobuf;
-@@ -726,6 +732,7 @@
+@@ -726,6 +732,7 @@ struct nameidata {
        struct qstr last;
        unsigned int flags;
        int last_type;
@@ -1673,7 +1707,7 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
  };
  
  /*
-@@ -846,7 +853,8 @@
+@@ -846,7 +853,8 @@ extern int vfs_symlink(struct inode *, s
  extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
  extern int vfs_rmdir(struct inode *, struct dentry *);
  extern int vfs_unlink(struct inode *, struct dentry *);
@@ -1683,13 +1717,13 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
  
  /*
   * File types
-@@ -920,21 +928,32 @@
+@@ -920,21 +928,32 @@ struct file_operations {
  
  struct inode_operations {
        int (*create) (struct inode *,struct dentry *,int);
 +      int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *);
        struct dentry * (*lookup) (struct inode *,struct dentry *);
-+      struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags);
++      struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags);
        int (*link) (struct dentry *,struct inode *,struct dentry *);
 +      int (*link_raw) (struct nameidata *,struct nameidata *);
        int (*unlink) (struct inode *,struct dentry *);
@@ -1716,12 +1750,22 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
        int (*getattr) (struct dentry *, struct iattr *);
        int (*setxattr) (struct dentry *, const char *, const void *, size_t, int);
        ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
-@@ -1131,10 +1150,14 @@
+@@ -938,6 +957,7 @@
+       int (*remount_fs) (struct super_block *, int *, char *);
+       void (*clear_inode) (struct inode *);
+       void (*umount_begin) (struct super_block *);
++      void (*umount_lustre) (struct super_block *);
+       /* Following are for knfsd to interact with "interesting" filesystems
+        * Currently just reiserfs, but possibly FAT and others later
+@@ -1131,10 +1150,16 @@ static inline int get_lease(struct inode
  
  asmlinkage long sys_open(const char *, int, int);
  asmlinkage long sys_close(unsigned int);      /* yes, it's really unsigned */
 -extern int do_truncate(struct dentry *, loff_t start);
 +extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
++struct dentry *lookup_create(struct nameidata *nd, int is_dir,
++                                  struct lookup_intent *it);
  
  extern struct file *filp_open(const char *, int, int);
  extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
@@ -1732,7 +1776,7 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
  extern int filp_close(struct file *, fl_owner_t id);
  extern char * getname(const char *);
  
-@@ -1425,6 +1448,7 @@
+@@ -1425,6 +1448,7 @@ typedef int (*read_actor_t)(read_descrip
  extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
  
  extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
@@ -1740,7 +1784,7 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
  extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
  extern int FASTCALL(path_walk(const char *, struct nameidata *));
  extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
-@@ -1436,6 +1460,8 @@
+@@ -1436,6 +1460,8 @@ extern struct dentry * lookup_one_len(co
  extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
  #define user_path_walk(name,nd)        __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd)
  #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd)
@@ -1749,7 +1793,7 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
  
  extern void inode_init_once(struct inode *);
  extern void iput(struct inode *);
-@@ -1599,6 +1625,8 @@
+@@ -1599,6 +1625,8 @@ extern struct file_operations generic_ro
  
  extern int vfs_readlink(struct dentry *, char *, int, const char *);
  extern int vfs_follow_link(struct nameidata *, const char *);
@@ -1758,11 +1802,11 @@ Index: linux-2.4.21-chaos/include/linux/fs.h
  extern int page_readlink(struct dentry *, char *, int);
  extern int page_follow_link(struct dentry *, struct nameidata *);
  extern struct inode_operations page_symlink_inode_operations;
-Index: linux-2.4.21-chaos/include/linux/fs_struct.h
+Index: linux-ia64/include/linux/fs_struct.h
 ===================================================================
---- linux-2.4.21-chaos.orig/include/linux/fs_struct.h  2003-12-05 16:54:33.000000000 +0300
-+++ linux-2.4.21-chaos/include/linux/fs_struct.h       2003-12-12 17:02:47.000000000 +0300
-@@ -37,10 +37,12 @@
+--- linux-ia64.orig/include/linux/fs_struct.h  2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/include/linux/fs_struct.h       2004-03-17 16:05:28.000000000 -0800
+@@ -37,10 +37,12 @@ static inline void set_fs_root(struct fs
        write_lock(&fs->lock);
        old_root = fs->root;
        old_rootmnt = fs->rootmnt;
@@ -1775,7 +1819,7 @@ Index: linux-2.4.21-chaos/include/linux/fs_struct.h
                dput(old_root);
                mntput(old_rootmnt);
        }
-@@ -60,10 +62,12 @@
+@@ -60,10 +62,12 @@ static inline void set_fs_pwd(struct fs_
        write_lock(&fs->lock);
        old_pwd = fs->pwd;
        old_pwdmnt = fs->pwdmnt;
@@ -1788,11 +1832,11 @@ Index: linux-2.4.21-chaos/include/linux/fs_struct.h
                dput(old_pwd);
                mntput(old_pwdmnt);
        }
-Index: linux-2.4.21-chaos/kernel/exit.c
+Index: linux-ia64/kernel/exit.c
 ===================================================================
---- linux-2.4.21-chaos.orig/kernel/exit.c      2003-09-19 03:50:00.000000000 +0400
-+++ linux-2.4.21-chaos/kernel/exit.c   2003-12-12 17:02:47.000000000 +0300
-@@ -347,11 +347,14 @@
+--- linux-ia64.orig/kernel/exit.c      2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/kernel/exit.c   2004-03-17 16:05:28.000000000 -0800
+@@ -347,11 +347,14 @@ static inline void __put_fs_struct(struc
  {
        /* No need to hold fs->lock if we are killing it */
        if (atomic_dec_and_test(&fs->count)) {
@@ -1807,11 +1851,11 @@ Index: linux-2.4.21-chaos/kernel/exit.c
                        dput(fs->altroot);
                        mntput(fs->altrootmnt);
                }
-Index: linux-2.4.21-chaos/kernel/fork.c
+Index: linux-ia64/kernel/fork.c
 ===================================================================
---- linux-2.4.21-chaos.orig/kernel/fork.c      2003-12-05 07:55:51.000000000 +0300
-+++ linux-2.4.21-chaos/kernel/fork.c   2003-12-12 17:02:47.000000000 +0300
-@@ -463,10 +463,13 @@
+--- linux-ia64.orig/kernel/fork.c      2004-03-17 15:47:15.000000000 -0800
++++ linux-ia64/kernel/fork.c   2004-03-17 16:05:28.000000000 -0800
+@@ -463,10 +463,13 @@ static inline struct fs_struct *__copy_f
                fs->umask = old->umask;
                read_lock(&old->lock);
                fs->rootmnt = mntget(old->rootmnt);
@@ -1825,15 +1869,37 @@ Index: linux-2.4.21-chaos/kernel/fork.c
                        fs->altrootmnt = mntget(old->altrootmnt);
                        fs->altroot = dget(old->altroot);
                } else {
-Index: linux-2.4.21-chaos/kernel/ksyms.c
+Index: linux-ia64/kernel/ksyms.c
 ===================================================================
---- linux-2.4.21-chaos.orig/kernel/ksyms.c     2003-12-12 17:02:46.000000000 +0300
-+++ linux-2.4.21-chaos/kernel/ksyms.c  2003-12-12 17:02:47.000000000 +0300
-@@ -318,6 +318,7 @@
+--- linux-ia64.orig/kernel/ksyms.c     2004-03-17 16:05:28.000000000 -0800
++++ linux-ia64/kernel/ksyms.c  2004-03-17 16:05:51.000000000 -0800
+@@ -318,6 +318,9 @@ EXPORT_SYMBOL(read_cache_page);
  EXPORT_SYMBOL(set_page_dirty);
  EXPORT_SYMBOL(vfs_readlink);
  EXPORT_SYMBOL(vfs_follow_link);
 +EXPORT_SYMBOL(vfs_follow_link_it);
++EXPORT_SYMBOL(do_umount);
++EXPORT_SYMBOL(lookup_create);
  EXPORT_SYMBOL(page_readlink);
  EXPORT_SYMBOL(page_follow_link);
  EXPORT_SYMBOL(page_symlink_inode_operations);
+===== include/linux/mount.h 1.7 vs edited =====
+--- linux-ia64.orig/include/linux/mount.h      Tue Feb  5 09:49:35 2002
++++ linux-ia64/include/linux/mount.h   Tue May  4 19:23:48 2004
+@@ -29,6 +29,8 @@
+       int mnt_flags;
+       char *mnt_devname;              /* Name of device e.g. /dev/dsk/hda1 */
+       struct list_head mnt_list;
++      struct list_head mnt_lustre_list; /* GNS mount list */
++      unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
+ };
+ static inline struct vfsmount *mntget(struct vfsmount *mnt)
+@@ -39,6 +39,7 @@
+ }
+ extern void __mntput(struct vfsmount *mnt);
++extern int do_umount(struct vfsmount *mnt, int flags);
+ static inline void mntput(struct vfsmount *mnt)
+ {