aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2014-10-12 22:24:21 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2014-11-19 13:01:20 -0500
commit41d28bca2da4bd75a8915c1ccf2cacf7f4a2e531 (patch)
tree1a3d658ecfe4375e0ca4f837f6c7f8397efdefba
parentb5ae6b15bd73e35b129408755a0804287a87e041 (diff)
switch d_materialise_unique() users to d_splice_alias()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--Documentation/filesystems/nfs/Exporting23
-rw-r--r--Documentation/filesystems/porting4
-rw-r--r--fs/9p/vfs_inode.c2
-rw-r--r--fs/btrfs/inode.c2
-rw-r--r--fs/ceph/inode.c2
-rw-r--r--fs/cifs/readdir.c2
-rw-r--r--fs/fuse/dir.c4
-rw-r--r--fs/kernfs/dir.c2
-rw-r--r--fs/nfs/dir.c4
-rw-r--r--fs/nfs/getroot.c2
-rw-r--r--include/linux/dcache.h1
11 files changed, 19 insertions, 29 deletions
diff --git a/Documentation/filesystems/nfs/Exporting b/Documentation/filesystems/nfs/Exporting
index c8f036a9b13f..520a4becb75c 100644
--- a/Documentation/filesystems/nfs/Exporting
+++ b/Documentation/filesystems/nfs/Exporting
@@ -72,24 +72,11 @@ c/ Helper routines to allocate anonymous dentries, and to help attach
72 DCACHE_DISCONNECTED) dentry is allocated and attached. 72 DCACHE_DISCONNECTED) dentry is allocated and attached.
73 In the case of a directory, care is taken that only one dentry 73 In the case of a directory, care is taken that only one dentry
74 can ever be attached. 74 can ever be attached.
75 d_splice_alias(inode, dentry) or d_materialise_unique(dentry, inode) 75 d_splice_alias(inode, dentry) will introduce a new dentry into the tree;
76 will introduce a new dentry into the tree; either the passed-in 76 either the passed-in dentry or a preexisting alias for the given inode
77 dentry or a preexisting alias for the given inode (such as an 77 (such as an anonymous one created by d_obtain_alias), if appropriate.
78 anonymous one created by d_obtain_alias), if appropriate. The two 78 It returns NULL when the passed-in dentry is used, following the calling
79 functions differ in their handling of directories with preexisting 79 convention of ->lookup.
80 aliases:
81 d_splice_alias will use any existing IS_ROOT dentry, but it will
82 return -EIO rather than try to move a dentry with a different
83 parent. This is appropriate for local filesystems, which
84 should never see such an alias unless the filesystem is
85 corrupted somehow (for example, if two on-disk directory
86 entries refer to the same directory.)
87 d_materialise_unique will attempt to move any dentry. This is
88 appropriate for distributed filesystems, where finding a
89 directory other than where we last cached it may be a normal
90 consequence of concurrent operations on other hosts.
91 Both functions return NULL when the passed-in dentry is used,
92 following the calling convention of ->lookup.
93 80
94 81
95Filesystem Issues 82Filesystem Issues
diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting
index 0f3a1390bf00..b6b55a9cffee 100644
--- a/Documentation/filesystems/porting
+++ b/Documentation/filesystems/porting
@@ -463,3 +463,7 @@ in your dentry operations instead.
463 of the in-tree instances did). inode_hash_lock is still held, 463 of the in-tree instances did). inode_hash_lock is still held,
464 of course, so they are still serialized wrt removal from inode hash, 464 of course, so they are still serialized wrt removal from inode hash,
465 as well as wrt set() callback of iget5_locked(). 465 as well as wrt set() callback of iget5_locked().
466--
467[mandatory]
468 d_materialise_unique() is gone; d_splice_alias() does everything you
469 need now. Remember that they have opposite orders of arguments ;-/
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index 296482fc77a9..9ee5343d4884 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -832,7 +832,7 @@ struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
832 * moved b under k and client parallely did a lookup for 832 * moved b under k and client parallely did a lookup for
833 * k/b. 833 * k/b.
834 */ 834 */
835 res = d_materialise_unique(dentry, inode); 835 res = d_splice_alias(inode, dentry);
836 if (!res) 836 if (!res)
837 v9fs_fid_add(dentry, fid); 837 v9fs_fid_add(dentry, fid);
838 else if (!IS_ERR(res)) 838 else if (!IS_ERR(res))
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index d23362f4464e..ff0dcc016b71 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5303,7 +5303,7 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
5303 return ERR_CAST(inode); 5303 return ERR_CAST(inode);
5304 } 5304 }
5305 5305
5306 return d_materialise_unique(dentry, inode); 5306 return d_splice_alias(inode, dentry);
5307} 5307}
5308 5308
5309unsigned char btrfs_filetype_table[] = { 5309unsigned char btrfs_filetype_table[] = {
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 7a1df90c7771..90ec8e32c138 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -967,7 +967,7 @@ static struct dentry *splice_dentry(struct dentry *dn, struct inode *in,
967 /* dn must be unhashed */ 967 /* dn must be unhashed */
968 if (!d_unhashed(dn)) 968 if (!d_unhashed(dn))
969 d_drop(dn); 969 d_drop(dn);
970 realdn = d_materialise_unique(dn, in); 970 realdn = d_splice_alias(in, dn);
971 if (IS_ERR(realdn)) { 971 if (IS_ERR(realdn)) {
972 pr_err("splice_dentry error %ld %p inode %p ino %llx.%llx\n", 972 pr_err("splice_dentry error %ld %p inode %p ino %llx.%llx\n",
973 PTR_ERR(realdn), dn, in, ceph_vinop(in)); 973 PTR_ERR(realdn), dn, in, ceph_vinop(in));
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
index 8fd2a95860ba..586e3d3b204e 100644
--- a/fs/cifs/readdir.c
+++ b/fs/cifs/readdir.c
@@ -123,7 +123,7 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name,
123 if (!inode) 123 if (!inode)
124 goto out; 124 goto out;
125 125
126 alias = d_materialise_unique(dentry, inode); 126 alias = d_splice_alias(inode, dentry);
127 if (alias && !IS_ERR(alias)) 127 if (alias && !IS_ERR(alias))
128 dput(alias); 128 dput(alias);
129out: 129out:
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index dbab798f5caf..df562cc87763 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -372,7 +372,7 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
372 if (inode && get_node_id(inode) == FUSE_ROOT_ID) 372 if (inode && get_node_id(inode) == FUSE_ROOT_ID)
373 goto out_iput; 373 goto out_iput;
374 374
375 newent = d_materialise_unique(entry, inode); 375 newent = d_splice_alias(inode, entry);
376 err = PTR_ERR(newent); 376 err = PTR_ERR(newent);
377 if (IS_ERR(newent)) 377 if (IS_ERR(newent))
378 goto out_err; 378 goto out_err;
@@ -1320,7 +1320,7 @@ static int fuse_direntplus_link(struct file *file,
1320 if (!inode) 1320 if (!inode)
1321 goto out; 1321 goto out;
1322 1322
1323 alias = d_materialise_unique(dentry, inode); 1323 alias = d_splice_alias(inode, dentry);
1324 err = PTR_ERR(alias); 1324 err = PTR_ERR(alias);
1325 if (IS_ERR(alias)) 1325 if (IS_ERR(alias))
1326 goto out; 1326 goto out;
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c
index 1c771931bb60..37989f02a226 100644
--- a/fs/kernfs/dir.c
+++ b/fs/kernfs/dir.c
@@ -807,7 +807,7 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
807 } 807 }
808 808
809 /* instantiate and hash dentry */ 809 /* instantiate and hash dentry */
810 ret = d_materialise_unique(dentry, inode); 810 ret = d_splice_alias(inode, dentry);
811 out_unlock: 811 out_unlock:
812 mutex_unlock(&kernfs_mutex); 812 mutex_unlock(&kernfs_mutex);
813 return ret; 813 return ret;
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 06e8cfcbb670..44d7d0c7e376 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -499,7 +499,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry)
499 if (IS_ERR(inode)) 499 if (IS_ERR(inode))
500 goto out; 500 goto out;
501 501
502 alias = d_materialise_unique(dentry, inode); 502 alias = d_splice_alias(inode, dentry);
503 if (IS_ERR(alias)) 503 if (IS_ERR(alias))
504 goto out; 504 goto out;
505 else if (alias) { 505 else if (alias) {
@@ -1393,7 +1393,7 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
1393 nfs_advise_use_readdirplus(dir); 1393 nfs_advise_use_readdirplus(dir);
1394 1394
1395no_entry: 1395no_entry:
1396 res = d_materialise_unique(dentry, inode); 1396 res = d_splice_alias(inode, dentry);
1397 if (res != NULL) { 1397 if (res != NULL) {
1398 if (IS_ERR(res)) 1398 if (IS_ERR(res))
1399 goto out_unblock_sillyrename; 1399 goto out_unblock_sillyrename;
diff --git a/fs/nfs/getroot.c b/fs/nfs/getroot.c
index ebc6a0add5ae..9ac3846cb59e 100644
--- a/fs/nfs/getroot.c
+++ b/fs/nfs/getroot.c
@@ -51,7 +51,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i
51 /* 51 /*
52 * Ensure that this dentry is invisible to d_find_alias(). 52 * Ensure that this dentry is invisible to d_find_alias().
53 * Otherwise, it may be spliced into the tree by 53 * Otherwise, it may be spliced into the tree by
54 * d_materialise_unique if a parent directory from the same 54 * d_splice_alias if a parent directory from the same
55 * filesystem gets mounted at a later time. 55 * filesystem gets mounted at a later time.
56 * This again causes shrink_dcache_for_umount_subtree() to 56 * This again causes shrink_dcache_for_umount_subtree() to
57 * Oops, since the test for IS_ROOT() will fail. 57 * Oops, since the test for IS_ROOT() will fail.
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index ee569da27b72..5a813988e6d4 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -230,7 +230,6 @@ extern seqlock_t rename_lock;
230 */ 230 */
231extern void d_instantiate(struct dentry *, struct inode *); 231extern void d_instantiate(struct dentry *, struct inode *);
232extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *); 232extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *);
233#define d_materialise_unique(d, i) d_splice_alias(i, d)
234extern int d_instantiate_no_diralias(struct dentry *, struct inode *); 233extern int d_instantiate_no_diralias(struct dentry *, struct inode *);
235extern void __d_drop(struct dentry *dentry); 234extern void __d_drop(struct dentry *dentry);
236extern void d_drop(struct dentry *dentry); 235extern void d_drop(struct dentry *dentry);