switch d_materialise_unique() users to d_splice_alias()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2014-10-12 22:24:21 -04:00
parent b5ae6b15bd
commit 41d28bca2d
11 changed files with 19 additions and 29 deletions

View file

@ -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

View file

@ -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 ;-/

View file

@ -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))

View file

@ -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[] = {

View file

@ -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));

View file

@ -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:

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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.

View file

@ -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);