aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Chinner <dgc@sgi.com>2007-11-23 00:28:17 -0500
committerLachlan McIlroy <lachlan@redback.melbourne.sgi.com>2008-02-07 02:15:29 -0500
commit8ae2c0f64a81a93d2c394eacee29d6ced53b54f9 (patch)
tree6a28f5609daaaa7e8b069323c9a19e9cd87772c4
parenta8272ce0c1d49aa3bec57682678f0bdfe28ed4ca (diff)
[XFS] Fix sparse warning in xlog_recover_do_efd_trans.
Sparse trips over the locking order in xlog_recover_do_efd_trans() when xfs_trans_delete_ail() drops the ail lock. Because the unlock is conditional, we need to either annotate with a "fake unlock" or change the structure of the code so sparse thinks the function always unlocks. Reordering the code makes it simpler, so do that. SGI-PV: 972755 SGI-Modid: xfs-linux-melb:xfs-kern:30003a Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
-rw-r--r--fs/xfs/xfs_log_recover.c14
1 files changed, 3 insertions, 11 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 3b804b93b282..071672969421 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -2733,21 +2733,13 @@ xlog_recover_do_efd_trans(
2733 * AIL lock. 2733 * AIL lock.
2734 */ 2734 */
2735 xfs_trans_delete_ail(mp, lip); 2735 xfs_trans_delete_ail(mp, lip);
2736 break; 2736 xfs_efi_item_free(efip);
2737 return;
2737 } 2738 }
2738 } 2739 }
2739 lip = xfs_trans_next_ail(mp, lip, &gen, NULL); 2740 lip = xfs_trans_next_ail(mp, lip, &gen, NULL);
2740 } 2741 }
2741 2742 spin_unlock(&mp->m_ail_lock);
2742 /*
2743 * If we found it, then free it up. If it wasn't there, it
2744 * must have been overwritten in the log. Oh well.
2745 */
2746 if (lip != NULL) {
2747 xfs_efi_item_free(efip);
2748 } else {
2749 spin_unlock(&mp->m_ail_lock);
2750 }
2751} 2743}
2752 2744
2753/* 2745/*