Whamcloud - gitweb
Zero the intent for new dentries.
authoradilger <adilger>
Wed, 31 Jul 2002 19:19:28 +0000 (19:19 +0000)
committeradilger <adilger>
Wed, 31 Jul 2002 19:19:28 +0000 (19:19 +0000)
lustre/patches/patch-2.4.18
lustre/patches/patch-2.4.18-chaos10
lustre/patches/patch-2.4.18-chaos11

index 658124b..eb48d40 100644 (file)
@@ -7,7 +7,7 @@
 +struct page *check_get_page(unsigned long kaddr)
 +{
 +#warning FIXME: Lustre team, is this solid?
-+        return virt_to_page(kaddr);
++      return virt_to_page(kaddr);
 +}
 +
  int
@@ -22,7 +22,7 @@
 +struct page *check_get_page(unsigned long kaddr)
 +{
 +#warning FIXME: Lustre team, is this solid?
-+        return virt_to_page(kaddr);
++      return virt_to_page(kaddr);
 +}
 +
  int do_check_pgt_cache(int low, int high)
        int freed = 0;
 --- lum-pristine/mm/slab.c     Fri Dec 21 10:42:05 2001
 +++ lum/mm/slab.c      Thu Jul  4 10:04:25 2002
-@@ -1187,6 +1187,59 @@
+@@ -1187,6 +1187,57 @@
   * Called with the cache-lock held.
   */
  
 +extern struct page *check_get_page(unsigned long kaddr);
 +struct page *page_mem_map(struct page *page);
 +static int kmem_check_cache_obj (kmem_cache_t * cachep,
-+                                 slab_t *slabp, void * objp)
++                               slab_t *slabp, void * objp)
 +{
 +      int i;
 +      unsigned int objnr;
 +              objp -= BYTES_PER_WORD;
 +              if ( *(unsigned long *)objp != RED_MAGIC2)
 +                      /* Either write before start, or a double free. */
-+                        return 0;
++                      return 0;
 +              if (*(unsigned long *)(objp+cachep->objsize -
 +                              BYTES_PER_WORD) != RED_MAGIC2)
 +                      /* Either write past end, or a double free. */
-+                        return 0;
++                      return 0;
 +      }
 +
-+        objnr = (objp-slabp->s_mem)/cachep->objsize;
++      objnr = (objp-slabp->s_mem)/cachep->objsize;
 +      if (objnr >= cachep->num)
-+                return 0;
++              return 0;
 +      if (objp != slabp->s_mem + objnr*cachep->objsize)
-+                return 0;
++              return 0;
 +
 +      /* Check slab's freelist to see if this obj is there. */
 +      for (i = slabp->free; i != BUFCTL_END; i = slab_bufctl(slabp)[i]) {
 +              if (i == objnr)
-+                        return 0;
++                      return 0;
 +      }
 +      return 1;
 +}
 +
 +int kmem_cache_validate(kmem_cache_t *cachep, void *objp)
 +{
-+        struct page *page = check_get_page((unsigned long)objp); 
++      struct page *page = check_get_page((unsigned long)objp); 
 +
-+        if (!VALID_PAGE(page)) {
-+                return 0;
-+        }
++      if (!VALID_PAGE(page))
++              return 0;
 +
-+        if (!PageSlab(page)) {
-+                return 0;
-+        }
++      if (!PageSlab(page))
++              return 0;
 +
-+        /* XXX check for freed slab objects ? */ 
-+        if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp)) 
-+                return 0;
++      /* XXX check for freed slab objects ? */ 
++      if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp)) 
++              return 0;
 +
-+        return (cachep == GET_PAGE_CACHE(page));
++      return (cachep == GET_PAGE_CACHE(page));
 +}
 +
  #if DEBUG
 +      int it_disposition;
 +      int it_status; 
 +      struct iattr *it_iattr;
-+        __u64 it_lock_handle[2];
-+        int it_lock_mode;
++      __u64 it_lock_handle[2];
++      int it_lock_mode;
 +      void *it_data;
 +};
 +
  
        /* needed for tty driver, and maybe others */
        void                    *private_data;
-+       struct lookup_intent    *f_intent;
++      struct lookup_intent    *f_intent;
  
        /* preallocated helper kiobuf to speedup O_DIRECT */
        struct kiobuf           *f_iobuf;
  struct inode_operations {
        int (*create) (struct inode *,struct dentry *,int);
        struct dentry * (*lookup) (struct inode *,struct dentry *);
-+       struct dentry * (*lookup2) (struct inode *,struct dentry *, struct lookup_intent *);
++      struct dentry * (*lookup2) (struct inode *,struct dentry *, struct lookup_intent *);
        int (*link) (struct dentry *,struct inode *,struct dentry *);
        int (*unlink) (struct inode *,struct dentry *);
        int (*symlink) (struct inode *,struct dentry *,const char *);
  
  extern void iput(struct inode *);
  extern void force_delete(struct inode *);
+--- lum-pristine/fs/dcache.c.orig      Mon Feb 25 12:38:08 2002
++++ lum/fs/dcache.c    Wed Jul 31 11:44:36 2002
+@@ -617,6 +617,7 @@
+       dentry->d_op = NULL;
+       dentry->d_fsdata = NULL;
+       dentry->d_mounted = 0;
++      dentry->d_it = NULL;
+       INIT_LIST_HEAD(&dentry->d_hash);
+       INIT_LIST_HEAD(&dentry->d_lru);
+       INIT_LIST_HEAD(&dentry->d_subdirs);
 --- lum-pristine/fs/nfsd/vfs.c Fri Dec 21 10:41:55 2001
 +++ lum/fs/nfsd/vfs.c  Thu Jul  4 10:04:25 2002
 @@ -1285,7 +1285,7 @@
  /* 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 +268,17 @@
+@@ -260,10 +268,19 @@
   * Internal lookup() using the new generic dcache.
   * SMP-safe
   */
 -static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags, struct lookup_intent *it)
++static struct dentry *cached_lookup(struct dentry *parent, struct qstr * name,
++                                  int flags, struct lookup_intent *it)
  {
        struct dentry * dentry = d_lookup(parent, name);
  
 +      if (dentry && dentry->d_op && dentry->d_op->d_revalidate2) {
-+              if (!dentry->d_op->d_revalidate2(dentry, flags, it) && !d_invalidate(dentry)) {
++              if (!dentry->d_op->d_revalidate2(dentry, flags, it) &&
++                  !d_invalidate(dentry)) {
 +                      dput(dentry);
 +                      dentry = NULL;
 +              }
        if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
                if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
                        dput(dentry);
-@@ -281,7 +296,7 @@
+@@ -281,7 +296,8 @@
   * make sure that nobody added the entry to the dcache in the meantime..
   * SMP-safe
   */
 -static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags, struct lookup_intent *it)
++static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
++                                int flags, struct lookup_intent *it)
  {
        struct dentry * result;
        struct inode *dir = parent->d_inode;
                        result = dir->i_op->lookup(dir, dentry);
                        unlock_kernel();
                        if (result)
-@@ -321,6 +339,11 @@
+@@ -321,6 +339,12 @@
                        dput(result);
                        result = ERR_PTR(-ENOENT);
                }
 +      } else if (result->d_op && result->d_op->d_revalidate2) {
-+              if (!result->d_op->d_revalidate2(result, flags, it) && !d_invalidate(result)) {
++              if (!result->d_op->d_revalidate2(result, flags, it) &&
++                  !d_invalidate(result)) {
 +                      dput(result);
 +                      result = ERR_PTR(-ENOENT);
 +              }
        }
        return result;
  }
-@@ -445,7 +468,7 @@
+@@ -445,7 +468,8 @@
   *
   * We expect 'base' to be positive and a directory.
   */
 -int link_path_walk(const char * name, struct nameidata *nd)
-+int link_path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
++int link_path_walk_it(const char * name, struct nameidata *nd,
++                    struct lookup_intent *it)
  {
        struct dentry *dentry;
        struct inode *inode;
                else if (this.len == 2 && this.name[1] == '.')
                        nd->last_type = LAST_DOTDOT;
  return_base:
-+                nd->dentry->d_it = it;
++              nd->dentry->d_it = it;
                return 0;
  out_dput:
                dput(dentry);
        }
        path_release(nd);
  return_err:
-+        if (!err)
-+                nd->dentry->d_it = it;
++      if (!err)
++              nd->dentry->d_it = it;
        return err;
  }
  
   */
 -struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
 +struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base, 
-+                          struct lookup_intent *it)
++                             struct lookup_intent *it)
  {
        struct dentry * dentry;
        struct inode *inode;
  access:
        return ERR_PTR(-EACCES);
  }
-@@ -836,6 +885,22 @@
+@@ -836,6 +885,23 @@
        return err;
  }
  
-+int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd, struct lookup_intent *it)
++int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
++                 struct lookup_intent *it)
 +{
 +      char *tmp;
 +      int err;
   * SMP-safe
   */
 -int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
-+int open_namei_it(const char * pathname, int flag, int mode, struct nameidata *nd, 
-+              struct lookup_intent *it)
++int open_namei_it(const char * pathname, int flag, int mode,
++                struct nameidata *nd, struct lookup_intent *it)
  {
        int acc_mode, error = 0;
        struct inode *inode;
                if (error)
                        return error;
                dentry = nd->dentry;
-+                dentry->d_it = it;
++              dentry->d_it = it;
                goto ok;
        }
  
         * Create - we need to know the parent.
         */
 +      if (it) {
-+                it->it_mode = mode;
++              it->it_mode = mode;
 +              it->it_op |= IT_CREAT;
-+        }
++      }
        if (path_init(pathname, LOOKUP_PARENT, nd))
                error = path_walk(pathname, nd);
        if (error)
                goto exit;
        }
  
-+        dentry->d_it = it;
-+        dentry->d_it->it_mode = mode;
++      dentry->d_it = it;
++      dentry->d_it->it_mode = mode;
        /* Negative dentry, just create the file */
        if (!dentry->d_inode) {
                error = vfs_create(dir->d_inode, dentry,
                if (flag & FMODE_WRITE)
                        DQUOT_INIT(inode);
  
-+        intent_release(dentry);
++      intent_release(dentry);
        return 0;
  
  exit_dput:
-+        intent_release(dentry);
++      intent_release(dentry);
        dput(dentry);
  exit:
        path_release(nd);
                default:
                        error = -EINVAL;
                }
-+                intent_release(dentry); 
++              intent_release(dentry); 
                dput(dentry);
        }
        up(&nd.dentry->d_inode->i_sem);
 +                      dentry->d_it = &it;
                        error = vfs_mkdir(nd.dentry->d_inode, dentry,
                                          mode & ~current->fs->umask);
-+                        intent_release(dentry); 
++                      intent_release(dentry); 
                        dput(dentry);
                }
                up(&nd.dentry->d_inode->i_sem);
                if (!IS_ERR(dentry)) {
 +                      dentry->d_it = &it;
                        error = vfs_symlink(nd.dentry->d_inode, dentry, from);
-+                        intent_release(dentry); 
++                      intent_release(dentry); 
                        dput(dentry);
                }
                up(&nd.dentry->d_inode->i_sem);
                if (!IS_ERR(new_dentry)) {
 +                      new_dentry->d_it = &it;
                        error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-+                        intent_release(new_dentry); 
++                      intent_release(new_dentry); 
                        dput(new_dentry);
                }
                up(&nd.dentry->d_inode->i_sem);
  
  int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
 -             struct inode *new_dir, struct dentry *new_dentry)
-+              struct inode *new_dir, struct dentry *new_dentry, 
++                   struct inode *new_dir, struct dentry *new_dentry, 
 +                   struct lookup_intent *it)
  {
        int error;
  
  int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
 -             struct inode *new_dir, struct dentry *new_dentry)
-+              struct inode *new_dir, struct dentry *new_dentry, 
-+              struct lookup_intent *it)
++             struct inode *new_dir, struct dentry *new_dentry, 
++             struct lookup_intent *it)
  {
        int error;
        if (S_ISDIR(old_dentry->d_inode->i_mode))
 +                                 new_dir->d_inode, new_dentry, &it);
        unlock_kernel();
  
-+        intent_release(new_dentry);
++      intent_release(new_dentry);
        dput(new_dentry);
  exit4:
-+        intent_release(old_dentry);
++      intent_release(old_dentry);
        dput(old_dentry);
  exit3:
        double_up(&new_dir->d_inode->i_sem, &old_dir->d_inode->i_sem);
 --- lum-pristine/fs/open.c     Fri Oct 12 14:48:42 2001
 +++ lum/fs/open.c      Thu Jul  4 10:04:25 2002
-@@ -19,6 +19,8 @@
+@@ -19,6 +19,9 @@
  #include <asm/uaccess.h>
  
  #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-+extern int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it);
++extern int path_walk_it(const char * name, struct nameidata *nd,
++                      struct lookup_intent *it);
 +extern void intent_release(struct dentry *de);
  
  int vfs_statfs(struct super_block *sb, struct statfs *buf)
                if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
                   && !special_file(nd.dentry->d_inode->i_mode))
                        res = -EROFS;
-+                intent_release(nd.dentry);
++              intent_release(nd.dentry);
                path_release(&nd);
        }
  
                path_release(&nd);
        }
        return error;
-@@ -630,10 +673,15 @@
+@@ -630,10 +673,16 @@
   * for the internal routines (ie open_namei()/follow_link() etc). 00 is
   * used by symlinks.
   */
 +extern int open_namei_it(const char *filename, int namei_flags, int mode, 
 +                       struct nameidata *nd, struct lookup_intent *it);
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, int flags, struct lookup_intent *it);
++struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
++                          int flags, struct lookup_intent *it);
 +
  struct file *filp_open(const char * filename, int flags, int mode)
  {
  
        namei_flags = flags;
        if ((namei_flags+1) & O_ACCMODE)
-@@ -641,14 +689,14 @@
+@@ -641,14 +689,15 @@
        if (namei_flags & O_TRUNC)
                namei_flags |= 2;
  
  }
  
 -struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, int flags, struct lookup_intent *it)
++struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
++                          int flags, struct lookup_intent *it)
  {
        struct file * f;
        struct inode *inode;
-@@ -705,11 +753,19 @@
+@@ -705,11 +753,17 @@
  cleanup_file:
        put_filp(f);
  cleanup_dentry:
-+        intent_release(dentry);
++      intent_release(dentry);
        dput(dentry);
        mntput(mnt);
        return ERR_PTR(error);
 +struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
 +{
 +      return dentry_open_it(dentry, mnt, flags, NULL);
-+
 +}
 +
-+
  /*
   * Find an empty file descriptor entry, and mark it busy.
   */
  asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
  {
        struct nameidata nd;
-+        struct lookup_intent it = {IT_GETATTR, 0};
++      struct lookup_intent it = {IT_GETATTR, 0};
        int error;
  
 -      error = user_path_walk(filename, &nd);
                error = do_revalidate(nd.dentry);
                if (!error)
                        error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+                intent_release(nd.dentry);
++              intent_release(nd.dentry);
                path_release(&nd);
        }
        return error;
  asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
  {
        struct nameidata nd;
-+        struct lookup_intent it = {IT_GETATTR, 0};
++      struct lookup_intent it = {IT_GETATTR, 0};
        int error;
  
 -      error = user_path_walk(filename, &nd);
                error = do_revalidate(nd.dentry);
                if (!error)
                        error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+                intent_release(nd.dentry);
++              intent_release(nd.dentry);
                path_release(&nd);
        }
        return error;
  asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
  {
        struct nameidata nd;
-+        struct lookup_intent it = {IT_GETATTR, 0};
++      struct lookup_intent it = {IT_GETATTR, 0};
        int error;
  
 -      error = user_path_walk_link(filename, &nd);
                error = do_revalidate(nd.dentry);
                if (!error)
                        error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+                intent_release(nd.dentry);
++              intent_release(nd.dentry);
                path_release(&nd);
        }
        return error;
  asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
  {
        struct nameidata nd;
-+        struct lookup_intent it = {IT_GETATTR, 0};
++      struct lookup_intent it = {IT_GETATTR, 0};
        int error;
  
 -      error = user_path_walk_link(filename, &nd);
                error = do_revalidate(nd.dentry);
                if (!error)
                        error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+                intent_release(nd.dentry);
++              intent_release(nd.dentry);
                path_release(&nd);
        }
        return error;
                        UPDATE_ATIME(inode);
                        error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
                }
-+                intent_release(nd.dentry);
++              intent_release(nd.dentry);
                path_release(&nd);
        }
        return error;
                error = do_revalidate(nd.dentry);
                if (!error)
                        error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+                intent_release(nd.dentry); 
++              intent_release(nd.dentry); 
                path_release(&nd);
        }
        return error;
                error = do_revalidate(nd.dentry);
                if (!error)
                        error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+                intent_release(nd.dentry); 
++              intent_release(nd.dentry); 
                path_release(&nd);
        }
        return error;
index f5b52c2..c2e85e6 100644 (file)
  
  extern void iput(struct inode *);
  extern void force_delete(struct inode *);
+--- linux-2.4.18-chaos5-pristine/fs/dcache.c   Mon Feb 25 12:38:08 2002
++++ linux-2.4.18-chaos5/fs/dcache.c    Wed Jul 31 11:44:36 2002
+@@ -617,6 +617,7 @@
+       dentry->d_op = NULL;
+       dentry->d_fsdata = NULL;
+       dentry->d_mounted = 0;
++      dentry->d_it = NULL;
+       INIT_LIST_HEAD(&dentry->d_hash);
+       INIT_LIST_HEAD(&dentry->d_lru);
+       INIT_LIST_HEAD(&dentry->d_subdirs);
 --- linux-2.4.18-chaos5-pristine/fs/nfsd/vfs.c Sat Jun 29 23:07:56 2002
 +++ linux-2.4.18-chaos5/fs/nfsd/vfs.c  Sat Jun 29 23:09:04 2002
 @@ -1298,7 +1298,7 @@
index 1c87fff..dd15a36 100644 (file)
  
  extern void iput(struct inode *);
  extern void force_delete(struct inode *);
+--- linux-2.4.18-chaos5-pristine/fs/dcache.c   Mon Feb 25 12:38:08 2002
++++ linux-2.4.18-chaos5/fs/dcache.c    Wed Jul 31 11:44:36 2002
+@@ -617,6 +617,7 @@
+       dentry->d_op = NULL;
+       dentry->d_fsdata = NULL;
+       dentry->d_mounted = 0;
++      dentry->d_it = NULL;
+       INIT_LIST_HEAD(&dentry->d_hash);
+       INIT_LIST_HEAD(&dentry->d_lru);
+       INIT_LIST_HEAD(&dentry->d_subdirs);
 --- linux-2.4.18-chaos5-pristine/fs/nfsd/vfs.c Sat Jun 29 23:07:56 2002
 +++ linux-2.4.18-chaos5/fs/nfsd/vfs.c  Sat Jun 29 23:09:04 2002
 @@ -1298,7 +1298,7 @@