From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Sun, 5 Jul 2015 02:36:06 +0000 (-0700)
Subject: Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
X-Git-Tag: v4.2-rc1~2
X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=1dc51b8288007753ad7cd7d08bb8fa930fc8bb10;p=users%2Fwilly%2Fxarray.git

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull more vfs updates from Al Viro:
 "Assorted VFS fixes and related cleanups (IMO the most interesting in
  that part are f_path-related things and Eric's descriptor-related
  stuff).  UFS regression fixes (it got broken last cycle).  9P fixes.
  fs-cache series, DAX patches, Jan's file_remove_suid() work"

[ I'd say this is much more than "fixes and related cleanups".  The
  file_table locking rule change by Eric Dumazet is a rather big and
  fundamental update even if the patch isn't huge.   - Linus ]

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (49 commits)
  9p: cope with bogus responses from server in p9_client_{read,write}
  p9_client_write(): avoid double p9_free_req()
  9p: forgetting to cancel request on interrupted zero-copy RPC
  dax: bdev_direct_access() may sleep
  block: Add support for DAX reads/writes to block devices
  dax: Use copy_from_iter_nocache
  dax: Add block size note to documentation
  fs/file.c: __fget() and dup2() atomicity rules
  fs/file.c: don't acquire files->file_lock in fd_install()
  fs:super:get_anon_bdev: fix race condition could cause dev exceed its upper limitation
  vfs: avoid creation of inode number 0 in get_next_ino
  namei: make set_root_rcu() return void
  make simple_positive() public
  ufs: use dir_pages instead of ufs_dir_pages()
  pagemap.h: move dir_pages() over there
  remove the pointless include of lglock.h
  fs: cleanup slight list_entry abuse
  xfs: Correctly lock inode when removing suid and file capabilities
  fs: Call security_ops->inode_killpriv on truncate
  fs: Provide function telling whether file_remove_privs() will do anything
  ...
---

1dc51b8288007753ad7cd7d08bb8fa930fc8bb10
diff --cc fs/overlayfs/super.c
index 8a08c582bc22,84c5e27fbfd9..7466ff339c66
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@@ -273,57 -273,11 +273,58 @@@ static void ovl_dentry_release(struct d
  	}
  }
  
 +static int ovl_dentry_revalidate(struct dentry *dentry, unsigned int flags)
 +{
 +	struct ovl_entry *oe = dentry->d_fsdata;
 +	unsigned int i;
 +	int ret = 1;
 +
 +	for (i = 0; i < oe->numlower; i++) {
 +		struct dentry *d = oe->lowerstack[i].dentry;
 +
 +		if (d->d_flags & DCACHE_OP_REVALIDATE) {
 +			ret = d->d_op->d_revalidate(d, flags);
 +			if (ret < 0)
 +				return ret;
 +			if (!ret) {
 +				if (!(flags & LOOKUP_RCU))
 +					d_invalidate(d);
 +				return -ESTALE;
 +			}
 +		}
 +	}
 +	return 1;
 +}
 +
 +static int ovl_dentry_weak_revalidate(struct dentry *dentry, unsigned int flags)
 +{
 +	struct ovl_entry *oe = dentry->d_fsdata;
 +	unsigned int i;
 +	int ret = 1;
 +
 +	for (i = 0; i < oe->numlower; i++) {
 +		struct dentry *d = oe->lowerstack[i].dentry;
 +
 +		if (d->d_flags & DCACHE_OP_WEAK_REVALIDATE) {
 +			ret = d->d_op->d_weak_revalidate(d, flags);
 +			if (ret <= 0)
 +				break;
 +		}
 +	}
 +	return ret;
 +}
 +
  static const struct dentry_operations ovl_dentry_operations = {
  	.d_release = ovl_dentry_release,
+ 	.d_select_inode = ovl_d_select_inode,
  };
  
 +static const struct dentry_operations ovl_reval_dentry_operations = {
 +	.d_release = ovl_dentry_release,
 +	.d_revalidate = ovl_dentry_revalidate,
 +	.d_weak_revalidate = ovl_dentry_weak_revalidate,
 +};
 +
  static struct ovl_entry *ovl_alloc_entry(unsigned int numlower)
  {
  	size_t size = offsetof(struct ovl_entry, lowerstack[numlower]);