diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-10-12 22:24:21 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-11-19 13:01:20 -0500 |
commit | 41d28bca2da4bd75a8915c1ccf2cacf7f4a2e531 (patch) | |
tree | 1a3d658ecfe4375e0ca4f837f6c7f8397efdefba | |
parent | b5ae6b15bd73e35b129408755a0804287a87e041 (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/Exporting | 23 | ||||
-rw-r--r-- | Documentation/filesystems/porting | 4 | ||||
-rw-r--r-- | fs/9p/vfs_inode.c | 2 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 2 | ||||
-rw-r--r-- | fs/ceph/inode.c | 2 | ||||
-rw-r--r-- | fs/cifs/readdir.c | 2 | ||||
-rw-r--r-- | fs/fuse/dir.c | 4 | ||||
-rw-r--r-- | fs/kernfs/dir.c | 2 | ||||
-rw-r--r-- | fs/nfs/dir.c | 4 | ||||
-rw-r--r-- | fs/nfs/getroot.c | 2 | ||||
-rw-r--r-- | include/linux/dcache.h | 1 |
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 | ||
95 | Filesystem Issues | 82 | Filesystem 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 | ||
5309 | unsigned char btrfs_filetype_table[] = { | 5309 | unsigned 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); |
129 | out: | 129 | out: |
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 | ||
1395 | no_entry: | 1395 | no_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 | */ |
231 | extern void d_instantiate(struct dentry *, struct inode *); | 231 | extern void d_instantiate(struct dentry *, struct inode *); |
232 | extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *); | 232 | extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *); |
233 | #define d_materialise_unique(d, i) d_splice_alias(i, d) | ||
234 | extern int d_instantiate_no_diralias(struct dentry *, struct inode *); | 233 | extern int d_instantiate_no_diralias(struct dentry *, struct inode *); |
235 | extern void __d_drop(struct dentry *dentry); | 234 | extern void __d_drop(struct dentry *dentry); |
236 | extern void d_drop(struct dentry *dentry); | 235 | extern void d_drop(struct dentry *dentry); |