for_each_alias(): helper macro for iterating through dentries of given inode
Most of the places using d_alias are loops iterating through all aliases for given inode; introduce a helper macro (for_each_alias(dentry, inode)) and convert open-coded instances of such loop to it. They are easier to read that way and it reduces the noise on the next steps. You _must_ hold inode->i_lock over that thing. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
7aaa8047ea
commit
408d8af01f
11 changed files with 25 additions and 11 deletions
|
|
@ -1361,3 +1361,13 @@ to match what strlen() would return if it was ran on the string.
|
|||
|
||||
However, if the string is freely accessible for the duration of inode's
|
||||
lifetime, consider using inode_set_cached_link() instead.
|
||||
|
||||
---
|
||||
|
||||
**recommended**
|
||||
|
||||
If you really need to iterate through dentries for given inode, use
|
||||
for_each_alias(dentry, inode) instead of hlist_for_each_entry; better
|
||||
yet, see if any of the exported primitives could be used instead of
|
||||
the entire loop. You still need to hold ->i_lock of the inode over
|
||||
either form of manual loop.
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ affs_fix_dcache(struct inode *inode, u32 entry_ino)
|
|||
{
|
||||
struct dentry *dentry;
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(dentry, inode) {
|
||||
if (entry_ino == (u32)(long)dentry->d_fsdata) {
|
||||
dentry->d_fsdata = (void *)inode->i_ino;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -4614,7 +4614,7 @@ static struct dentry* d_find_primary(struct inode *inode)
|
|||
goto out_unlock;
|
||||
}
|
||||
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(alias, inode) {
|
||||
spin_lock(&alias->d_lock);
|
||||
if (!d_unhashed(alias) &&
|
||||
(ceph_dentry(alias)->flags & CEPH_DENTRY_PRIMARY_LINK)) {
|
||||
|
|
|
|||
|
|
@ -790,7 +790,7 @@ void d_mark_dontcache(struct inode *inode)
|
|||
struct dentry *de;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(de, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(de, inode) {
|
||||
spin_lock(&de->d_lock);
|
||||
de->d_flags |= DCACHE_DONTCACHE;
|
||||
spin_unlock(&de->d_lock);
|
||||
|
|
@ -1040,7 +1040,7 @@ static struct dentry *__d_find_alias(struct inode *inode)
|
|||
if (S_ISDIR(inode->i_mode))
|
||||
return __d_find_any_alias(inode);
|
||||
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(alias, inode) {
|
||||
spin_lock(&alias->d_lock);
|
||||
if (!d_unhashed(alias)) {
|
||||
dget_dlock(alias);
|
||||
|
|
@ -1133,7 +1133,7 @@ void d_prune_aliases(struct inode *inode)
|
|||
struct dentry *dentry;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias)
|
||||
for_each_alias(dentry, inode)
|
||||
d_dispose_if_unused(dentry, &dispose);
|
||||
spin_unlock(&inode->i_lock);
|
||||
shrink_dentry_list(&dispose);
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ find_acceptable_alias(struct dentry *result,
|
|||
|
||||
inode = result->d_inode;
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(dentry, inode) {
|
||||
dget(dentry);
|
||||
spin_unlock(&inode->i_lock);
|
||||
if (toput)
|
||||
|
|
|
|||
|
|
@ -1471,7 +1471,7 @@ static void nfs_clear_verifier_file(struct inode *inode)
|
|||
struct dentry *alias;
|
||||
struct inode *dir;
|
||||
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(alias, inode) {
|
||||
spin_lock(&alias->d_lock);
|
||||
dir = d_inode_rcu(alias->d_parent);
|
||||
if (!dir ||
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ void fsnotify_set_children_dentry_flags(struct inode *inode)
|
|||
spin_lock(&inode->i_lock);
|
||||
/* run all of the dentries associated with this inode. Since this is a
|
||||
* directory, there damn well better only be one item on this list */
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(alias, inode) {
|
||||
struct dentry *child;
|
||||
|
||||
/* run all of the children of the original inode and fix their
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ struct dentry *ocfs2_find_local_alias(struct inode *inode,
|
|||
struct dentry *dentry;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(dentry, inode) {
|
||||
spin_lock(&dentry->d_lock);
|
||||
if (ocfs2_match_dentry(dentry, parent_blkno, skip_unhashed)) {
|
||||
trace_ocfs2_find_local_alias(dentry->d_name.len,
|
||||
|
|
|
|||
|
|
@ -904,7 +904,7 @@ static void ovl_drop_nlink(struct dentry *dentry)
|
|||
|
||||
/* Try to find another, hashed alias */
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(alias, inode) {
|
||||
if (alias != dentry && !d_unhashed(alias))
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1595,7 +1595,7 @@ inode_has_hashed_dentries(struct inode *inode)
|
|||
struct dentry *dentry;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
|
||||
for_each_alias(dentry, inode) {
|
||||
if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -615,4 +615,8 @@ void set_default_d_op(struct super_block *, const struct dentry_operations *);
|
|||
struct dentry *d_make_persistent(struct dentry *, struct inode *);
|
||||
void d_make_discardable(struct dentry *dentry);
|
||||
|
||||
/* inode->i_lock must be held over that */
|
||||
#define for_each_alias(dentry, inode) \
|
||||
hlist_for_each_entry(dentry, &(inode)->i_dentry, d_u.d_alias)
|
||||
|
||||
#endif /* __LINUX_DCACHE_H */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue