diff options
| -rw-r--r-- | Documentation/filesystems/Locking | 2 | ||||
| -rw-r--r-- | Documentation/filesystems/porting | 5 | ||||
| -rw-r--r-- | Documentation/filesystems/vfs.txt | 8 | ||||
| -rw-r--r-- | fs/9p/vfs_dentry.c | 4 | ||||
| -rw-r--r-- | fs/afs/dir.c | 6 | ||||
| -rw-r--r-- | fs/ceph/dir.c | 6 | ||||
| -rw-r--r-- | fs/cifs/dir.c | 8 | ||||
| -rw-r--r-- | fs/coda/dir.c | 6 | ||||
| -rw-r--r-- | fs/ecryptfs/dentry.c | 20 | ||||
| -rw-r--r-- | fs/fat/namei_vfat.c | 12 | ||||
| -rw-r--r-- | fs/fuse/dir.c | 4 | ||||
| -rw-r--r-- | fs/gfs2/dentry.c | 6 | ||||
| -rw-r--r-- | fs/hfs/sysdep.c | 4 | ||||
| -rw-r--r-- | fs/jfs/namei.c | 6 | ||||
| -rw-r--r-- | fs/namei.c | 2 | ||||
| -rw-r--r-- | fs/ncpfs/dir.c | 6 | ||||
| -rw-r--r-- | fs/nfs/dir.c | 10 | ||||
| -rw-r--r-- | fs/ocfs2/dcache.c | 5 | ||||
| -rw-r--r-- | fs/proc/base.c | 22 | ||||
| -rw-r--r-- | fs/proc/internal.h | 2 | ||||
| -rw-r--r-- | fs/proc/namespaces.c | 2 | ||||
| -rw-r--r-- | fs/proc/proc_sysctl.c | 4 | ||||
| -rw-r--r-- | fs/reiserfs/xattr.c | 2 | ||||
| -rw-r--r-- | fs/sysfs/dir.c | 4 | ||||
| -rw-r--r-- | include/linux/dcache.h | 2 | 
25 files changed, 74 insertions, 84 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 33e5243948f..52a057367f6 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -9,7 +9,7 @@ be able to use diff(1).  --------------------------- dentry_operations --------------------------  prototypes: -	int (*d_revalidate)(struct dentry *, struct nameidata *); +	int (*d_revalidate)(struct dentry *, unsigned int);  	int (*d_hash)(const struct dentry *, const struct inode *,  			struct qstr *);  	int (*d_compare)(const struct dentry *, const struct inode *, diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index ed9fbc23ece..56750b714d1 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting @@ -431,3 +431,8 @@ release it yourself.  	d_alloc_root() is gone, along with a lot of bugs caused by code  misusing it.  Replacement: d_make_root(inode).  The difference is,  d_make_root() drops the reference to inode if dentry allocation fails.   + +-- +[mandatory] +	The witch is dead!  Well, 1/3 of it, anyway.  ->d_revalidate() does *not* +take struct nameidata anymore; just the flags. diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 279de219036..b9a406b2ed0 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt @@ -902,7 +902,7 @@ the VFS uses a default. As of kernel 2.6.22, the following members are  defined:  struct dentry_operations { -	int (*d_revalidate)(struct dentry *, struct nameidata *); +	int (*d_revalidate)(struct dentry *, unsigned int);  	int (*d_hash)(const struct dentry *, const struct inode *,  			struct qstr *);  	int (*d_compare)(const struct dentry *, const struct inode *, @@ -921,11 +921,11 @@ struct dentry_operations {  	dcache. Most filesystems leave this as NULL, because all their  	dentries in the dcache are valid -	d_revalidate may be called in rcu-walk mode (nd->flags & LOOKUP_RCU). +	d_revalidate may be called in rcu-walk mode (flags & LOOKUP_RCU).  	If in rcu-walk mode, the filesystem must revalidate the dentry without  	blocking or storing to the dentry, d_parent and d_inode should not be -	used without care (because they can go NULL), instead nd->inode should -	be used. +	used without care (because they can change and, in d_inode case, even +	become NULL under us).  	If a situation is encountered that rcu-walk cannot handle, return  	-ECHILD and it will be called again in ref-walk mode. diff --git a/fs/9p/vfs_dentry.c b/fs/9p/vfs_dentry.c index d529437ff44..64600b5d052 100644 --- a/fs/9p/vfs_dentry.c +++ b/fs/9p/vfs_dentry.c @@ -100,13 +100,13 @@ static void v9fs_dentry_release(struct dentry *dentry)  	}  } -static int v9fs_lookup_revalidate(struct dentry *dentry, struct nameidata *nd) +static int v9fs_lookup_revalidate(struct dentry *dentry, unsigned int flags)  {  	struct p9_fid *fid;  	struct inode *inode;  	struct v9fs_inode *v9inode; -	if (nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	inode = dentry->d_inode; diff --git a/fs/afs/dir.c b/fs/afs/dir.c index e22dc4b4a50..65c54ab0473 100644 --- a/fs/afs/dir.c +++ b/fs/afs/dir.c @@ -23,7 +23,7 @@ static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,  				 struct nameidata *nd);  static int afs_dir_open(struct inode *inode, struct file *file);  static int afs_readdir(struct file *file, void *dirent, filldir_t filldir); -static int afs_d_revalidate(struct dentry *dentry, struct nameidata *nd); +static int afs_d_revalidate(struct dentry *dentry, unsigned int flags);  static int afs_d_delete(const struct dentry *dentry);  static void afs_d_release(struct dentry *dentry);  static int afs_lookup_filldir(void *_cookie, const char *name, int nlen, @@ -598,7 +598,7 @@ success:   * - NOTE! the hit can be a negative hit too, so we can't assume we have an   *   inode   */ -static int afs_d_revalidate(struct dentry *dentry, struct nameidata *nd) +static int afs_d_revalidate(struct dentry *dentry, unsigned int flags)  {  	struct afs_vnode *vnode, *dir;  	struct afs_fid uninitialized_var(fid); @@ -607,7 +607,7 @@ static int afs_d_revalidate(struct dentry *dentry, struct nameidata *nd)  	void *dir_version;  	int ret; -	if (nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	vnode = AFS_FS_I(dentry->d_inode); diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index d42eee1c5de..8898eef8bca 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -1042,12 +1042,12 @@ static int dir_lease_is_valid(struct inode *dir, struct dentry *dentry)  /*   * Check if cached dentry can be trusted.   */ -static int ceph_d_revalidate(struct dentry *dentry, struct nameidata *nd) +static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)  {  	int valid = 0;  	struct inode *dir; -	if (nd && nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	dout("d_revalidate %p '%.*s' inode %p offset %lld\n", dentry, @@ -1094,7 +1094,7 @@ static void ceph_d_release(struct dentry *dentry)  }  static int ceph_snapdir_d_revalidate(struct dentry *dentry, -					  struct nameidata *nd) +					  unsigned int flags)  {  	/*  	 * Eventually, we'll want to revalidate snapped metadata diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index e8c53c80dbd..b97ff48b7df 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c @@ -700,9 +700,9 @@ lookup_out:  }  static int -cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd) +cifs_d_revalidate(struct dentry *direntry, unsigned int flags)  { -	if (nd && (nd->flags & LOOKUP_RCU)) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	if (direntry->d_inode) { @@ -731,7 +731,7 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd)  	 * This may be nfsd (or something), anyway, we can't see the  	 * intent of this. So, since this can be for creation, drop it.  	 */ -	if (!nd) +	if (!flags)  		return 0;  	/* @@ -739,7 +739,7 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd)  	 * case sensitive name which is specified by user if this is  	 * for creation.  	 */ -	if (nd->flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET)) +	if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))  		return 0;  	if (time_after(jiffies, direntry->d_time + HZ) || !lookupCacheEnabled) diff --git a/fs/coda/dir.c b/fs/coda/dir.c index 17751582906..7f8f1a7c6d8 100644 --- a/fs/coda/dir.c +++ b/fs/coda/dir.c @@ -46,7 +46,7 @@ static int coda_rename(struct inode *old_inode, struct dentry *old_dentry,  static int coda_readdir(struct file *file, void *buf, filldir_t filldir);  /* dentry ops */ -static int coda_dentry_revalidate(struct dentry *de, struct nameidata *nd); +static int coda_dentry_revalidate(struct dentry *de, unsigned int flags);  static int coda_dentry_delete(const struct dentry *);  /* support routines */ @@ -536,12 +536,12 @@ out:  }  /* called when a cache lookup succeeds */ -static int coda_dentry_revalidate(struct dentry *de, struct nameidata *nd) +static int coda_dentry_revalidate(struct dentry *de, unsigned int flags)  {  	struct inode *inode;  	struct coda_inode_info *cii; -	if (nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	inode = de->d_inode; diff --git a/fs/ecryptfs/dentry.c b/fs/ecryptfs/dentry.c index 534c1d46e69..1b5d9af937d 100644 --- a/fs/ecryptfs/dentry.c +++ b/fs/ecryptfs/dentry.c @@ -32,7 +32,7 @@  /**   * ecryptfs_d_revalidate - revalidate an ecryptfs dentry   * @dentry: The ecryptfs dentry - * @nd: The associated nameidata + * @flags: lookup flags   *   * Called when the VFS needs to revalidate a dentry. This   * is called whenever a name lookup finds a dentry in the @@ -42,32 +42,20 @@   * Returns 1 if valid, 0 otherwise.   *   */ -static int ecryptfs_d_revalidate(struct dentry *dentry, struct nameidata *nd) +static int ecryptfs_d_revalidate(struct dentry *dentry, unsigned int flags)  {  	struct dentry *lower_dentry;  	struct vfsmount *lower_mnt; -	struct dentry *dentry_save = NULL; -	struct vfsmount *vfsmount_save = NULL;  	int rc = 1; -	if (nd && nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	lower_dentry = ecryptfs_dentry_to_lower(dentry);  	lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);  	if (!lower_dentry->d_op || !lower_dentry->d_op->d_revalidate)  		goto out; -	if (nd) { -		dentry_save = nd->path.dentry; -		vfsmount_save = nd->path.mnt; -		nd->path.dentry = lower_dentry; -		nd->path.mnt = lower_mnt; -	} -	rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd); -	if (nd) { -		nd->path.dentry = dentry_save; -		nd->path.mnt = vfsmount_save; -	} +	rc = lower_dentry->d_op->d_revalidate(lower_dentry, flags);  	if (dentry->d_inode) {  		struct inode *lower_inode =  			ecryptfs_inode_to_lower(dentry->d_inode); diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 98ae804f527..0bbdf399006 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c @@ -41,9 +41,9 @@ static int vfat_revalidate_shortname(struct dentry *dentry)  	return ret;  } -static int vfat_revalidate(struct dentry *dentry, struct nameidata *nd) +static int vfat_revalidate(struct dentry *dentry, unsigned int flags)  { -	if (nd && nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	/* This is not negative dentry. Always valid. */ @@ -52,9 +52,9 @@ static int vfat_revalidate(struct dentry *dentry, struct nameidata *nd)  	return vfat_revalidate_shortname(dentry);  } -static int vfat_revalidate_ci(struct dentry *dentry, struct nameidata *nd) +static int vfat_revalidate_ci(struct dentry *dentry, unsigned int flags)  { -	if (nd && nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	/* @@ -74,7 +74,7 @@ static int vfat_revalidate_ci(struct dentry *dentry, struct nameidata *nd)  	 * This may be nfsd (or something), anyway, we can't see the  	 * intent of this. So, since this can be for creation, drop it.  	 */ -	if (!nd) +	if (!flags)  		return 0;  	/* @@ -82,7 +82,7 @@ static int vfat_revalidate_ci(struct dentry *dentry, struct nameidata *nd)  	 * case sensitive name which is specified by user if this is  	 * for creation.  	 */ -	if (nd->flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET)) +	if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))  		return 0;  	return vfat_revalidate_shortname(dentry); diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index ccdab3ac422..eba30bd9ba2 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -154,7 +154,7 @@ u64 fuse_get_attr_version(struct fuse_conn *fc)   * the lookup once more.  If the lookup results in the same inode,   * then refresh the attributes, timeouts and mark the dentry valid.   */ -static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) +static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)  {  	struct inode *inode; @@ -174,7 +174,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)  		if (!inode)  			return 0; -		if (nd && (nd->flags & LOOKUP_RCU)) +		if (flags & LOOKUP_RCU)  			return -ECHILD;  		fc = get_fuse_conn(inode); diff --git a/fs/gfs2/dentry.c b/fs/gfs2/dentry.c index 0da8da2c991..4fddb3c22d2 100644 --- a/fs/gfs2/dentry.c +++ b/fs/gfs2/dentry.c @@ -25,7 +25,7 @@  /**   * gfs2_drevalidate - Check directory lookup consistency   * @dentry: the mapping to check - * @nd: + * @flags: lookup flags   *   * Check to make sure the lookup necessary to arrive at this inode from its   * parent is still good. @@ -33,7 +33,7 @@   * Returns: 1 if the dentry is ok, 0 if it isn't   */ -static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd) +static int gfs2_drevalidate(struct dentry *dentry, unsigned int flags)  {  	struct dentry *parent;  	struct gfs2_sbd *sdp; @@ -44,7 +44,7 @@ static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd)  	int error;  	int had_lock = 0; -	if (nd && nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	parent = dget_parent(dentry); diff --git a/fs/hfs/sysdep.c b/fs/hfs/sysdep.c index 19cf291eb91..91b91fd3a90 100644 --- a/fs/hfs/sysdep.c +++ b/fs/hfs/sysdep.c @@ -13,12 +13,12 @@  /* dentry case-handling: just lowercase everything */ -static int hfs_revalidate_dentry(struct dentry *dentry, struct nameidata *nd) +static int hfs_revalidate_dentry(struct dentry *dentry, unsigned int flags)  {  	struct inode *inode;  	int diff; -	if (nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	inode = dentry->d_inode; diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 07c91ca6017..f37977fb087 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c @@ -1570,7 +1570,7 @@ out:  	return result;  } -static int jfs_ci_revalidate(struct dentry *dentry, struct nameidata *nd) +static int jfs_ci_revalidate(struct dentry *dentry, unsigned int flags)  {  	/*  	 * This is not negative dentry. Always valid. @@ -1589,7 +1589,7 @@ static int jfs_ci_revalidate(struct dentry *dentry, struct nameidata *nd)  	 * This may be nfsd (or something), anyway, we can't see the  	 * intent of this. So, since this can be for creation, drop it.  	 */ -	if (!nd) +	if (!flags)  		return 0;  	/* @@ -1597,7 +1597,7 @@ static int jfs_ci_revalidate(struct dentry *dentry, struct nameidata *nd)  	 * case sensitive name which is specified by user if this is  	 * for creation.  	 */ -	if (nd->flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET)) +	if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))  		return 0;  	return 1;  } diff --git a/fs/namei.c b/fs/namei.c index 16256d915cb..1a5707aaed3 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -465,7 +465,7 @@ err_root:  static inline int d_revalidate(struct dentry *dentry, struct nameidata *nd)  { -	return dentry->d_op->d_revalidate(dentry, nd); +	return dentry->d_op->d_revalidate(dentry, nd ? nd->flags : 0);  }  /** diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index aeed93a6bde..32607f74958 100644 --- a/fs/ncpfs/dir.c +++ b/fs/ncpfs/dir.c @@ -72,7 +72,7 @@ const struct inode_operations ncp_dir_inode_operations =  /*   * Dentry operations routines   */ -static int ncp_lookup_validate(struct dentry *, struct nameidata *); +static int ncp_lookup_validate(struct dentry *, unsigned int);  static int ncp_hash_dentry(const struct dentry *, const struct inode *,  		struct qstr *);  static int ncp_compare_dentry(const struct dentry *, const struct inode *, @@ -290,7 +290,7 @@ leave_me:;  static int -ncp_lookup_validate(struct dentry *dentry, struct nameidata *nd) +ncp_lookup_validate(struct dentry *dentry, unsigned int flags)  {  	struct ncp_server *server;  	struct dentry *parent; @@ -302,7 +302,7 @@ ncp_lookup_validate(struct dentry *dentry, struct nameidata *nd)  	if (dentry == dentry->d_sb->s_root)  		return 1; -	if (nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	parent = dget_parent(dentry); diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 71a199435ca..656f52e9aa2 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1098,9 +1098,8 @@ int nfs_neg_need_reval(struct inode *dir, struct dentry *dentry,   * If the parent directory is seen to have changed, we throw out the   * cached dentry and do a new lookup.   */ -static int nfs_lookup_revalidate(struct dentry *dentry, struct nameidata *nd) +static int nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags)  { -	unsigned int flags = nd->flags;  	struct inode *dir;  	struct inode *inode;  	struct dentry *parent; @@ -1339,7 +1338,7 @@ out:  }  #ifdef CONFIG_NFS_V4 -static int nfs4_lookup_revalidate(struct dentry *, struct nameidata *); +static int nfs4_lookup_revalidate(struct dentry *, unsigned int);  const struct dentry_operations nfs4_dentry_operations = {  	.d_revalidate	= nfs4_lookup_revalidate, @@ -1491,9 +1490,8 @@ no_open:  	return finish_no_open(file, res);  } -static int nfs4_lookup_revalidate(struct dentry *dentry, struct nameidata *nd) +static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)  { -	unsigned int flags = nd->flags;  	struct dentry *parent = NULL;  	struct inode *inode;  	struct inode *dir; @@ -1537,7 +1535,7 @@ out:  no_open_dput:  	dput(parent);  no_open: -	return nfs_lookup_revalidate(dentry, nd); +	return nfs_lookup_revalidate(dentry, flags);  }  #endif /* CONFIG_NFSV4 */ diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index af4488268e4..8db4b58b2e4 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c @@ -49,14 +49,13 @@ void ocfs2_dentry_attach_gen(struct dentry *dentry)  } -static int ocfs2_dentry_revalidate(struct dentry *dentry, -				   struct nameidata *nd) +static int ocfs2_dentry_revalidate(struct dentry *dentry, unsigned int flags)  {  	struct inode *inode;  	int ret = 0;    /* if all else fails, just return false */  	struct ocfs2_super *osb; -	if (nd && nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	inode = dentry->d_inode; diff --git a/fs/proc/base.c b/fs/proc/base.c index 437195f204e..bf749cca4cc 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1601,13 +1601,13 @@ int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)   * made this apply to all per process world readable and executable   * directories.   */ -int pid_revalidate(struct dentry *dentry, struct nameidata *nd) +int pid_revalidate(struct dentry *dentry, unsigned int flags)  {  	struct inode *inode;  	struct task_struct *task;  	const struct cred *cred; -	if (nd && nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	inode = dentry->d_inode; @@ -1781,7 +1781,7 @@ static int proc_fd_link(struct dentry *dentry, struct path *path)  	return proc_fd_info(dentry->d_inode, path, NULL);  } -static int tid_fd_revalidate(struct dentry *dentry, struct nameidata *nd) +static int tid_fd_revalidate(struct dentry *dentry, unsigned int flags)  {  	struct inode *inode;  	struct task_struct *task; @@ -1789,7 +1789,7 @@ static int tid_fd_revalidate(struct dentry *dentry, struct nameidata *nd)  	struct files_struct *files;  	const struct cred *cred; -	if (nd && nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	inode = dentry->d_inode; @@ -1868,7 +1868,7 @@ static struct dentry *proc_fd_instantiate(struct inode *dir,  	d_set_d_op(dentry, &tid_fd_dentry_operations);  	d_add(dentry, inode);  	/* Close the race of the process dying before we return the dentry */ -	if (tid_fd_revalidate(dentry, NULL)) +	if (tid_fd_revalidate(dentry, 0))  		error = NULL;   out: @@ -2003,7 +2003,7 @@ static int dname_to_vma_addr(struct dentry *dentry,  	return 0;  } -static int map_files_d_revalidate(struct dentry *dentry, struct nameidata *nd) +static int map_files_d_revalidate(struct dentry *dentry, unsigned int flags)  {  	unsigned long vm_start, vm_end;  	bool exact_vma_exists = false; @@ -2013,7 +2013,7 @@ static int map_files_d_revalidate(struct dentry *dentry, struct nameidata *nd)  	struct inode *inode;  	int status = 0; -	if (nd && nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	if (!capable(CAP_SYS_ADMIN)) { @@ -2371,7 +2371,7 @@ static struct dentry *proc_fdinfo_instantiate(struct inode *dir,  	d_set_d_op(dentry, &tid_fd_dentry_operations);  	d_add(dentry, inode);  	/* Close the race of the process dying before we return the dentry */ -	if (tid_fd_revalidate(dentry, NULL)) +	if (tid_fd_revalidate(dentry, 0))  		error = NULL;   out: @@ -2430,7 +2430,7 @@ static struct dentry *proc_pident_instantiate(struct inode *dir,  	d_set_d_op(dentry, &pid_dentry_operations);  	d_add(dentry, inode);  	/* Close the race of the process dying before we return the dentry */ -	if (pid_revalidate(dentry, NULL)) +	if (pid_revalidate(dentry, 0))  		error = NULL;  out:  	return error; @@ -3237,7 +3237,7 @@ static struct dentry *proc_pid_instantiate(struct inode *dir,  	d_add(dentry, inode);  	/* Close the race of the process dying before we return the dentry */ -	if (pid_revalidate(dentry, NULL)) +	if (pid_revalidate(dentry, 0))  		error = NULL;  out:  	return error; @@ -3508,7 +3508,7 @@ static struct dentry *proc_task_instantiate(struct inode *dir,  	d_add(dentry, inode);  	/* Close the race of the process dying before we return the dentry */ -	if (pid_revalidate(dentry, NULL)) +	if (pid_revalidate(dentry, 0))  		error = NULL;  out:  	return error; diff --git a/fs/proc/internal.h b/fs/proc/internal.h index eca4aca5b6e..e0c2a48dab7 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -142,7 +142,7 @@ typedef struct dentry *instantiate_t(struct inode *, struct dentry *,  int proc_fill_cache(struct file *filp, void *dirent, filldir_t filldir,  	const char *name, int len,  	instantiate_t instantiate, struct task_struct *task, const void *ptr); -int pid_revalidate(struct dentry *dentry, struct nameidata *nd); +int pid_revalidate(struct dentry *dentry, unsigned int flags);  struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *task);  extern const struct dentry_operations pid_dentry_operations;  int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat); diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c index 0d9e23a39e4..40ceb40f985 100644 --- a/fs/proc/namespaces.c +++ b/fs/proc/namespaces.c @@ -56,7 +56,7 @@ static struct dentry *proc_ns_instantiate(struct inode *dir,  	d_set_d_op(dentry, &pid_dentry_operations);  	d_add(dentry, inode);  	/* Close the race of the process dying before we return the dentry */ -	if (pid_revalidate(dentry, NULL)) +	if (pid_revalidate(dentry, 0))  		error = NULL;  out:  	return error; diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index 3476bca8f7a..fda69fa3909 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c @@ -794,9 +794,9 @@ static const struct inode_operations proc_sys_dir_operations = {  	.getattr	= proc_sys_getattr,  }; -static int proc_sys_revalidate(struct dentry *dentry, struct nameidata *nd) +static int proc_sys_revalidate(struct dentry *dentry, unsigned int flags)  { -	if (nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	return !PROC_I(dentry->d_inode)->sysctl->unregistering;  } diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index 46fc1c20a6b..e6ad8d7dea6 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c @@ -942,7 +942,7 @@ int reiserfs_permission(struct inode *inode, int mask)  	return generic_permission(inode, mask);  } -static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd) +static int xattr_hide_revalidate(struct dentry *dentry, unsigned int flags)  {  	return -EPERM;  } diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index e6bb9b2a4cb..038e74b3af8 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -303,12 +303,12 @@ static int sysfs_dentry_delete(const struct dentry *dentry)  	return !!(sd->s_flags & SYSFS_FLAG_REMOVED);  } -static int sysfs_dentry_revalidate(struct dentry *dentry, struct nameidata *nd) +static int sysfs_dentry_revalidate(struct dentry *dentry, unsigned int flags)  {  	struct sysfs_dirent *sd;  	int is_dir; -	if (nd->flags & LOOKUP_RCU) +	if (flags & LOOKUP_RCU)  		return -ECHILD;  	sd = dentry->d_fsdata; diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 8ca25551820..caa34e50537 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -144,7 +144,7 @@ enum dentry_d_lock_class  };  struct dentry_operations { -	int (*d_revalidate)(struct dentry *, struct nameidata *); +	int (*d_revalidate)(struct dentry *, unsigned int);  	int (*d_hash)(const struct dentry *, const struct inode *,  			struct qstr *);  	int (*d_compare)(const struct dentry *, const struct inode *,  |