[XFS] Unlock inode before calling xfs_idestroy()
authorLachlan McIlroy <lachlan@sgi.com>
Thu, 30 Oct 2008 05:53:38 +0000 (16:53 +1100)
committerLachlan McIlroy <lachlan@sgi.com>
Thu, 30 Oct 2008 05:53:38 +0000 (16:53 +1100)
Lock debugging reported the ilock was being destroyed without being
unlocked. We don't need to lock the inode until we are going to insert it
into the radix tree.

SGI-PV: 987246

SGI-Modid: xfs-linux-melb:xfs-kern:32159a

Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Signed-off-by: Christoph Hellwig <hch@infradead.org>
fs/xfs/xfs_iget.c

index 5be89d760a9aadbfd0e2461156e0ab12b973e3cf..4c92d190b3bd9779798a22d64c46d0d0cb9affbd 100644 (file)
@@ -210,9 +210,6 @@ finish_inode:
 
        xfs_itrace_exit_tag(ip, "xfs_iget.alloc");
 
-       if (lock_flags)
-               xfs_ilock(ip, lock_flags);
-
        if ((ip->i_d.di_mode == 0) && !(flags & XFS_IGET_CREATE)) {
                xfs_idestroy(ip);
                xfs_put_perag(mp, pag);
@@ -228,6 +225,10 @@ finish_inode:
                delay(1);
                goto again;
        }
+
+       if (lock_flags)
+               xfs_ilock(ip, lock_flags);
+
        mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1);
        first_index = agino & mask;
        write_lock(&pag->pag_ici_lock);
@@ -239,6 +240,8 @@ finish_inode:
                BUG_ON(error != -EEXIST);
                write_unlock(&pag->pag_ici_lock);
                radix_tree_preload_end();
+               if (lock_flags)
+                       xfs_iunlock(ip, lock_flags);
                xfs_idestroy(ip);
                XFS_STATS_INC(xs_ig_dup);
                goto again;