Whamcloud - gitweb
Merge b_intent into b_md:
authorpschwan <pschwan>
Fri, 31 Jan 2003 21:37:21 +0000 (21:37 +0000)
committerpschwan <pschwan>
Fri, 31 Jan 2003 21:37:21 +0000 (21:37 +0000)
- New kernel patch (version 9)
- DLM hooks to revalidate locked data, once the lock is granted (604)
- Further MDS reorganization, particularly of the open and o_creat paths

lustre/kernel_patches/patches/vfs_intent_hp.patch
lustre/kernel_patches/series/chaos

index cd04549..0ff7635 100644 (file)
 
 --- linux-2.4.19-hp2_pnnl2/fs/dcache.c~vfs_intent_hp   Sun Jan 19 19:04:47 2003
 +++ linux-2.4.19-hp2_pnnl2-root/fs/dcache.c    Sun Jan 19 19:04:47 2003
-+@@ -186,6 +188,13 @@ int d_invalidate(struct dentry * dentry)
+@@ -186,6 +188,13 @@ int d_invalidate(struct dentry * dentry)
                spin_unlock(&dcache_lock);
                return 0;
        }
-
++
 +      /* network invalidation by Lustre */
-+      if (dentry->d_flags & DCACHE_LUSTRE_INVALID) { 
++      if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
 +              spin_unlock(&dcache_lock);
 +              return 0;
 +      }
   * symlinks can cause almost arbitrarily long lookups. 
   */
 -static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
-+static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd, 
++static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
 +                               struct lookup_intent *it)
  {
        int err;
 -      err = dentry->d_inode->i_op->follow_link(dentry, nd);
 +      if (dentry->d_inode->i_op->follow_link2)
 +              err = dentry->d_inode->i_op->follow_link2(dentry, nd, it);
-+      else 
++      else
 +              err = dentry->d_inode->i_op->follow_link(dentry, nd);
        current->link_count--;
        return err;
                if ((lookup_flags & LOOKUP_FOLLOW)
 -                  && inode && inode->i_op && inode->i_op->follow_link) {
 -                      err = do_follow_link(dentry, nd);
-+                  && inode && inode->i_op && 
++                  && inode && inode->i_op &&
 +                  (inode->i_op->follow_link || inode->i_op->follow_link2)) {
 +                      err = do_follow_link(dentry, nd, it);
                        dput(dentry);
        if (!dentry->d_inode)
                goto exit_dput;
 -      if (dentry->d_inode->i_op && dentry->d_inode->i_op->follow_link)
-+      if (dentry->d_inode->i_op && (dentry->d_inode->i_op->follow_link || 
++      if (dentry->d_inode->i_op && (dentry->d_inode->i_op->follow_link ||
 +                                    dentry->d_inode->i_op->follow_link2))
                goto do_link;
  
        if (IS_ERR(dentry))
                goto fail;
        if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1259,6 +1359,7 @@ asmlinkage long sys_mknod(const char * f
-       char * tmp;
-       struct dentry * dentry;
-       struct nameidata nd;
-+      struct lookup_intent it = { .it_op = IT_MKNOD, .it_mode = mode };
-       if (S_ISDIR(mode))
-               return -EPERM;
 @@ -1270,7 +1371,19 @@ asmlinkage long sys_mknod(const char * f
                error = path_walk(tmp, &nd);
        if (error)
 +
 +      if (nd.dentry->d_inode->i_op->mknod2) {
 +              struct inode_operations *op = nd.dentry->d_inode->i_op;
-+              error = op->mknod2(nd.dentry->d_inode, 
-+                                 nd.last.name, 
++              error = op->mknod2(nd.dentry->d_inode,
++                                 nd.last.name,
 +                                 nd.last.len,
 +                                 mode, dev);
 +              /* the file system want to use normal vfs path now */
 +                      goto out2;
 +      }
 +
-+      dentry = lookup_create(&nd, 0, &it);
++      dentry = lookup_create(&nd, 0, NULL);
        error = PTR_ERR(dentry);
  
        if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1289,9 +1402,11 @@ asmlinkage long sys_mknod(const char * f
-               default:
-                       error = -EINVAL;
-               }
-+              intent_release(dentry, &it);
+@@ -1289,6 +1402,7 @@ asmlinkage long sys_mknod(const char * f
                dput(dentry);
        }
        up(&nd.dentry->d_inode->i_sem);
        path_release(&nd);
  out:
        putname(tmp);
-@@ -1329,6 +1444,7 @@ asmlinkage long sys_mkdir(const char * p
- {
-       int error = 0;
-       char * tmp;
-+      struct lookup_intent it = { .it_op = IT_MKDIR, .it_mode = mode };
-       tmp = getname(pathname);
-       error = PTR_ERR(tmp);
-@@ -1340,15 +1456,26 @@ asmlinkage long sys_mkdir(const char * p
+@@ -1340,15 +1456,25 @@ asmlinkage long sys_mkdir(const char * p
                        error = path_walk(tmp, &nd);
                if (error)
                        goto out;
 -              dentry = lookup_create(&nd, 1);
 +              if (nd.dentry->d_inode->i_op->mkdir2) {
 +                      struct inode_operations *op = nd.dentry->d_inode->i_op;
-+                      error = op->mkdir2(nd.dentry->d_inode, 
-+                                         nd.last.name, 
++                      error = op->mkdir2(nd.dentry->d_inode,
++                                         nd.last.name,
 +                                         nd.last.len,
 +                                         mode);
 +                      /* the file system want to use normal vfs path now */
 +                      if (error != -EOPNOTSUPP)
 +                              goto out2;
 +              }
-+              dentry = lookup_create(&nd, 1, &it);
++              dentry = lookup_create(&nd, 1, NULL);
                error = PTR_ERR(dentry);
                if (!IS_ERR(dentry)) {
 -                      if (!IS_POSIXACL(nd.dentry->d_inode))
 -                      error = vfs_mkdir(nd.dentry->d_inode, dentry, mode);
 +                      error = vfs_mkdir(nd.dentry->d_inode, dentry,
 +                                        mode & ~current->fs->umask);
-+                      intent_release(dentry, &it);
                        dput(dentry);
                }
                up(&nd.dentry->d_inode->i_sem);
                path_release(&nd);
  out:
                putname(tmp);
-@@ -1429,6 +1556,7 @@ asmlinkage long sys_rmdir(const char * p
-       char * name;
-       struct dentry *dentry;
-       struct nameidata nd;
-+      struct lookup_intent it = { .it_op = IT_RMDIR };
-       name = getname(pathname);
-       if(IS_ERR(name))
-@@ -1450,11 +1578,21 @@ asmlinkage long sys_rmdir(const char * p
+@@ -1450,8 +1578,17 @@ asmlinkage long sys_rmdir(const char * p
                        error = -EBUSY;
                        goto exit1;
        }
 +      if (nd.dentry->d_inode->i_op->rmdir2) {
 +              struct inode_operations *op = nd.dentry->d_inode->i_op;
-+              error = op->rmdir2(nd.dentry->d_inode, 
-+                                 nd.last.name, 
++              error = op->rmdir2(nd.dentry->d_inode,
++                                 nd.last.name,
 +                                 nd.last.len);
 +              /* the file system want to use normal vfs path now */
 +              if (error != -EOPNOTSUPP)
 +      }
        down(&nd.dentry->d_inode->i_sem);
 -      dentry = lookup_hash(&nd.last, nd.dentry);
-+      dentry = lookup_hash_it(&nd.last, nd.dentry, &it);
++      dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
        error = PTR_ERR(dentry);
        if (!IS_ERR(dentry)) {
                error = vfs_rmdir(nd.dentry->d_inode, dentry);
-+              intent_release(dentry, &it);
-               dput(dentry);
-       }
-       up(&nd.dentry->d_inode->i_sem);
-@@ -1498,6 +1636,7 @@ asmlinkage long sys_unlink(const char * 
-       char * name;
-       struct dentry *dentry;
-       struct nameidata nd;
-+      struct lookup_intent it = { .it_op = IT_UNLINK };
-       name = getname(pathname);
-       if(IS_ERR(name))
 @@ -1510,8 +1649,17 @@ asmlinkage long sys_unlink(const char * 
        error = -EISDIR;
        if (nd.last_type != LAST_NORM)
                goto exit1;
 +      if (nd.dentry->d_inode->i_op->unlink2) {
 +              struct inode_operations *op = nd.dentry->d_inode->i_op;
-+              error = op->unlink2(nd.dentry->d_inode, 
-+                                  nd.last.name, 
++              error = op->unlink2(nd.dentry->d_inode,
++                                  nd.last.name,
 +                                  nd.last.len);
 +              /* the file system want to use normal vfs path now */
 +              if (error != -EOPNOTSUPP)
 +      }
        down(&nd.dentry->d_inode->i_sem);
 -      dentry = lookup_hash(&nd.last, nd.dentry);
-+      dentry = lookup_hash_it(&nd.last, nd.dentry, &it);
++      dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
        error = PTR_ERR(dentry);
        if (!IS_ERR(dentry)) {
                /* Why not before? Because we want correct error value */
-@@ -1519,6 +1667,7 @@ asmlinkage long sys_unlink(const char * 
-                       goto slashes;
-               error = vfs_unlink(nd.dentry->d_inode, dentry);
-       exit2:
-+              intent_release(dentry, &it);
-               dput(dentry);
-       }
-       up(&nd.dentry->d_inode->i_sem);
-@@ -1565,6 +1714,7 @@ asmlinkage long sys_symlink(const char *
-       int error = 0;
-       char * from;
-       char * to;
-+      struct lookup_intent it = { .it_op = IT_SYMLINK };
-       from = getname(oldname);
-       if(IS_ERR(from))
-@@ -1579,15 +1729,28 @@ asmlinkage long sys_symlink(const char *
+@@ -1579,15 +1729,26 @@ asmlinkage long sys_symlink(const char *
                        error = path_walk(to, &nd);
                if (error)
                        goto out;
 -              dentry = lookup_create(&nd, 0);
-+              if (nd.dentry->d_inode->i_op->symlink2) {
++              if (nd.dentry->d_inode->i_op->symlink2) {
 +                      struct inode_operations *op = nd.dentry->d_inode->i_op;
-+                      error = op->symlink2(nd.dentry->d_inode, 
-+                                           nd.last.name, 
++                      error = op->symlink2(nd.dentry->d_inode,
++                                           nd.last.name,
 +                                           nd.last.len,
 +                                           from);
 +                      /* the file system want to use normal vfs path now */
 +                      if (error != -EOPNOTSUPP)
 +                              goto out2;
 +              }
-+              it.it_data = from;
-+              dentry = lookup_create(&nd, 0, &it);
++              dentry = lookup_create(&nd, 0, NULL);
                error = PTR_ERR(dentry);
                if (!IS_ERR(dentry)) {
                        error = vfs_symlink(nd.dentry->d_inode, dentry, from);
-+                      intent_release(dentry, &it);
                        dput(dentry);
                }
                up(&nd.dentry->d_inode->i_sem);
                putname(to);
        }
        putname(from);
-@@ -1648,6 +1811,7 @@ asmlinkage long sys_link(const char * ol
-       int error;
-       char * from;
-       char * to;
-+      struct lookup_intent it = { .it_op = IT_LINK };
-       from = getname(oldname);
-       if(IS_ERR(from))
 @@ -1660,7 +1824,7 @@ asmlinkage long sys_link(const char * ol
  
                error = 0;
                if (error)
                        goto exit;
                if (path_init(to, LOOKUP_PARENT, &nd))
-@@ -1670,10 +1834,22 @@ asmlinkage long sys_link(const char * ol
+@@ -1670,7 +1834,17 @@ 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.dentry->d_inode->i_op->link2) {
 +                      struct inode_operations *op = nd.dentry->d_inode->i_op;
-+                      error = op->link2(old_nd.dentry->d_inode, 
-+                                        nd.dentry->d_inode, 
-+                                        nd.last.name, 
++                      error = op->link2(old_nd.dentry->d_inode,
++                                        nd.dentry->d_inode,
++                                        nd.last.name,
 +                                        nd.last.len);
 +                      /* the file system want to use normal vfs path now */
 +                      if (error != -EOPNOTSUPP)
 +                              goto out_release;
 +              }
-+              it.it_op = IT_LINK2;
-+              new_dentry = lookup_create(&nd, 0, &it);
++              new_dentry = lookup_create(&nd, 0, NULL);
                error = PTR_ERR(new_dentry);
                if (!IS_ERR(new_dentry)) {
                        error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-+                      intent_release(new_dentry, &it);
-                       dput(new_dentry);
-               }
-               up(&nd.dentry->d_inode->i_sem);
 @@ -1716,7 +1892,8 @@ exit:
   *       locking].
   */
  {
        int error;
        struct inode *target;
-@@ -1774,6 +1951,7 @@ int vfs_rename_dir(struct inode *old_dir
+@@ -1753,6 +1923,7 @@ int vfs_rename_dir(struct inode *old_dir
                error = -EBUSY;
        else 
                error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
        if (!error) {
                if (old_dir == new_dir)
                        inode_dir_notify(old_dir, DN_RENAME);
-@@ -1860,6 +2041,7 @@ static inline int do_rename(const char *
-       int error = 0;
-       struct dentry * old_dir, * new_dir;
-       struct dentry * old_dentry, *new_dentry;
-+      struct lookup_intent it = { .it_op = IT_RENAME };
-       struct nameidata oldnd, newnd;
-       if (path_init(oldname, LOOKUP_PARENT, &oldnd))
 @@ -1886,9 +2068,23 @@ static inline int do_rename(const char *
        if (newnd.last_type != LAST_NORM)
                goto exit2;
  
 +      if (old_dir->d_inode->i_op->rename2) {
 +              lock_kernel();
-+              error = old_dir->d_inode->i_op->rename2(old_dir->d_inode, 
-+                                              new_dir->d_inode,
-+                                              oldnd.last.name, 
-+                                              oldnd.last.len,
-+                                              newnd.last.name,
-+                                              newnd.last.len);
++              error = old_dir->d_inode->i_op->rename2(old_dir->d_inode,
++                                                      new_dir->d_inode,
++                                                      oldnd.last.name,
++                                                      oldnd.last.len,
++                                                      newnd.last.name,
++                                                      newnd.last.len);
 +              unlock_kernel();
 +              /* the file system want to use normal vfs path now */
 +              if (error != -EOPNOTSUPP)
        double_lock(new_dir, old_dir);
  
 -      old_dentry = lookup_hash(&oldnd.last, old_dir);
-+      old_dentry = lookup_hash_it(&oldnd.last, old_dir, &it);
++      old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
        error = PTR_ERR(old_dentry);
        if (IS_ERR(old_dentry))
                goto exit3;
-@@ -1904,18 +2100,21 @@ static inline int do_rename(const char *
+@@ -1904,14 +2100,14 @@ static inline int do_rename(const char *
                if (newnd.last.name[newnd.last.len])
                        goto exit4;
        }
 -      new_dentry = lookup_hash(&newnd.last, new_dir);
-+      it.it_op = IT_RENAME2;
-+      new_dentry = lookup_hash_it(&newnd.last, new_dir, &it);
++      new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
        error = PTR_ERR(new_dentry);
        if (IS_ERR(new_dentry))
                goto exit4;
        lock_kernel();
        error = vfs_rename(old_dir->d_inode, old_dentry,
 -                                 new_dir->d_inode, new_dentry);
-+                                 new_dir->d_inode, new_dentry, &it);
++                                 new_dir->d_inode, new_dentry, NULL);
        unlock_kernel();
  
-+      intent_release(new_dentry, &it);
        dput(new_dentry);
- exit4:
-+      intent_release(old_dentry, &it);
-       dput(old_dentry);
- exit3:
-       double_up(&new_dir->d_inode->i_sem, &old_dir->d_inode->i_sem);
 @@ -1964,7 +2163,8 @@ out:
  }
  
  static inline int
 -__vfs_follow_link(struct nameidata *nd, const char *link)
-+__vfs_follow_link(struct nameidata *nd, const char *link, 
++__vfs_follow_link(struct nameidata *nd, const char *link,
 +                struct lookup_intent *it)
  {
        int res = 0;
 +      return __vfs_follow_link(nd, link, NULL);
 +}
 +
-+int vfs_follow_link_it(struct nameidata *nd, const char *link, 
++int vfs_follow_link_it(struct nameidata *nd, const char *link,
 +                     struct lookup_intent *it)
 +{
 +      return __vfs_follow_link(nd, link, it);
        struct nameidata nd;
        struct inode * inode;
        int error;
-+      struct lookup_intent it = { .it_op = IT_SETATTR };
++      struct lookup_intent it = { .it_op = IT_TRUNC };
  
        error = -EINVAL;
        if (length < 0) /* sorry, but loff_t says... */
  {
        int namei_flags, error;
        struct nameidata nd;
-+      struct lookup_intent it = { .it_op = IT_OPEN };
++      struct lookup_intent it = { .it_op = IT_OPEN, .it_flags = flags };
  
        namei_flags = flags;
        if ((namei_flags+1) & O_ACCMODE)
        return error;
 --- linux-2.4.19-hp2_pnnl2/include/linux/dcache.h~vfs_intent_hp        Sun Jan 19 19:04:47 2003
 +++ linux-2.4.19-hp2_pnnl2-root/include/linux/dcache.h Sun Jan 19 19:04:48 2003
-@@ -6,6 +6,34 @@
+@@ -6,6 +6,27 @@
  #include <asm/atomic.h>
  #include <linux/mount.h>
  
-+#define IT_OPEN  (1)
-+#define IT_CREAT  (1<<1)
-+#define IT_MKDIR  (1<<2)
-+#define IT_LINK  (1<<3)
-+#define IT_LINK2  (1<<4)
-+#define IT_SYMLINK  (1<<5)
-+#define IT_UNLINK  (1<<6)
-+#define IT_RMDIR  (1<<7)
-+#define IT_RENAME  (1<<8)
-+#define IT_RENAME2  (1<<9)
-+#define IT_READDIR  (1<<10)
-+#define IT_GETATTR  (1<<11)
-+#define IT_SETATTR  (1<<12)
-+#define IT_READLINK  (1<<13)
-+#define IT_MKNOD  (1<<14)
-+#define IT_LOOKUP  (1<<15)
++#define IT_OPEN     (1)
++#define IT_CREAT    (1<<1)
++#define IT_READDIR  (1<<2)
++#define IT_GETATTR  (1<<3)
++#define IT_SETATTR  (1<<4)
++#define IT_TRUNC    (1<<5)
++#define IT_READLINK (1<<6)
++#define IT_LOOKUP   (1<<7)
 +
 +struct lookup_intent {
 +      int it_op;
 +      int it_mode;
++      int it_flags;
 +      int it_disposition;
 +      int it_status;
 +      struct iattr *it_iattr;
  };
  
  /* the dentry parameter passed to d_hash and d_compare is the parent
-@@ -124,6 +155,7 @@ d_iput:            no              no              yes
+@@ -124,6 +148,7 @@ d_iput:            no              no              yes
                                         * s_nfsd_free_path semaphore will be down
                                         */
- #define DCACHE_REFERENCED     0x0008  /* Recently used, don't discard. */
-+#define DCACHE_LUSTRE_INVALID 0x0010  /* Lustre invalidated */
+ #define DCACHE_REFERENCED     0x0008  /* Recently used, don't discard. */
++#define DCACHE_LUSTRE_INVALID 0x0010  /* Lustre invalidated */
  
  extern spinlock_t dcache_lock;
  
 +      int (*mknod2) (struct inode *, const char *, int,int,int);
        int (*rename) (struct inode *, struct dentry *,
                        struct inode *, struct dentry *);
-+      int (*rename2) (struct inode *, struct inode *, 
-+                      const char *oldname, int oldlen, 
++      int (*rename2) (struct inode *, struct inode *,
++                      const char *oldname, int oldlen,
 +                      const char *newname, int newlen);
        int (*readlink) (struct dentry *, char *,int);
        int (*follow_link) (struct dentry *, struct nameidata *);
-+      int (*follow_link2) (struct dentry *, struct nameidata *, 
++      int (*follow_link2) (struct dentry *, struct nameidata *,
 +                           struct lookup_intent *it);
        void (*truncate) (struct inode *);
        int (*permission) (struct inode *, int);
  
  extern int vfs_readlink(struct dentry *, char *, int, const char *);
  extern int vfs_follow_link(struct nameidata *, const char *);
-+extern int vfs_follow_link_it(struct nameidata *, const char *, 
++extern int vfs_follow_link_it(struct nameidata *, const char *,
 +                            struct lookup_intent *it);
  extern int page_readlink(struct dentry *, char *, int);
  extern int page_follow_link(struct dentry *, struct nameidata *);
index b35612f..ea265c9 100644 (file)
@@ -2,4 +2,5 @@ dev_read_only.patch
 exports.patch
 kmem_cache_validate.patch
 lustre_version.patch
-vfs_intent.patch
+vfs_intent-2.4.18-18.patch
+iod-rmap-exports.patch