Skip to content

Commit

Permalink
list.h: new helper - hlist_add_fake()
Browse files Browse the repository at this point in the history
Make node look as if it was on hlist, with hlist_del()
working correctly.  Usable without any locking...

Convert a couple of places where we want to do that to
inode->i_hash.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Oct 26, 2010
1 parent 1d3382c commit 756acc2
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 2 deletions.
2 changes: 1 addition & 1 deletion fs/hfsplus/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ static struct dentry *hfsplus_file_lookup(struct inode *dir, struct dentry *dent
* appear hashed, but do not put on any lists. hlist_del()
* will work fine and require no locking.
*/
inode->i_hash.pprev = &inode->i_hash.next;
hlist_add_fake(&inode->i_hash);

mark_inode_dirty(inode);
out:
Expand Down
2 changes: 1 addition & 1 deletion fs/jfs/jfs_imap.c
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary)
* appear hashed, but do not put on any lists. hlist_del()
* will work fine and require no locking.
*/
ip->i_hash.pprev = &ip->i_hash.next;
hlist_add_fake(&ip->i_hash);

return (ip);
}
Expand Down
6 changes: 6 additions & 0 deletions include/linux/list.h
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,12 @@ static inline void hlist_add_after(struct hlist_node *n,
next->next->pprev = &next->next;
}

/* after that we'll appear to be on some hlist and hlist_del will work */
static inline void hlist_add_fake(struct hlist_node *n)
{
n->pprev = &n->next;
}

/*
* Move a list from one list head to another. Fixup the pprev
* reference of the first entry if it exists.
Expand Down

0 comments on commit 756acc2

Please sign in to comment.