瀏覽代碼

switch d_materialise_unique() users to d_splice_alias()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Al Viro 10 年之前
父節點
當前提交
41d28bca2d

+ 5 - 18
Documentation/filesystems/nfs/Exporting

@@ -72,24 +72,11 @@ c/ Helper routines to allocate anonymous dentries, and to help attach
         DCACHE_DISCONNECTED) dentry is allocated and attached.
         DCACHE_DISCONNECTED) dentry is allocated and attached.
       In the case of a directory, care is taken that only one dentry
       In the case of a directory, care is taken that only one dentry
       can ever be attached.
       can ever be attached.
-    d_splice_alias(inode, dentry) or d_materialise_unique(dentry, inode)
-      will introduce a new dentry into the tree; either the passed-in
-      dentry or a preexisting alias for the given inode (such as an
-      anonymous one created by d_obtain_alias), if appropriate.  The two
-      functions differ in their handling of directories with preexisting
-      aliases:
-        d_splice_alias will use any existing IS_ROOT dentry, but it will
-	  return -EIO rather than try to move a dentry with a different
-	  parent.  This is appropriate for local filesystems, which
-	  should never see such an alias unless the filesystem is
-	  corrupted somehow (for example, if two on-disk directory
-	  entries refer to the same directory.)
-	d_materialise_unique will attempt to move any dentry.  This is
-	  appropriate for distributed filesystems, where finding a
-	  directory other than where we last cached it may be a normal
-	  consequence of concurrent operations on other hosts.
-      Both functions return NULL when the passed-in dentry is used,
-      following the calling convention of ->lookup.
+    d_splice_alias(inode, dentry) will introduce a new dentry into the tree;
+      either the passed-in dentry or a preexisting alias for the given inode
+      (such as an anonymous one created by d_obtain_alias), if appropriate.
+      It returns NULL when the passed-in dentry is used, following the calling
+      convention of ->lookup.
 
 
  
  
 Filesystem Issues
 Filesystem Issues

+ 4 - 0
Documentation/filesystems/porting

@@ -463,3 +463,7 @@ in your dentry operations instead.
 	of the in-tree instances did).  inode_hash_lock is still held,
 	of the in-tree instances did).  inode_hash_lock is still held,
 	of course, so they are still serialized wrt removal from inode hash,
 	of course, so they are still serialized wrt removal from inode hash,
 	as well as wrt set() callback of iget5_locked().
 	as well as wrt set() callback of iget5_locked().
+--
+[mandatory]
+	d_materialise_unique() is gone; d_splice_alias() does everything you
+	need now.  Remember that they have opposite orders of arguments ;-/

+ 1 - 1
fs/9p/vfs_inode.c

@@ -832,7 +832,7 @@ struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
 	 * moved b under k and client parallely did a lookup for
 	 * moved b under k and client parallely did a lookup for
 	 * k/b.
 	 * k/b.
 	 */
 	 */
-	res = d_materialise_unique(dentry, inode);
+	res = d_splice_alias(inode, dentry);
 	if (!res)
 	if (!res)
 		v9fs_fid_add(dentry, fid);
 		v9fs_fid_add(dentry, fid);
 	else if (!IS_ERR(res))
 	else if (!IS_ERR(res))

+ 1 - 1
fs/btrfs/inode.c

@@ -5303,7 +5303,7 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
 			return ERR_CAST(inode);
 			return ERR_CAST(inode);
 	}
 	}
 
 
-	return d_materialise_unique(dentry, inode);
+	return d_splice_alias(inode, dentry);
 }
 }
 
 
 unsigned char btrfs_filetype_table[] = {
 unsigned char btrfs_filetype_table[] = {

+ 1 - 1
fs/ceph/inode.c

@@ -967,7 +967,7 @@ static struct dentry *splice_dentry(struct dentry *dn, struct inode *in,
 	/* dn must be unhashed */
 	/* dn must be unhashed */
 	if (!d_unhashed(dn))
 	if (!d_unhashed(dn))
 		d_drop(dn);
 		d_drop(dn);
-	realdn = d_materialise_unique(dn, in);
+	realdn = d_splice_alias(in, dn);
 	if (IS_ERR(realdn)) {
 	if (IS_ERR(realdn)) {
 		pr_err("splice_dentry error %ld %p inode %p ino %llx.%llx\n",
 		pr_err("splice_dentry error %ld %p inode %p ino %llx.%llx\n",
 		       PTR_ERR(realdn), dn, in, ceph_vinop(in));
 		       PTR_ERR(realdn), dn, in, ceph_vinop(in));

+ 1 - 1
fs/cifs/readdir.c

@@ -123,7 +123,7 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name,
 	if (!inode)
 	if (!inode)
 		goto out;
 		goto out;
 
 
-	alias = d_materialise_unique(dentry, inode);
+	alias = d_splice_alias(inode, dentry);
 	if (alias && !IS_ERR(alias))
 	if (alias && !IS_ERR(alias))
 		dput(alias);
 		dput(alias);
 out:
 out:

+ 2 - 2
fs/fuse/dir.c

@@ -372,7 +372,7 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
 	if (inode && get_node_id(inode) == FUSE_ROOT_ID)
 	if (inode && get_node_id(inode) == FUSE_ROOT_ID)
 		goto out_iput;
 		goto out_iput;
 
 
-	newent = d_materialise_unique(entry, inode);
+	newent = d_splice_alias(inode, entry);
 	err = PTR_ERR(newent);
 	err = PTR_ERR(newent);
 	if (IS_ERR(newent))
 	if (IS_ERR(newent))
 		goto out_err;
 		goto out_err;
@@ -1320,7 +1320,7 @@ static int fuse_direntplus_link(struct file *file,
 	if (!inode)
 	if (!inode)
 		goto out;
 		goto out;
 
 
-	alias = d_materialise_unique(dentry, inode);
+	alias = d_splice_alias(inode, dentry);
 	err = PTR_ERR(alias);
 	err = PTR_ERR(alias);
 	if (IS_ERR(alias))
 	if (IS_ERR(alias))
 		goto out;
 		goto out;

+ 1 - 1
fs/kernfs/dir.c

@@ -807,7 +807,7 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
 	}
 	}
 
 
 	/* instantiate and hash dentry */
 	/* instantiate and hash dentry */
-	ret = d_materialise_unique(dentry, inode);
+	ret = d_splice_alias(inode, dentry);
  out_unlock:
  out_unlock:
 	mutex_unlock(&kernfs_mutex);
 	mutex_unlock(&kernfs_mutex);
 	return ret;
 	return ret;

+ 2 - 2
fs/nfs/dir.c

@@ -499,7 +499,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry)
 	if (IS_ERR(inode))
 	if (IS_ERR(inode))
 		goto out;
 		goto out;
 
 
-	alias = d_materialise_unique(dentry, inode);
+	alias = d_splice_alias(inode, dentry);
 	if (IS_ERR(alias))
 	if (IS_ERR(alias))
 		goto out;
 		goto out;
 	else if (alias) {
 	else if (alias) {
@@ -1393,7 +1393,7 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
 	nfs_advise_use_readdirplus(dir);
 	nfs_advise_use_readdirplus(dir);
 
 
 no_entry:
 no_entry:
-	res = d_materialise_unique(dentry, inode);
+	res = d_splice_alias(inode, dentry);
 	if (res != NULL) {
 	if (res != NULL) {
 		if (IS_ERR(res))
 		if (IS_ERR(res))
 			goto out_unblock_sillyrename;
 			goto out_unblock_sillyrename;

+ 1 - 1
fs/nfs/getroot.c

@@ -51,7 +51,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i
 		/*
 		/*
 		 * Ensure that this dentry is invisible to d_find_alias().
 		 * Ensure that this dentry is invisible to d_find_alias().
 		 * Otherwise, it may be spliced into the tree by
 		 * Otherwise, it may be spliced into the tree by
-		 * d_materialise_unique if a parent directory from the same
+		 * d_splice_alias if a parent directory from the same
 		 * filesystem gets mounted at a later time.
 		 * filesystem gets mounted at a later time.
 		 * This again causes shrink_dcache_for_umount_subtree() to
 		 * This again causes shrink_dcache_for_umount_subtree() to
 		 * Oops, since the test for IS_ROOT() will fail.
 		 * Oops, since the test for IS_ROOT() will fail.

+ 0 - 1
include/linux/dcache.h

@@ -230,7 +230,6 @@ extern seqlock_t rename_lock;
  */
  */
 extern void d_instantiate(struct dentry *, struct inode *);
 extern void d_instantiate(struct dentry *, struct inode *);
 extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *);
 extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *);
-#define d_materialise_unique(d, i) d_splice_alias(i, d)
 extern int d_instantiate_no_diralias(struct dentry *, struct inode *);
 extern int d_instantiate_no_diralias(struct dentry *, struct inode *);
 extern void __d_drop(struct dentry *dentry);
 extern void __d_drop(struct dentry *dentry);
 extern void d_drop(struct dentry *dentry);
 extern void d_drop(struct dentry *dentry);