Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a3cd992 authored by Al Viro's avatar Al Viro
Browse files

iget/iget5: don't bother with ->i_lock until we find a match



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent b18825a7
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -455,3 +455,11 @@ in your dentry operations instead.
	vfs_follow_link has been removed.  Filesystems must use nd_set_link
	vfs_follow_link has been removed.  Filesystems must use nd_set_link
	from ->follow_link for normal symlinks, or nd_jump_link for magic
	from ->follow_link for normal symlinks, or nd_jump_link for magic
	/proc/<pid> style links.
	/proc/<pid> style links.
--
[mandatory]
	iget5_locked()/ilookup5()/ilookup5_nowait() test() callback used to be
	called with both ->i_lock and inode_hash_lock held; the former is *not*
	taken anymore, so verify that your callbacks do not rely on it (none
	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().
+1 −1
Original line number Original line Diff line number Diff line
@@ -83,7 +83,7 @@ int ll_unlock(__u32 mode, struct lustre_handle *lockh)
}
}




/* called from iget5_locked->find_inode() under inode_lock spinlock */
/* called from iget5_locked->find_inode() under inode_hash_lock spinlock */
static int ll_test_inode(struct inode *inode, void *opaque)
static int ll_test_inode(struct inode *inode, void *opaque)
{
{
	struct ll_inode_info *lli = ll_i2info(inode);
	struct ll_inode_info *lli = ll_i2info(inode);
+6 −14
Original line number Original line Diff line number Diff line
@@ -773,15 +773,11 @@ static struct inode *find_inode(struct super_block *sb,


repeat:
repeat:
	hlist_for_each_entry(inode, head, i_hash) {
	hlist_for_each_entry(inode, head, i_hash) {
		spin_lock(&inode->i_lock);
		if (inode->i_sb != sb)
		if (inode->i_sb != sb) {
			spin_unlock(&inode->i_lock);
			continue;
			continue;
		}
		if (!test(inode, data))
		if (!test(inode, data)) {
			spin_unlock(&inode->i_lock);
			continue;
			continue;
		}
		spin_lock(&inode->i_lock);
		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
			__wait_on_freeing_inode(inode);
			__wait_on_freeing_inode(inode);
			goto repeat;
			goto repeat;
@@ -804,15 +800,11 @@ static struct inode *find_inode_fast(struct super_block *sb,


repeat:
repeat:
	hlist_for_each_entry(inode, head, i_hash) {
	hlist_for_each_entry(inode, head, i_hash) {
		spin_lock(&inode->i_lock);
		if (inode->i_ino != ino)
		if (inode->i_ino != ino) {
			spin_unlock(&inode->i_lock);
			continue;
			continue;
		}
		if (inode->i_sb != sb)
		if (inode->i_sb != sb) {
			spin_unlock(&inode->i_lock);
			continue;
			continue;
		}
		spin_lock(&inode->i_lock);
		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
			__wait_on_freeing_inode(inode);
			__wait_on_freeing_inode(inode);
			goto repeat;
			goto repeat;
+1 −1
Original line number Original line Diff line number Diff line
@@ -55,7 +55,7 @@
 *
 *
 * Return 1 if the attributes match and 0 if not.
 * Return 1 if the attributes match and 0 if not.
 *
 *
 * NOTE: This function runs with the inode->i_lock spin lock held so it is not
 * NOTE: This function runs with the inode_hash_lock spin lock held so it is not
 * allowed to sleep.
 * allowed to sleep.
 */
 */
int ntfs_test_inode(struct inode *vi, ntfs_attr *na)
int ntfs_test_inode(struct inode *vi, ntfs_attr *na)