]> git.pld-linux.org Git - packages/kernel.git/blobdiff - kernel-aufs3.patch
- partial 3.10 update
[packages/kernel.git] / kernel-aufs3.patch
index e01d1dbea58ddbd546b2773bf367828e52dcfb00..c47b8f30e429ea3d0710e8f6497350ff7efa27c8 100644 (file)
@@ -1,13 +1,13 @@
-aufs3.8 kbuild patch
+aufs3.x-rcN kbuild patch
 
 diff --git a/fs/Kconfig b/fs/Kconfig
 index 780725a..d460c05 100644
 --- a/fs/Kconfig
 +++ b/fs/Kconfig
-@@ -211,6 +211,7 @@ source "fs/sysv/Kconfig"
- source "fs/ufs/Kconfig"
+@@ -213,6 +213,7 @@ source "fs/ufs/Kconfig"
  source "fs/exofs/Kconfig"
  source "fs/f2fs/Kconfig"
+ source "fs/efivarfs/Kconfig"
 +source "fs/aufs/Kconfig"
  
  endif # MISC_FILESYSTEMS
@@ -16,15 +16,27 @@ diff --git a/fs/Makefile b/fs/Makefile
 index 9d53192..e70f08f 100644
 --- a/fs/Makefile
 +++ b/fs/Makefile
-@@ -127,3 +127,4 @@ obj-$(CONFIG_F2FS_FS)              += f2fs/
- obj-y                         += exofs/ # Multiple modules
+@@ -127,3 +127,4 @@ obj-y                              += exofs/ # Multiple modules
  obj-$(CONFIG_CEPH_FS)         += ceph/
  obj-$(CONFIG_PSTORE)          += pstore/
-+obj-$(CONFIG_AUFS_FS)           += aufs/
-aufs3.8 base patch
+ obj-$(CONFIG_EFIVAR_FS)               += efivarfs/
++obj-$(CONFIG_AUFS_FS)         += aufs/
+diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild
+index 5c8a1d2..fea7572 100644
+--- a/include/uapi/linux/Kbuild
++++ b/include/uapi/linux/Kbuild
+@@ -56,6 +56,7 @@ header-y += atmppp.h
+ header-y += atmsap.h
+ header-y += atmsvc.h
+ header-y += audit.h
++header-y += aufs_type.h
+ header-y += auto_fs.h
+ header-y += auto_fs4.h
+ header-y += auxvec.h
+aufs3.x-rcN base patch
 
 diff --git a/fs/file_table.c b/fs/file_table.c
-index de9e965..e73287a 100644
+index cd4d87a..ca5948f 100644
 --- a/fs/file_table.c
 +++ b/fs/file_table.c
 @@ -36,7 +36,7 @@ struct files_stat_struct files_stat = {
@@ -37,10 +49,10 @@ index de9e965..e73287a 100644
  /* SLAB cache for file structures */
  static struct kmem_cache *filp_cachep __read_mostly;
 diff --git a/fs/inode.c b/fs/inode.c
-index 14084b7..ece87ed 100644
+index f5f7c06..0b99538 100644
 --- a/fs/inode.c
 +++ b/fs/inode.c
-@@ -1503,7 +1503,7 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode,
+@@ -1498,7 +1498,7 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode,
   * This does the actual work of updating an inodes time or version.  Must have
   * had called mnt_want_write() before calling this.
   */
@@ -50,10 +62,10 @@ index 14084b7..ece87ed 100644
        if (inode->i_op->update_time)
                return inode->i_op->update_time(inode, time, flags);
 diff --git a/fs/splice.c b/fs/splice.c
-index 6909d89..020c7bc 100644
+index 718bd00..c717dbb 100644
 --- a/fs/splice.c
 +++ b/fs/splice.c
-@@ -1092,8 +1092,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
+@@ -1093,8 +1093,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
  /*
   * Attempt to initiate a splice from pipe to file.
   */
@@ -64,7 +76,7 @@ index 6909d89..020c7bc 100644
  {
        ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
                                loff_t *, size_t, unsigned int);
-@@ -1120,9 +1120,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -1121,9 +1121,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
  /*
   * Attempt to initiate a splice from a file to a pipe.
   */
@@ -78,10 +90,10 @@ index 6909d89..020c7bc 100644
        ssize_t (*splice_read)(struct file *, loff_t *,
                               struct pipe_inode_info *, size_t, unsigned int);
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 7617ee0..1a39c33 100644
+index 2c28271..5c49108 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -2551,6 +2551,7 @@ extern int inode_change_ok(const struct inode *, struct iattr *);
+@@ -2558,6 +2558,7 @@ extern int inode_change_ok(const struct inode *, struct iattr *);
  extern int inode_newsize_ok(const struct inode *, loff_t offset);
  extern void setattr_copy(struct inode *inode, const struct iattr *attr);
  
@@ -104,10 +116,10 @@ index 09a545a..1ac5727 100644
 +                       struct pipe_inode_info *pipe, size_t len,
 +                       unsigned int flags);
  #endif
-aufs3.8 standalone patch
+aufs3.x-rcN standalone patch
 
 diff --git a/fs/file_table.c b/fs/file_table.c
-index e73287a..b33aebe 100644
+index ca5948f..b553610 100644
 --- a/fs/file_table.c
 +++ b/fs/file_table.c
 @@ -37,6 +37,7 @@ struct files_stat_struct files_stat = {
@@ -118,7 +130,7 @@ index e73287a..b33aebe 100644
  
  /* SLAB cache for file structures */
  static struct kmem_cache *filp_cachep __read_mostly;
-@@ -403,6 +404,8 @@ void file_sb_list_del(struct file *file)
+@@ -404,6 +405,8 @@ void file_sb_list_del(struct file *file)
        }
  }
  
@@ -128,7 +140,7 @@ index e73287a..b33aebe 100644
  
  /*
 diff --git a/fs/inode.c b/fs/inode.c
-index ece87ed..38f7bc8 100644
+index 0b99538..46a6995 100644
 --- a/fs/inode.c
 +++ b/fs/inode.c
 @@ -56,6 +56,7 @@ static struct hlist_head *inode_hashtable __read_mostly;
@@ -139,7 +151,7 @@ index ece87ed..38f7bc8 100644
  
  /*
   * Empty aops. Can be used for the cases where the user does not
-@@ -1519,6 +1520,7 @@ int update_time(struct inode *inode, struct timespec *time, int flags)
+@@ -1514,6 +1515,7 @@ int update_time(struct inode *inode, struct timespec *time, int flags)
        mark_inode_dirty_sync(inode);
        return 0;
  }
@@ -148,7 +160,7 @@ index ece87ed..38f7bc8 100644
  /**
   *    touch_atime     -       update the access time
 diff --git a/fs/namespace.c b/fs/namespace.c
-index 55605c5..aed7607 100644
+index 50ca17d..1548ce4 100644
 --- a/fs/namespace.c
 +++ b/fs/namespace.c
 @@ -52,6 +52,7 @@ EXPORT_SYMBOL_GPL(fs_kobj);
@@ -159,7 +171,15 @@ index 55605c5..aed7607 100644
  
  static inline unsigned long hash(struct vfsmount *mnt, struct dentry *dentry)
  {
-@@ -1424,6 +1425,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
+@@ -425,6 +426,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
+       mnt_dec_writers(real_mount(mnt));
+       preempt_enable();
+ }
++EXPORT_SYMBOL_GPL(__mnt_drop_write);
+ /**
+  * mnt_drop_write - give up write access to a mount
+@@ -1413,6 +1415,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
        }
        return 0;
  }
@@ -240,10 +260,10 @@ index fc6b49b..a6bb87d 100644
  static int fsnotify_mark_destroy(void *ignored)
  {
 diff --git a/fs/open.c b/fs/open.c
-index 9b33c0c..e3365035 100644
+index 6835446..df2262a 100644
 --- a/fs/open.c
 +++ b/fs/open.c
-@@ -60,6 +60,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
+@@ -61,6 +61,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
        mutex_unlock(&dentry->d_inode->i_mutex);
        return ret;
  }
@@ -252,10 +272,10 @@ index 9b33c0c..e3365035 100644
  long vfs_truncate(struct path *path, loff_t length)
  {
 diff --git a/fs/splice.c b/fs/splice.c
-index 020c7bc..a622ade 100644
+index c717dbb..f9c3c18 100644
 --- a/fs/splice.c
 +++ b/fs/splice.c
-@@ -1116,6 +1116,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+@@ -1117,6 +1117,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
  
        return splice_write(pipe, out, ppos, len, flags);
  }
@@ -263,7 +283,7 @@ index 020c7bc..a622ade 100644
  
  /*
   * Attempt to initiate a splice from a file to a pipe.
-@@ -1142,6 +1143,7 @@ long do_splice_to(struct file *in, loff_t *ppos,
+@@ -1143,6 +1144,7 @@ long do_splice_to(struct file *in, loff_t *ppos,
  
        return splice_read(in, ppos, pipe, len, flags);
  }
@@ -272,7 +292,7 @@ index 020c7bc..a622ade 100644
  /**
   * splice_direct_to_actor - splices data directly between two non-pipes
 diff --git a/security/commoncap.c b/security/commoncap.c
-index 7ee08c7..176edf1 100644
+index c44b6fe..d78b003 100644
 --- a/security/commoncap.c
 +++ b/security/commoncap.c
 @@ -988,9 +988,11 @@ int cap_mmap_addr(unsigned long addr)
@@ -288,7 +308,7 @@ index 7ee08c7..176edf1 100644
  }
 +EXPORT_SYMBOL(cap_mmap_file);
 diff --git a/security/device_cgroup.c b/security/device_cgroup.c
-index d794abc..a20f167 100644
+index 1c69e38..7392d19 100644
 --- a/security/device_cgroup.c
 +++ b/security/device_cgroup.c
 @@ -7,6 +7,7 @@
@@ -299,7 +319,7 @@ index d794abc..a20f167 100644
  #include <linux/list.h>
  #include <linux/uaccess.h>
  #include <linux/seq_file.h>
-@@ -631,6 +632,7 @@ int __devcgroup_inode_permission(struct inode *inode, int mask)
+@@ -634,6 +635,7 @@ int __devcgroup_inode_permission(struct inode *inode, int mask)
        return __devcgroup_check_permission(type, imajor(inode), iminor(inode),
                        access);
  }
@@ -1439,8 +1459,8 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/99plan.txt linu
 +Otherwise from /new.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documentation/filesystems/aufs/README
 --- /usr/share/empty/Documentation/filesystems/aufs/README     1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/README        2013-03-14 20:07:40.574775374 +0100
-@@ -0,0 +1,333 @@
++++ linux/Documentation/filesystems/aufs/README        2013-07-01 12:54:21.039493094 +0200
+@@ -0,0 +1,339 @@
 +
 +Aufs3 -- advanced multi layered unification filesystem version 3.x
 +http://aufs.sf.net
@@ -1602,7 +1622,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
 +Make sure you have git-checkout'ed the correct branch.
 +
 +For aufs3-linux tree,
-+- enable CONFIG_EXPERIMENTAL and CONFIG_AUFS_FS.
++- enable CONFIG_AUFS_FS.
 +- set other aufs configurations if necessary.
 +
 +For aufs3-standalone tree,
@@ -1618,10 +1638,13 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
 +  CONFIG_AUFS_FS=m. otherwise you don't need ./aufs3-standalone.patch.
 +- copy ./{Documentation,fs,include/uapi/linux/aufs_type.h} files to your
 +  kernel source tree. Never copy $PWD/include/uapi/linux/Kbuild.
-+- enable CONFIG_EXPERIMENTAL and CONFIG_AUFS_FS, you can select either
++- enable CONFIG_AUFS_FS, you can select either
 +  =m or =y.
 +- and build your kernel as usual.
 +- install the built kernel.
++  Note: Since linux-3.9, every filesystem module requires an alias
++  "fs-<fsname>". You should make sure that "fs-aufs" is listed in your
++  modules.aliases file if you set CONFIG_AUFS_FS=m.
 +- install the header files too by "make headers_install" to the
 +  directory where you specify. By default, it is $PWD/usr.
 +  "make help" shows a brief note for headers_install.
@@ -1639,6 +1662,9 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
 +  Note: You should read $PWD/fs/aufs/Kconfig carefully which describes
 +  every aufs configurations.
 +- build the module by simple "make".
++  Note: Since linux-3.9, every filesystem module requires an alias
++  "fs-<fsname>". You should make sure that "fs-aufs" is listed in your
++  modules.aliases file.
 +- you can specify ${KDIR} make variable which points to your kernel
 +  source tree.
 +- install the files
@@ -1840,7 +1866,7 @@ diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/aufs.h
 +#endif /* __AUFS_H__ */
 diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 --- /usr/share/empty/fs/aufs/branch.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/branch.c     2013-03-14 20:07:41.038119650 +0100
++++ linux/fs/aufs/branch.c     2013-07-01 12:54:21.039493094 +0200
 @@ -0,0 +1,1172 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
@@ -2816,7 +2842,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +      do_file_list_for_each_entry(sb, f) {
 +              if (au_fi(f)
 +                  && file_count(f)
-+                  && !special_file(f->f_dentry->d_inode->i_mode)) {
++                  && !special_file(file_inode(f)->i_mode)) {
 +                      get_file(f);
 +                      *p++ = f;
 +                      n++;
@@ -2881,7 +2907,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +                      goto out_array;
 +              }
 +
-+              inode = file->f_dentry->d_inode;
++              inode = file_inode(file);
 +              hfile = &au_fi(file)->fi_htop;
 +              hf = hfile->hf_file;
 +              if (!S_ISREG(inode->i_mode)
@@ -2918,8 +2944,8 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +              hf->f_mode &= ~FMODE_WRITE;
 +              spin_unlock(&hf->f_lock);
 +              if (!file_check_writeable(hf)) {
++                      __mnt_drop_write(hf->f_path.mnt);
 +                      file_release_write(hf);
-+                      vfsub_mnt_drop_write(hf->f_vfsmnt);
 +              }
 +      }
 +
@@ -3298,7 +3324,7 @@ diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk
 +-include ${srctree}/${src}/conf_priv.mk
 diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 --- /usr/share/empty/fs/aufs/cpup.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/cpup.c       2013-03-14 20:07:41.038119650 +0100
++++ linux/fs/aufs/cpup.c       2013-07-01 12:54:18.772748151 +0200
 @@ -0,0 +1,1085 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
@@ -3576,7 +3602,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +                      ia->ia_size = dst->f_pos;
 +                      ia->ia_valid = ATTR_SIZE | ATTR_FILE;
 +                      ia->ia_file = dst;
-+                      h_mtx = &dst->f_dentry->d_inode->i_mutex;
++                      h_mtx = &file_inode(dst)->i_mutex;
 +                      mutex_lock_nested(h_mtx, AuLsc_I_CHILD2);
 +                      err = vfsub_notify_change(&dst->f_path, ia);
 +                      mutex_unlock(h_mtx);
@@ -4472,8 +4498,8 @@ diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h
 +#endif /* __AUFS_CPUP_H__ */
 diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
 --- /usr/share/empty/fs/aufs/dbgaufs.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dbgaufs.c    2013-03-14 20:07:41.038119650 +0100
-@@ -0,0 +1,334 @@
++++ linux/fs/aufs/dbgaufs.c    2013-07-01 12:54:21.039493094 +0200
+@@ -0,0 +1,332 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -4539,7 +4565,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
 +      if (!xf)
 +              goto out;
 +
-+      err = vfs_getattr(xf->f_vfsmnt, xf->f_dentry, &st);
++      err = vfs_getattr(&xf->f_path, &st);
 +      if (!err) {
 +              if (do_fcnt)
 +                      p->n = snprintf
@@ -4651,10 +4677,8 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
 +      for (; bindex <= bend; bindex++) {
 +              br = au_sbr(sb, bindex);
 +              xi = &br->br_xino;
-+              if (xi->xi_dbgaufs) {
-+                      debugfs_remove(xi->xi_dbgaufs);
-+                      xi->xi_dbgaufs = NULL;
-+              }
++              debugfs_remove(xi->xi_dbgaufs);
++              xi->xi_dbgaufs = NULL;
 +      }
 +}
 +
@@ -5208,8 +5232,8 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
 +#endif /* __AUFS_DCSUB_H__ */
 diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 --- /usr/share/empty/fs/aufs/debug.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/debug.c      2013-03-14 20:07:41.038119650 +0100
-@@ -0,0 +1,490 @@
++++ linux/fs/aufs/debug.c      2013-07-01 12:54:21.039493094 +0200
+@@ -0,0 +1,491 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -5253,17 +5277,16 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 +{
 +      unsigned long ul, n;
 +      struct hlist_head *head;
-+      struct au_vdir_wh *tpos;
-+      struct hlist_node *pos;
++      struct au_vdir_wh *pos;
 +
 +      n = whlist->nh_num;
 +      head = whlist->nh_head;
 +      for (ul = 0; ul < n; ul++) {
-+              hlist_for_each_entry(tpos, pos, head, wh_hash)
++              hlist_for_each_entry(pos, head, wh_hash)
 +                      dpri("b%d, %.*s, %d\n",
-+                           tpos->wh_bindex,
-+                           tpos->wh_str.len, tpos->wh_str.name,
-+                           tpos->wh_str.len);
++                           pos->wh_bindex,
++                           pos->wh_str.len, pos->wh_str.name,
++                           pos->wh_str.len);
 +              head++;
 +      }
 +}
@@ -5350,10 +5373,9 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 +void au_dpri_dalias(struct inode *inode)
 +{
 +      struct dentry *d;
-+      struct hlist_node *p;
 +
 +      spin_lock(&inode->i_lock);
-+      hlist_for_each_entry(d, p, &inode->i_dentry, d_alias)
++      hlist_for_each_entry(d, &inode->i_dentry, d_alias)
 +              au_dpri_dentry(d);
 +      spin_unlock(&inode->i_lock);
 +}
@@ -5540,8 +5562,11 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 +
 +void au_dbg_iattr(struct iattr *ia)
 +{
-+#define AuBit(name)   if (ia->ia_valid & ATTR_ ## name) \
-+                              dpri(#name "\n")
++#define AuBit(name)                                   \
++      do {                                            \
++              if (ia->ia_valid & ATTR_ ## name)       \
++                      dpri(#name "\n");               \
++      } while (0)
 +      AuBit(MODE);
 +      AuBit(UID);
 +      AuBit(GID);
@@ -5948,8 +5973,8 @@ diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h
 +#endif /* __AUFS_DEBUG_H__ */
 diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 --- /usr/share/empty/fs/aufs/dentry.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dentry.c     2013-03-14 20:07:41.038119650 +0100
-@@ -0,0 +1,1060 @@
++++ linux/fs/aufs/dentry.c     2013-07-01 12:54:18.772748151 +0200
+@@ -0,0 +1,1061 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -7007,8 +7032,9 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +}
 +
 +const struct dentry_operations aufs_dop = {
-+      .d_revalidate   = aufs_d_revalidate,
-+      .d_release      = aufs_d_release
++      .d_revalidate           = aufs_d_revalidate,
++      .d_weak_revalidate      = aufs_d_revalidate,
++      .d_release              = aufs_d_release
 +};
 diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 --- /usr/share/empty/fs/aufs/dentry.h  1970-01-01 01:00:00.000000000 +0100
@@ -7797,8 +7823,8 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 --- /usr/share/empty/fs/aufs/dir.c     1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dir.c        2013-03-14 20:07:41.038119650 +0100
-@@ -0,0 +1,633 @@
++++ linux/fs/aufs/dir.c        2013-07-01 12:54:18.776081600 +0200
+@@ -0,0 +1,630 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -7861,19 +7887,16 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +
 +      sz = 0;
 +      if (file) {
-+              AuDebugOn(!file->f_dentry);
-+              AuDebugOn(!file->f_dentry->d_inode);
-+              AuDebugOn(!S_ISDIR(file->f_dentry->d_inode->i_mode));
++              AuDebugOn(!file_inode(file));
++              AuDebugOn(!S_ISDIR(file_inode(file)->i_mode));
 +
 +              bend = au_fbend_dir(file);
 +              for (bindex = au_fbstart(file);
 +                   bindex <= bend && sz < KMALLOC_MAX_SIZE;
 +                   bindex++) {
 +                      h_file = au_hf_dir(file, bindex);
-+                      if (h_file
-+                          && h_file->f_dentry
-+                          && h_file->f_dentry->d_inode)
-+                              sz += i_size_read(h_file->f_dentry->d_inode);
++                      if (h_file && file_inode(h_file))
++                              sz += vfsub_f_size_read(h_file);
 +              }
 +      } else {
 +              AuDebugOn(!dentry);
@@ -8111,7 +8134,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +              goto out;
 +
 +      sb = file->f_dentry->d_sb;
-+      inode = file->f_dentry->d_inode;
++      inode = file_inode(file);
 +      bend = au_fbend_dir(file);
 +      for (bindex = au_fbstart(file); !err && bindex <= bend; bindex++) {
 +              h_file = au_hf_dir(file, bindex);
@@ -8284,7 +8307,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +
 +      err = 0;
 +      if (!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE)
-+          && !h_file->f_dentry->d_inode->i_nlink)
++          && !file_inode(h_file)->i_nlink)
 +              goto out_put;
 +
 +      do {
@@ -9038,8 +9061,8 @@ diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h
 +#endif /* __AUFS_DYNOP_H__ */
 diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 --- /usr/share/empty/fs/aufs/export.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/export.c     2013-03-14 20:07:41.038119650 +0100
-@@ -0,0 +1,827 @@
++++ linux/fs/aufs/export.c     2013-07-01 12:54:18.776081600 +0200
+@@ -0,0 +1,826 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -9204,7 +9227,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +      file = sbinfo->si_xigen;
 +      BUG_ON(!file);
 +
-+      if (i_size_read(file->f_dentry->d_inode)
++      if (vfsub_f_size_read(file)
 +          < pos + sizeof(inode->i_generation)) {
 +              inode->i_generation = atomic_inc_return(&sbinfo->si_xigen_next);
 +              sz = xino_fwrite(sbinfo->si_xwrite, file, &inode->i_generation,
@@ -9268,7 +9291,6 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +      struct dentry *dentry, *d;
 +      struct inode *inode;
 +      unsigned int sigen;
-+      struct hlist_node *p;
 +
 +      dentry = NULL;
 +      inode = ilookup(sb, ino);
@@ -9287,7 +9309,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +              dentry = d_find_alias(inode);
 +      else {
 +              spin_lock(&inode->i_lock);
-+              hlist_for_each_entry(d, p, &inode->i_dentry, d_alias) {
++              hlist_for_each_entry(d, &inode->i_dentry, d_alias) {
 +                      spin_lock(&d->d_lock);
 +                      if (!au_test_anon(d)
 +                          && d->d_parent->d_inode->i_ino == dir_ino) {
@@ -9869,8 +9891,8 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +}
 diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 --- /usr/share/empty/fs/aufs/file.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/file.c       2013-03-14 20:07:41.041453062 +0100
-@@ -0,0 +1,683 @@
++++ linux/fs/aufs/file.c       2013-07-01 12:54:18.776081600 +0200
+@@ -0,0 +1,679 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -10211,13 +10233,11 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +              int (*flush)(struct file *file, fl_owner_t id))
 +{
 +      int err;
-+      struct dentry *dentry;
 +      struct super_block *sb;
 +      struct inode *inode;
 +
-+      dentry = file->f_dentry;
-+      sb = dentry->d_sb;
-+      inode = dentry->d_inode;
++      inode = file_inode(file);
++      sb = inode->i_sb;
 +      si_noflush_read_lock(sb);
 +      fi_read_lock(file);
 +      ii_read_lock_child(inode);
@@ -10342,8 +10362,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +              for (finfo->fi_btop = 0; finfo->fi_btop <= bend;
 +                   finfo->fi_btop++, p++)
 +                      if (p->hf_file) {
-+                              if (p->hf_file->f_dentry
-+                                  && p->hf_file->f_dentry->d_inode)
++                              if (file_inode(p->hf_file))
 +                                      break;
 +                              else
 +                                      au_hfput(p, file);
@@ -10361,8 +10380,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +      for (fidir->fd_bbot = bend; fidir->fd_bbot >= finfo->fi_btop;
 +           fidir->fd_bbot--, p--)
 +              if (p->hf_file) {
-+                      if (p->hf_file->f_dentry
-+                          && p->hf_file->f_dentry->d_inode)
++                      if (file_inode(p->hf_file))
 +                              break;
 +                      else
 +                              au_hfput(p, file);
@@ -11019,8 +11037,8 @@ diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 --- /usr/share/empty/fs/aufs/f_op.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/f_op.c       2013-03-14 20:07:41.041453062 +0100
-@@ -0,0 +1,723 @@
++++ linux/fs/aufs/f_op.c       2013-07-01 12:54:18.776081600 +0200
+@@ -0,0 +1,720 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -11166,7 +11184,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      /* todo: necessary? */
 +      /* file->f_ra = h_file->f_ra; */
 +      /* update without lock, I don't think it a problem */
-+      fsstack_copy_attr_atime(dentry->d_inode, h_file->f_dentry->d_inode);
++      fsstack_copy_attr_atime(dentry->d_inode, file_inode(h_file));
 +      fput(h_file);
 +
 +out:
@@ -11233,7 +11251,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      err = vfsub_write_u(h_file, buf, count, ppos);
 +      ii_write_lock_child(inode);
 +      au_cpup_attr_timesizes(inode);
-+      inode->i_mode = h_file->f_dentry->d_inode->i_mode;
++      inode->i_mode = file_inode(h_file)->i_mode;
 +      ii_write_unlock(inode);
 +      fput(h_file);
 +
@@ -11301,7 +11319,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      /* todo: necessary? */
 +      /* file->f_ra = h_file->f_ra; */
 +      /* update without lock, I don't think it a problem */
-+      fsstack_copy_attr_atime(dentry->d_inode, h_file->f_dentry->d_inode);
++      fsstack_copy_attr_atime(dentry->d_inode, file_inode(h_file));
 +      fput(h_file);
 +
 +out:
@@ -11346,7 +11364,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      err = au_do_aio(h_file, MAY_WRITE, kio, iov, nv, pos);
 +      ii_write_lock_child(inode);
 +      au_cpup_attr_timesizes(inode);
-+      inode->i_mode = h_file->f_dentry->d_inode->i_mode;
++      inode->i_mode = file_inode(h_file)->i_mode;
 +      ii_write_unlock(inode);
 +      fput(h_file);
 +
@@ -11389,7 +11407,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      /* todo: necessasry? */
 +      /* file->f_ra = h_file->f_ra; */
 +      /* update without lock, I don't think it a problem */
-+      fsstack_copy_attr_atime(dentry->d_inode, h_file->f_dentry->d_inode);
++      fsstack_copy_attr_atime(dentry->d_inode, file_inode(h_file));
 +      fput(h_file);
 +
 +out:
@@ -11434,7 +11452,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      err = vfsub_splice_from(pipe, h_file, ppos, len, flags);
 +      ii_write_lock_child(inode);
 +      au_cpup_attr_timesizes(inode);
-+      inode->i_mode = h_file->f_dentry->d_inode->i_mode;
++      inode->i_mode = file_inode(h_file)->i_mode;
 +      ii_write_unlock(inode);
 +      fput(h_file);
 +
@@ -11550,8 +11568,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +
 +      au_vm_prfile_set(vma, file);
 +      /* update without lock, I don't think it a problem */
-+      fsstack_copy_attr_atime(file->f_dentry->d_inode,
-+                              h_file->f_dentry->d_inode);
++      fsstack_copy_attr_atime(file_inode(file), file_inode(h_file));
 +      goto out_fput; /* success */
 +
 +out_reset:
@@ -11646,11 +11663,9 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      err = -ENOSYS;
 +      h_file = au_hf_top(file);
 +      if (h_file->f_op && h_file->f_op->aio_fsync) {
-+              struct dentry *h_d;
 +              struct mutex *h_mtx;
 +
-+              h_d = h_file->f_dentry;
-+              h_mtx = &h_d->d_inode->i_mutex;
++              h_mtx = &file_inode(h_file)->i_mutex;
 +              if (!is_sync_kiocb(kio)) {
 +                      get_file(h_file);
 +                      fput(file);
@@ -11746,7 +11761,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +};
 diff -urN /usr/share/empty/fs/aufs/f_op_sp.c linux/fs/aufs/f_op_sp.c
 --- /usr/share/empty/fs/aufs/f_op_sp.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/f_op_sp.c    2013-03-14 20:07:41.041453062 +0100
++++ linux/fs/aufs/f_op_sp.c    2013-07-01 12:54:18.776081600 +0200
 @@ -0,0 +1,295 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
@@ -11979,12 +11994,12 @@ diff -urN /usr/share/empty/fs/aufs/f_op_sp.c linux/fs/aufs/f_op_sp.c
 +
 +      sb = dentry->d_sb;
 +      h_file = au_hf_top(file);
-+      h_inode = h_file->f_dentry->d_inode;
++      h_inode = file_inode(h_file);
 +      di_read_unlock(dentry, AuLock_IR);
 +      fi_write_unlock(file);
 +      si_read_unlock(sb);
 +      /* open this fifo in aufs */
-+      err = h_inode->i_fop->open(file->f_dentry->d_inode, file);
++      err = h_inode->i_fop->open(file_inode(file), file);
 +      si_noflush_read_lock(sb);
 +      fi_write_lock(file);
 +      di_read_lock_child(dentry, AuLock_IR);
@@ -12530,8 +12545,8 @@ diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h
 +#endif /* __AUFS_FSTYPE_H__ */
 diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 --- /usr/share/empty/fs/aufs/hfsnotify.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hfsnotify.c  2013-02-19 08:40:03.946892891 +0100
-@@ -0,0 +1,293 @@
++++ linux/fs/aufs/hfsnotify.c  2013-07-01 12:54:21.039493094 +0200
+@@ -0,0 +1,296 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -12650,8 +12665,11 @@ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 +static char *au_hfsn_name(u32 mask)
 +{
 +#ifdef CONFIG_AUFS_DEBUG
-+#define test_ret(flag)        if (mask & flag) \
-+                              return #flag;
++#define test_ret(flag)                                \
++      do {                                    \
++              if (mask & flag)                \
++                      return #flag;           \
++      } while (0)
 +      test_ret(FS_ACCESS);
 +      test_ret(FS_MODIFY);
 +      test_ret(FS_ATTRIB);
@@ -12888,8 +12906,8 @@ diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c
 +}
 diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
 --- /usr/share/empty/fs/aufs/hnotify.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hnotify.c    2013-03-14 20:07:41.041453062 +0100
-@@ -0,0 +1,713 @@
++++ linux/fs/aufs/hnotify.c    2013-07-01 12:54:18.776081600 +0200
+@@ -0,0 +1,712 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -13092,7 +13110,6 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
 +      int err;
 +      struct dentry *d;
 +      struct qstr *dname;
-+      struct hlist_node *p;
 +
 +      err = 1;
 +      if (unlikely(inode->i_ino == AUFS_ROOT_INO)) {
@@ -13105,7 +13122,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
 +              AuDebugOn(!name);
 +              au_iigen_dec(inode);
 +              spin_lock(&inode->i_lock);
-+              hlist_for_each_entry(d, p, &inode->i_dentry, d_alias) {
++              hlist_for_each_entry(d, &inode->i_dentry, d_alias) {
 +                      spin_lock(&d->d_lock);
 +                      dname = &d->d_name;
 +                      if (dname->len != nlen
@@ -15890,7 +15907,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +}
 diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 --- /usr/share/empty/fs/aufs/i_op.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op.c       2013-03-14 20:07:41.041453062 +0100
++++ linux/fs/aufs/i_op.c       2013-07-01 12:54:18.776081600 +0200
 @@ -0,0 +1,1030 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
@@ -16690,8 +16707,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +      unsigned char udba_none, positive;
 +      struct super_block *sb, *h_sb;
 +      struct inode *inode;
-+      struct vfsmount *h_mnt;
-+      struct dentry *h_dentry;
++      struct path h_path;
 +
 +      sb = dentry->d_sb;
 +      inode = dentry->d_inode;
@@ -16724,30 +16740,31 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +              di_read_lock_child(dentry, AuLock_IR);
 +
 +      bindex = au_ibstart(inode);
-+      h_mnt = au_sbr_mnt(sb, bindex);
-+      h_sb = h_mnt->mnt_sb;
++      h_path.mnt = au_sbr_mnt(sb, bindex);
++      h_sb = h_path.mnt->mnt_sb;
 +      if (!au_test_fs_bad_iattr(h_sb) && udba_none)
 +              goto out_fill; /* success */
 +
-+      h_dentry = NULL;
++      h_path.dentry = NULL;
 +      if (au_dbstart(dentry) == bindex)
-+              h_dentry = dget(au_h_dptr(dentry, bindex));
++              h_path.dentry = dget(au_h_dptr(dentry, bindex));
 +      else if (au_opt_test(mnt_flags, PLINK) && au_plink_test(inode)) {
-+              h_dentry = au_plink_lkup(inode, bindex);
-+              if (IS_ERR(h_dentry))
++              h_path.dentry = au_plink_lkup(inode, bindex);
++              if (IS_ERR(h_path.dentry))
 +                      goto out_fill; /* pretending success */
 +      }
 +      /* illegally overlapped or something */
-+      if (unlikely(!h_dentry))
++      if (unlikely(!h_path.dentry))
 +              goto out_fill; /* pretending success */
 +
-+      positive = !!h_dentry->d_inode;
++      positive = !!h_path.dentry->d_inode;
 +      if (positive)
-+              err = vfs_getattr(h_mnt, h_dentry, st);
-+      dput(h_dentry);
++              err = vfs_getattr(&h_path, st);
++      dput(h_path.dentry);
 +      if (!err) {
 +              if (positive)
-+                      au_refresh_iattr(inode, st, h_dentry->d_inode->i_nlink);
++                      au_refresh_iattr(inode, st,
++                                       h_path.dentry->d_inode->i_nlink);
 +              goto out_fill; /* success */
 +      }
 +      AuTraceErr(err);
@@ -18435,11 +18452,10 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +}
 diff -urN /usr/share/empty/fs/aufs/Kconfig linux/fs/aufs/Kconfig
 --- /usr/share/empty/fs/aufs/Kconfig   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/Kconfig      2013-03-14 20:07:41.038119650 +0100
-@@ -0,0 +1,203 @@
++++ linux/fs/aufs/Kconfig      2013-07-01 12:54:18.772748151 +0200
+@@ -0,0 +1,202 @@
 +config AUFS_FS
 +      tristate "Aufs (Advanced multi layered unification filesystem) support"
-+      depends on EXPERIMENTAL
 +      help
 +      Aufs is a stackable unification filesystem such as Unionfs,
 +      which unifies several directories and provides a merged single
@@ -18939,8 +18955,8 @@ diff -urN /usr/share/empty/fs/aufs/Makefile linux/fs/aufs/Makefile
 +aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o
 diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
 --- /usr/share/empty/fs/aufs/module.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/module.c     2013-02-19 08:40:03.950226347 +0100
-@@ -0,0 +1,202 @@
++++ linux/fs/aufs/module.c     2013-07-01 12:54:21.042826542 +0200
+@@ -0,0 +1,203 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -19046,6 +19062,7 @@ diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
 +MODULE_DESCRIPTION(AUFS_NAME
 +      " -- Advanced multi layered unification filesystem");
 +MODULE_VERSION(AUFS_VERSION);
++MODULE_ALIAS_FS(AUFS_NAME);
 +
 +/* this module parameter has no meaning when SYSFS is disabled */
 +int sysaufs_brs = 1;
@@ -22890,8 +22907,8 @@ diff -urN /usr/share/empty/fs/aufs/spl.h linux/fs/aufs/spl.h
 +#endif /* __AUFS_SPL_H__ */
 diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 --- /usr/share/empty/fs/aufs/super.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/super.c      2013-03-14 20:07:41.221457313 +0100
-@@ -0,0 +1,993 @@
++++ linux/fs/aufs/super.c      2013-07-01 12:54:18.776081600 +0200
+@@ -0,0 +1,992 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -23877,9 +23894,8 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +
 +struct file_system_type aufs_fs_type = {
 +      .name           = AUFS_FSTYPE,
-+      .fs_flags       =
-+              FS_RENAME_DOES_D_MOVE   /* a race between rename and others */
-+              | FS_REVAL_DOT,         /* for NFS branch and udba */
++      /* a race between rename and others */
++      .fs_flags       = FS_RENAME_DOES_D_MOVE,
 +      .mount          = aufs_mount,
 +      .kill_sb        = aufs_kill_sb,
 +      /* no need to __module_get() and module_put(). */
@@ -24907,8 +24923,8 @@ diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 --- /usr/share/empty/fs/aufs/sysrq.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysrq.c      2013-03-14 20:07:41.221457313 +0100
-@@ -0,0 +1,148 @@
++++ linux/fs/aufs/sysrq.c      2013-07-01 12:54:21.042826542 +0200
+@@ -0,0 +1,151 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -24946,16 +24962,18 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +      plevel = au_plevel;
 +      au_plevel = KERN_WARNING;
 +
-+      sbinfo = au_sbi(sb);
 +      /* since we define pr_fmt, call printk directly */
++#define pr(str) printk(KERN_WARNING AUFS_NAME ": " str)
++
++      sbinfo = au_sbi(sb);
 +      printk(KERN_WARNING "si=%lx\n", sysaufs_si_id(sbinfo));
-+      printk(KERN_WARNING AUFS_NAME ": superblock\n");
++      pr("superblock\n");
 +      au_dpri_sb(sb);
 +
 +#if 0
-+      printk(KERN_WARNING AUFS_NAME ": root dentry\n");
++      pr("root dentry\n");
 +      au_dpri_dentry(sb->s_root);
-+      printk(KERN_WARNING AUFS_NAME ": root inode\n");
++      pr("root inode\n");
 +      au_dpri_inode(sb->s_root->d_inode);
 +#endif
 +
@@ -24983,7 +25001,7 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +#if 1
 +      {
 +              struct inode *i;
-+              printk(KERN_WARNING AUFS_NAME ": isolated inode\n");
++              pr("isolated inode\n");
 +              spin_lock(&inode_sb_list_lock);
 +              list_for_each_entry(i, &sb->s_inodes, i_sb_list) {
 +                      spin_lock(&i->i_lock);
@@ -24994,17 +25012,18 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +              spin_unlock(&inode_sb_list_lock);
 +      }
 +#endif
-+      printk(KERN_WARNING AUFS_NAME ": files\n");
++      pr("files\n");
 +      lg_global_lock(&files_lglock);
 +      do_file_list_for_each_entry(sb, file) {
 +              umode_t mode;
-+              mode = file->f_dentry->d_inode->i_mode;
++              mode = file_inode(file)->i_mode;
 +              if (!special_file(mode) || au_special_file(mode))
 +                      au_dpri_file(file);
 +      } while_file_list_for_each_entry;
 +      lg_global_unlock(&files_lglock);
-+      printk(KERN_WARNING AUFS_NAME ": done\n");
++      pr("done\n");
 +
++#undef pr
 +      au_plevel = plevel;
 +}
 +
@@ -25059,8 +25078,8 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 --- /usr/share/empty/fs/aufs/vdir.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vdir.c       2013-03-14 20:07:41.221457313 +0100
-@@ -0,0 +1,885 @@
++++ linux/fs/aufs/vdir.c       2013-07-01 12:54:18.776081600 +0200
+@@ -0,0 +1,878 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -25168,24 +25187,20 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +
 +static void au_nhash_wh_do_free(struct hlist_head *head)
 +{
-+      struct au_vdir_wh *tpos;
-+      struct hlist_node *pos, *node;
++      struct au_vdir_wh *pos;
++      struct hlist_node *node;
 +
-+      hlist_for_each_entry_safe(tpos, pos, node, head, wh_hash) {
-+              /* hlist_del(pos); */
-+              kfree(tpos);
-+      }
++      hlist_for_each_entry_safe(pos, node, head, wh_hash)
++              kfree(pos);
 +}
 +
 +static void au_nhash_de_do_free(struct hlist_head *head)
 +{
-+      struct au_vdir_dehstr *tpos;
-+      struct hlist_node *pos, *node;
++      struct au_vdir_dehstr *pos;
++      struct hlist_node *node;
 +
-+      hlist_for_each_entry_safe(tpos, pos, node, head, hash) {
-+              /* hlist_del(pos); */
-+              au_cache_free_vdir_dehstr(tpos);
-+      }
++      hlist_for_each_entry_safe(pos, node, head, hash)
++              au_cache_free_vdir_dehstr(pos);
 +}
 +
 +static void au_nhash_do_free(struct au_nhash *nhash,
@@ -25224,15 +25239,14 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +      int num;
 +      unsigned int u, n;
 +      struct hlist_head *head;
-+      struct au_vdir_wh *tpos;
-+      struct hlist_node *pos;
++      struct au_vdir_wh *pos;
 +
 +      num = 0;
 +      n = whlist->nh_num;
 +      head = whlist->nh_head;
 +      for (u = 0; u < n; u++, head++)
-+              hlist_for_each_entry(tpos, pos, head, wh_hash)
-+                      if (tpos->wh_bindex == btgt && ++num > limit)
++              hlist_for_each_entry(pos, head, wh_hash)
++                      if (pos->wh_bindex == btgt && ++num > limit)
 +                              return 1;
 +      return 0;
 +}
@@ -25264,13 +25278,12 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen)
 +{
 +      struct hlist_head *head;
-+      struct au_vdir_wh *tpos;
-+      struct hlist_node *pos;
++      struct au_vdir_wh *pos;
 +      struct au_vdir_destr *str;
 +
 +      head = au_name_hash(whlist, name, nlen);
-+      hlist_for_each_entry(tpos, pos, head, wh_hash) {
-+              str = &tpos->wh_str;
++      hlist_for_each_entry(pos, head, wh_hash) {
++              str = &pos->wh_str;
 +              AuDbg("%.*s\n", str->len, str->name);
 +              if (au_nhash_test_name(str, name, nlen))
 +                      return 1;
@@ -25282,13 +25295,12 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +static int test_known(struct au_nhash *delist, char *name, int nlen)
 +{
 +      struct hlist_head *head;
-+      struct au_vdir_dehstr *tpos;
-+      struct hlist_node *pos;
++      struct au_vdir_dehstr *pos;
 +      struct au_vdir_destr *str;
 +
 +      head = au_name_hash(delist, name, nlen);
-+      hlist_for_each_entry(tpos, pos, head, hash) {
-+              str = tpos->str;
++      hlist_for_each_entry(pos, head, hash) {
++              str = pos->str;
 +              AuDbg("%.*s\n", str->len, str->name);
 +              if (au_nhash_test_name(str, name, nlen))
 +                      return 1;
@@ -25577,8 +25589,8 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +      int err;
 +      unsigned int nh, u;
 +      struct hlist_head *head;
-+      struct au_vdir_wh *tpos;
-+      struct hlist_node *pos, *n;
++      struct au_vdir_wh *pos;
++      struct hlist_node *n;
 +      char *p, *o;
 +      struct au_vdir_destr *destr;
 +
@@ -25595,11 +25607,11 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +      p += AUFS_WH_PFX_LEN;
 +      for (u = 0; u < nh; u++) {
 +              head = whlist->nh_head + u;
-+              hlist_for_each_entry_safe(tpos, pos, n, head, wh_hash) {
-+                      destr = &tpos->wh_str;
++              hlist_for_each_entry_safe(pos, n, head, wh_hash) {
++                      destr = &pos->wh_str;
 +                      memcpy(p, destr->name, destr->len);
 +                      err = append_de(vdir, o, destr->len + AUFS_WH_PFX_LEN,
-+                                      tpos->wh_ino, tpos->wh_type, delist);
++                                      pos->wh_ino, pos->wh_type, delist);
 +                      if (unlikely(err))
 +                              break;
 +              }
@@ -25695,7 +25707,7 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +      struct au_vdir *vdir, *allocated;
 +
 +      err = 0;
-+      inode = file->f_dentry->d_inode;
++      inode = file_inode(file);
 +      IMustLock(inode);
 +      SiMustAnyLock(inode->i_sb);
 +
@@ -25819,7 +25831,7 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +      } else
 +              return 0; /* success */
 +
-+      inode = file->f_dentry->d_inode;
++      inode = file_inode(file);
 +      err = copy_vdir(vdir_cache, au_ivdir(inode));
 +      if (!err) {
 +              file->f_version = inode->i_version;
@@ -25948,8 +25960,8 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 --- /usr/share/empty/fs/aufs/vfsub.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.c      2013-03-14 20:07:41.221457313 +0100
-@@ -0,0 +1,777 @@
++++ linux/fs/aufs/vfsub.c      2013-07-01 12:54:21.042826542 +0200
+@@ -0,0 +1,769 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -25993,7 +26005,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      h_sb = h_path->dentry->d_sb;
 +      *did = (!au_test_fs_remote(h_sb) && au_test_fs_refresh_iattr(h_sb));
 +      if (*did)
-+              err = vfs_getattr(h_path->mnt, h_path->dentry, &st);
++              err = vfs_getattr(h_path, &st);
 +
 +      return err;
 +}
@@ -26492,23 +26504,18 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +{
 +      int err;
 +      struct inode *h_inode;
++      struct super_block *h_sb;
 +
-+      h_inode = h_path->dentry->d_inode;
 +      if (!h_file) {
-+              err = vfsub_mnt_want_write(h_path->mnt);
-+              if (err)
-+                      goto out;
-+              err = inode_permission(h_inode, MAY_WRITE);
-+              if (err)
-+                      goto out_mnt;
-+              err = get_write_access(h_inode);
-+              if (err)
-+                      goto out_mnt;
-+              err = break_lease(h_inode, O_WRONLY);
-+              if (err)
-+                      goto out_inode;
++              err = vfsub_truncate(h_path, length);
++              goto out;
 +      }
 +
++      h_inode = h_path->dentry->d_inode;
++      h_sb = h_inode->i_sb;
++      lockdep_off();
++      sb_start_write(h_sb);
++      lockdep_on();
 +      err = locks_verify_truncate(h_inode, h_file, length);
 +      if (!err)
 +              err = security_path_truncate(h_path);
@@ -26517,13 +26524,10 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +              err = do_truncate(h_path->dentry, length, attr, h_file);
 +              lockdep_on();
 +      }
++      lockdep_off();
++      sb_end_write(h_sb);
++      lockdep_on();
 +
-+out_inode:
-+      if (!h_file)
-+              put_write_access(h_inode);
-+out_mnt:
-+      if (!h_file)
-+              vfsub_mnt_drop_write(h_path->mnt);
 +out:
 +      return err;
 +}
@@ -26729,8 +26733,8 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 --- /usr/share/empty/fs/aufs/vfsub.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.h      2013-03-14 20:07:41.224790724 +0100
-@@ -0,0 +1,284 @@
++++ linux/fs/aufs/vfsub.h      2013-07-01 12:54:21.042826542 +0200
+@@ -0,0 +1,307 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -26766,6 +26770,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +/* copied from linux/fs/internal.h */
 +/* todo: BAD approach!! */
 +extern struct lglock vfsmount_lock;
++extern void __mnt_drop_write(struct vfsmount *);
 +extern spinlock_t inode_sb_list_lock;
 +
 +/* copied from linux/fs/file_table.c */
@@ -26888,6 +26893,13 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +      lockdep_on();
 +}
 +
++static inline void vfsub_mnt_drop_write_file(struct file *file)
++{
++      lockdep_off();
++      mnt_drop_write_file(file);
++      lockdep_on();
++}
++
 +/* ---------------------------------------------------------------------- */
 +
 +struct au_hinode;
@@ -26921,6 +26933,11 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +int vfsub_flush(struct file *file, fl_owner_t id);
 +int vfsub_readdir(struct file *file, filldir_t filldir, void *arg);
 +
++static inline loff_t vfsub_f_size_read(struct file *file)
++{
++      return i_size_read(file_inode(file));
++}
++
 +static inline unsigned int vfsub_file_flags(struct file *file)
 +{
 +      unsigned int flags;
@@ -26961,6 +26978,16 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +                   unsigned int flags);
 +long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
 +                     loff_t *ppos, size_t len, unsigned int flags);
++
++static inline long vfsub_truncate(struct path *path, loff_t length)
++{
++      long err;
++      lockdep_off();
++      err = vfs_truncate(path, length);
++      lockdep_on();
++      return err;
++}
++
 +int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr,
 +              struct file *h_file);
 +int vfsub_fsync(struct file *file, struct path *path, int datasync);
@@ -27721,8 +27748,8 @@ diff -urN /usr/share/empty/fs/aufs/wbr_policy.c linux/fs/aufs/wbr_policy.c
 +};
 diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 --- /usr/share/empty/fs/aufs/whout.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/whout.c      2013-03-14 20:07:41.224790724 +0100
-@@ -0,0 +1,1042 @@
++++ linux/fs/aufs/whout.c      2013-07-01 12:54:18.776081600 +0200
+@@ -0,0 +1,1041 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -28535,8 +28562,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      struct qstr wh_name;
 +      char *p;
 +      struct hlist_head *head;
-+      struct au_vdir_wh *tpos;
-+      struct hlist_node *pos;
++      struct au_vdir_wh *pos;
 +      struct au_vdir_destr *str;
 +
 +      err = -ENOMEM;
@@ -28551,11 +28577,11 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +      n = whlist->nh_num;
 +      head = whlist->nh_head;
 +      for (ul = 0; !err && ul < n; ul++, head++) {
-+              hlist_for_each_entry(tpos, pos, head, wh_hash) {
-+                      if (tpos->wh_bindex != bindex)
++              hlist_for_each_entry(pos, head, wh_hash) {
++                      if (pos->wh_bindex != bindex)
 +                              continue;
 +
-+                      str = &tpos->wh_str;
++                      str = &pos->wh_str;
 +                      if (str->len + AUFS_WH_PFX_LEN <= PATH_MAX) {
 +                              memcpy(p, str->name, str->len);
 +                              wh_name.len = AUFS_WH_PFX_LEN + str->len;
@@ -29173,8 +29199,8 @@ diff -urN /usr/share/empty/fs/aufs/wkq.h linux/fs/aufs/wkq.h
 +#endif /* __AUFS_WKQ_H__ */
 diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 --- /usr/share/empty/fs/aufs/xino.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xino.c       2013-03-14 20:07:41.224790724 +0100
-@@ -0,0 +1,1265 @@
++++ linux/fs/aufs/xino.c       2013-07-01 12:54:18.782748496 +0200
+@@ -0,0 +1,1264 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -29342,7 +29368,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +              goto out_dput;
 +      }
 +
-+      path.mnt = base_file->f_vfsmnt;
++      path.mnt = base_file->f_path.mnt;
 +      file = vfsub_dentry_open(&path,
 +                               O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE
 +                               /* | __FMODE_NONOTIFY */);
@@ -29359,8 +29385,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +
 +      if (copy_src) {
 +              /* no one can touch copy_src xino */
-+              err = au_copy_file(file, copy_src,
-+                                 i_size_read(copy_src->f_dentry->d_inode));
++              err = au_copy_file(file, copy_src, vfsub_f_size_read(copy_src));
 +              if (unlikely(err)) {
 +                      pr_err("%.*s copy err %d\n", AuLNPair(name), err);
 +                      goto out_fput;
@@ -29487,7 +29512,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      bindex = au_br_index(sb, br->br_id);
 +      err = au_xino_trunc(sb, bindex);
 +      if (!err
-+          && br->br_xino.xi_file->f_dentry->d_inode->i_blocks
++          && file_inode(br->br_xino.xi_file)->i_blocks
 +          >= br->br_xino_upper)
 +              br->br_xino_upper += AUFS_XINO_TRUNC_STEP;
 +
@@ -29507,7 +29532,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      struct xino_do_trunc_args *args;
 +      int wkq_err;
 +
-+      if (br->br_xino.xi_file->f_dentry->d_inode->i_blocks
++      if (file_inode(br->br_xino.xi_file)->i_blocks
 +          < br->br_xino_upper)
 +              return;
 +
@@ -29644,7 +29669,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +
 +      pos = pindex;
 +      pos *= PAGE_SIZE;
-+      if (i_size_read(xib->f_dentry->d_inode) >= pos + PAGE_SIZE)
++      if (vfsub_f_size_read(xib) >= pos + PAGE_SIZE)
 +              sz = xino_fread(sbinfo->si_xread, xib, p, PAGE_SIZE, &pos);
 +      else {
 +              memset(p, 0, PAGE_SIZE);
@@ -29777,7 +29802,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      }
 +
 +      file = sbinfo->si_xib;
-+      pend = i_size_read(file->f_dentry->d_inode) / PAGE_SIZE;
++      pend = vfsub_f_size_read(file) / PAGE_SIZE;
 +      for (ul = pindex + 1; ul <= pend; ul++) {
 +              err = xib_pindex(sb, ul);
 +              if (unlikely(err))
@@ -29830,7 +29855,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      pos *= sizeof(*ino);
 +
 +      file = au_sbr(sb, bindex)->br_xino.xi_file;
-+      if (i_size_read(file->f_dentry->d_inode) < pos + sizeof(*ino))
++      if (vfsub_f_size_read(file) < pos + sizeof(*ino))
 +              return 0; /* no ino */
 +
 +      sz = xino_fread(sbinfo->si_xread, file, ino, sizeof(*ino), &pos);
@@ -30005,7 +30030,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      MtxMustLock(&sbinfo->si_xib_mtx);
 +      p = sbinfo->si_xib_buf;
 +      func = sbinfo->si_xread;
-+      pend = i_size_read(file->f_dentry->d_inode);
++      pend = vfsub_f_size_read(file);
 +      pos = 0;
 +      while (pos < pend) {
 +              sz = xino_fread(func, file, page, PAGE_SIZE, &pos);
@@ -30075,7 +30100,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +              goto out;
 +
 +      file = sbinfo->si_xib;
-+      if (i_size_read(file->f_dentry->d_inode) <= PAGE_SIZE)
++      if (vfsub_f_size_read(file) <= PAGE_SIZE)
 +              goto out;
 +
 +      au_xino_lock_dir(sb, file, &ldir);
@@ -30185,7 +30210,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +
 +      sbinfo->si_xib_last_pindex = 0;
 +      sbinfo->si_xib_next_bit = 0;
-+      if (i_size_read(file->f_dentry->d_inode) < PAGE_SIZE) {
++      if (vfsub_f_size_read(file) < PAGE_SIZE) {
 +              pos = 0;
 +              err = xino_fwrite(sbinfo->si_xwrite, file, sbinfo->si_xib_buf,
 +                                PAGE_SIZE, &pos);
@@ -30465,7 +30490,7 @@ diff -urN /usr/share/empty/include/linux/aufs_type.h linux/include/linux/aufs_ty
 +#include <uapi/linux/aufs_type.h>
 diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/linux/aufs_type.h
 --- /usr/share/empty/include/uapi/linux/aufs_type.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux/include/uapi/linux/aufs_type.h       2013-03-14 20:07:41.224790724 +0100
++++ linux/include/uapi/linux/aufs_type.h       2013-07-01 12:54:21.042826542 +0200
 @@ -0,0 +1,234 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
@@ -30509,7 +30534,7 @@ diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/lin
 +
 +#include <linux/limits.h>
 +
-+#define AUFS_VERSION  "3.8-20130311"
++#define AUFS_VERSION  "3.x-rcN-20130325"
 +
 +/* todo? move this to linux-2.6.19/include/magic.h */
 +#define AUFS_SUPER_MAGIC      ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
@@ -30701,4 +30726,3 @@ diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/lin
 +#define AUFS_CTL_IBUSY                _IOWR(AuCtlType, AuCtl_IBUSY, struct aufs_ibusy)
 +
 +#endif /* __AUFS_TYPE_H__ */
-
This page took 0.113104 seconds and 4 git commands to generate.