switch d_materialise_unique() users to d_splice_alias()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
b5ae6b15bd
Коммит
41d28bca2d
|
@ -72,24 +72,11 @@ c/ Helper routines to allocate anonymous dentries, and to help attach
|
|||
DCACHE_DISCONNECTED) dentry is allocated and attached.
|
||||
In the case of a directory, care is taken that only one dentry
|
||||
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
|
||||
|
|
|
@ -463,3 +463,7 @@ in your dentry operations instead.
|
|||
of the in-tree instances did). inode_hash_lock is still held,
|
||||
of course, so they are still serialized wrt removal from inode hash,
|
||||
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,
|
|||
* moved b under k and client parallely did a lookup for
|
||||
* k/b.
|
||||
*/
|
||||
res = d_materialise_unique(dentry, inode);
|
||||
res = d_splice_alias(inode, dentry);
|
||||
if (!res)
|
||||
v9fs_fid_add(dentry, fid);
|
||||
else if (!IS_ERR(res))
|
||||
|
|
|
@ -5303,7 +5303,7 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
|
|||
return ERR_CAST(inode);
|
||||
}
|
||||
|
||||
return d_materialise_unique(dentry, inode);
|
||||
return d_splice_alias(inode, dentry);
|
||||
}
|
||||
|
||||
unsigned char btrfs_filetype_table[] = {
|
||||
|
|
|
@ -967,7 +967,7 @@ static struct dentry *splice_dentry(struct dentry *dn, struct inode *in,
|
|||
/* dn must be unhashed */
|
||||
if (!d_unhashed(dn))
|
||||
d_drop(dn);
|
||||
realdn = d_materialise_unique(dn, in);
|
||||
realdn = d_splice_alias(in, dn);
|
||||
if (IS_ERR(realdn)) {
|
||||
pr_err("splice_dentry error %ld %p inode %p ino %llx.%llx\n",
|
||||
PTR_ERR(realdn), dn, in, ceph_vinop(in));
|
||||
|
|
|
@ -123,7 +123,7 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name,
|
|||
if (!inode)
|
||||
goto out;
|
||||
|
||||
alias = d_materialise_unique(dentry, inode);
|
||||
alias = d_splice_alias(inode, dentry);
|
||||
if (alias && !IS_ERR(alias))
|
||||
dput(alias);
|
||||
out:
|
||||
|
|
|
@ -372,7 +372,7 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
|
|||
if (inode && get_node_id(inode) == FUSE_ROOT_ID)
|
||||
goto out_iput;
|
||||
|
||||
newent = d_materialise_unique(entry, inode);
|
||||
newent = d_splice_alias(inode, entry);
|
||||
err = PTR_ERR(newent);
|
||||
if (IS_ERR(newent))
|
||||
goto out_err;
|
||||
|
@ -1320,7 +1320,7 @@ static int fuse_direntplus_link(struct file *file,
|
|||
if (!inode)
|
||||
goto out;
|
||||
|
||||
alias = d_materialise_unique(dentry, inode);
|
||||
alias = d_splice_alias(inode, dentry);
|
||||
err = PTR_ERR(alias);
|
||||
if (IS_ERR(alias))
|
||||
goto out;
|
||||
|
|
|
@ -807,7 +807,7 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
|
|||
}
|
||||
|
||||
/* instantiate and hash dentry */
|
||||
ret = d_materialise_unique(dentry, inode);
|
||||
ret = d_splice_alias(inode, dentry);
|
||||
out_unlock:
|
||||
mutex_unlock(&kernfs_mutex);
|
||||
return ret;
|
||||
|
|
|
@ -499,7 +499,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry)
|
|||
if (IS_ERR(inode))
|
||||
goto out;
|
||||
|
||||
alias = d_materialise_unique(dentry, inode);
|
||||
alias = d_splice_alias(inode, dentry);
|
||||
if (IS_ERR(alias))
|
||||
goto out;
|
||||
else if (alias) {
|
||||
|
@ -1393,7 +1393,7 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
|
|||
nfs_advise_use_readdirplus(dir);
|
||||
|
||||
no_entry:
|
||||
res = d_materialise_unique(dentry, inode);
|
||||
res = d_splice_alias(inode, dentry);
|
||||
if (res != NULL) {
|
||||
if (IS_ERR(res))
|
||||
goto out_unblock_sillyrename;
|
||||
|
|
|
@ -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().
|
||||
* 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.
|
||||
* This again causes shrink_dcache_for_umount_subtree() to
|
||||
* Oops, since the test for IS_ROOT() will fail.
|
||||
|
|
|
@ -230,7 +230,6 @@ extern seqlock_t rename_lock;
|
|||
*/
|
||||
extern void d_instantiate(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 void __d_drop(struct dentry *dentry);
|
||||
extern void d_drop(struct dentry *dentry);
|
||||
|
|
Загрузка…
Ссылка в новой задаче