Commit 41d28bca authored by Al Viro's avatar Al Viro

switch d_materialise_unique() users to d_splice_alias()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent b5ae6b15
...@@ -72,24 +72,11 @@ c/ Helper routines to allocate anonymous dentries, and to help attach ...@@ -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) d_splice_alias(inode, dentry) will introduce a new dentry into the tree;
will introduce a new dentry into the tree; either the passed-in either the passed-in dentry or a preexisting alias for the given inode
dentry or a preexisting alias for the given inode (such as an (such as an anonymous one created by d_obtain_alias), if appropriate.
anonymous one created by d_obtain_alias), if appropriate. The two It returns NULL when the passed-in dentry is used, following the calling
functions differ in their handling of directories with preexisting convention of ->lookup.
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.
Filesystem Issues Filesystem Issues
......
...@@ -463,3 +463,7 @@ in your dentry operations instead. ...@@ -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 ;-/
...@@ -832,7 +832,7 @@ struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry, ...@@ -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))
......
...@@ -5303,7 +5303,7 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry, ...@@ -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[] = {
......
...@@ -967,7 +967,7 @@ static struct dentry *splice_dentry(struct dentry *dn, struct inode *in, ...@@ -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));
......
...@@ -123,7 +123,7 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name, ...@@ -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:
......
...@@ -372,7 +372,7 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry, ...@@ -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, ...@@ -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;
......
...@@ -807,7 +807,7 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir, ...@@ -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;
......
...@@ -499,7 +499,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) ...@@ -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 ...@@ -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;
......
...@@ -51,7 +51,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i ...@@ -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.
......
...@@ -230,7 +230,6 @@ extern seqlock_t rename_lock; ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment