mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-25 16:11:45 +00:00
switch d_materialise_unique() users to d_splice_alias()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
b5ae6b15bd
commit
41d28bca2d
11 changed files with 19 additions and 29 deletions
|
@ -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.
|
||||||
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,
|
||||||
* 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,
|
||||||
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,
|
||||||
/* 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,
|
||||||
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,
|
||||||
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;
|
||||||
|
|
|
@ -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)
|
||||||
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;
|
||||||
|
|
|
@ -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;
|
||||||
*/
|
*/
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue