diff options
| author | Donald Douwsma <donaldd@sgi.com> | 2007-10-11 03:36:05 -0400 |
|---|---|---|
| committer | Lachlan McIlroy <lachlan@redback.melbourne.sgi.com> | 2008-02-07 00:44:23 -0500 |
| commit | 287f3dad14828275d2517c8696ad118c82b9243f (patch) | |
| tree | 4868d40f6c49984ff84f2957d84a3de160d46d7a | |
| parent | 541d7d3c4b31e2b0ac846fe6d2eb5cdbe1353095 (diff) | |
[XFS] Unwrap AIL_LOCK
SGI-PV: 970382
SGI-Modid: xfs-linux-melb:xfs-kern:29739a
Signed-off-by: Donald Douwsma <donaldd@sgi.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Signed-off-by: Tim Shimmin <tes@sgi.com>
| -rw-r--r-- | fs/xfs/quota/xfs_dquot.c | 12 | ||||
| -rw-r--r-- | fs/xfs/quota/xfs_dquot_item.c | 11 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf_item.c | 10 | ||||
| -rw-r--r-- | fs/xfs/xfs_extfree_item.c | 21 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.c | 22 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode_item.c | 21 | ||||
| -rw-r--r-- | fs/xfs/xfs_log_recover.c | 21 | ||||
| -rw-r--r-- | fs/xfs/xfs_mount.c | 4 | ||||
| -rw-r--r-- | fs/xfs/xfs_mount.h | 9 | ||||
| -rw-r--r-- | fs/xfs/xfs_trans.c | 7 | ||||
| -rw-r--r-- | fs/xfs/xfs_trans_ail.c | 52 | ||||
| -rw-r--r-- | fs/xfs/xfs_trans_priv.h | 5 |
12 files changed, 81 insertions, 114 deletions
diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index cfdd35ee9f7a..665babcca6a6 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c | |||
| @@ -1209,7 +1209,6 @@ xfs_qm_dqflush( | |||
| 1209 | xfs_buf_t *bp; | 1209 | xfs_buf_t *bp; |
| 1210 | xfs_disk_dquot_t *ddqp; | 1210 | xfs_disk_dquot_t *ddqp; |
| 1211 | int error; | 1211 | int error; |
| 1212 | SPLDECL(s); | ||
| 1213 | 1212 | ||
| 1214 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); | 1213 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); |
| 1215 | ASSERT(XFS_DQ_IS_FLUSH_LOCKED(dqp)); | 1214 | ASSERT(XFS_DQ_IS_FLUSH_LOCKED(dqp)); |
| @@ -1270,9 +1269,9 @@ xfs_qm_dqflush( | |||
| 1270 | mp = dqp->q_mount; | 1269 | mp = dqp->q_mount; |
| 1271 | 1270 | ||
| 1272 | /* lsn is 64 bits */ | 1271 | /* lsn is 64 bits */ |
| 1273 | AIL_LOCK(mp, s); | 1272 | spin_lock(&mp->m_ail_lock); |
| 1274 | dqp->q_logitem.qli_flush_lsn = dqp->q_logitem.qli_item.li_lsn; | 1273 | dqp->q_logitem.qli_flush_lsn = dqp->q_logitem.qli_item.li_lsn; |
| 1275 | AIL_UNLOCK(mp, s); | 1274 | spin_unlock(&mp->m_ail_lock); |
| 1276 | 1275 | ||
| 1277 | /* | 1276 | /* |
| 1278 | * Attach an iodone routine so that we can remove this dquot from the | 1277 | * Attach an iodone routine so that we can remove this dquot from the |
| @@ -1318,7 +1317,6 @@ xfs_qm_dqflush_done( | |||
| 1318 | xfs_dq_logitem_t *qip) | 1317 | xfs_dq_logitem_t *qip) |
| 1319 | { | 1318 | { |
| 1320 | xfs_dquot_t *dqp; | 1319 | xfs_dquot_t *dqp; |
| 1321 | SPLDECL(s); | ||
| 1322 | 1320 | ||
| 1323 | dqp = qip->qli_dquot; | 1321 | dqp = qip->qli_dquot; |
| 1324 | 1322 | ||
| @@ -1333,15 +1331,15 @@ xfs_qm_dqflush_done( | |||
| 1333 | if ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && | 1331 | if ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && |
| 1334 | qip->qli_item.li_lsn == qip->qli_flush_lsn) { | 1332 | qip->qli_item.li_lsn == qip->qli_flush_lsn) { |
| 1335 | 1333 | ||
| 1336 | AIL_LOCK(dqp->q_mount, s); | 1334 | spin_lock(&dqp->q_mount->m_ail_lock); |
| 1337 | /* | 1335 | /* |
| 1338 | * xfs_trans_delete_ail() drops the AIL lock. | 1336 | * xfs_trans_delete_ail() drops the AIL lock. |
| 1339 | */ | 1337 | */ |
| 1340 | if (qip->qli_item.li_lsn == qip->qli_flush_lsn) | 1338 | if (qip->qli_item.li_lsn == qip->qli_flush_lsn) |
| 1341 | xfs_trans_delete_ail(dqp->q_mount, | 1339 | xfs_trans_delete_ail(dqp->q_mount, |
| 1342 | (xfs_log_item_t*)qip, s); | 1340 | (xfs_log_item_t*)qip); |
| 1343 | else | 1341 | else |
| 1344 | AIL_UNLOCK(dqp->q_mount, s); | 1342 | spin_unlock(&dqp->q_mount->m_ail_lock); |
| 1345 | } | 1343 | } |
| 1346 | 1344 | ||
| 1347 | /* | 1345 | /* |
diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index ddb61fe22a5c..a00b71b05a37 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c | |||
| @@ -216,8 +216,8 @@ xfs_qm_dqunpin_wait( | |||
| 216 | * If so, we want to push it out to help us take this item off the AIL as soon | 216 | * If so, we want to push it out to help us take this item off the AIL as soon |
| 217 | * as possible. | 217 | * as possible. |
| 218 | * | 218 | * |
| 219 | * We must not be holding the AIL_LOCK at this point. Calling incore() to | 219 | * We must not be holding the AIL lock at this point. Calling incore() to |
| 220 | * search the buffer cache can be a time consuming thing, and AIL_LOCK is a | 220 | * search the buffer cache can be a time consuming thing, and AIL lock is a |
| 221 | * spinlock. | 221 | * spinlock. |
| 222 | */ | 222 | */ |
| 223 | STATIC void | 223 | STATIC void |
| @@ -322,7 +322,7 @@ xfs_qm_dquot_logitem_trylock( | |||
| 322 | * want to do that now since we might sleep in the device | 322 | * want to do that now since we might sleep in the device |
| 323 | * strategy routine. We also don't want to grab the buffer lock | 323 | * strategy routine. We also don't want to grab the buffer lock |
| 324 | * here because we'd like not to call into the buffer cache | 324 | * here because we'd like not to call into the buffer cache |
| 325 | * while holding the AIL_LOCK. | 325 | * while holding the AIL lock. |
| 326 | * Make sure to only return PUSHBUF if we set pushbuf_flag | 326 | * Make sure to only return PUSHBUF if we set pushbuf_flag |
| 327 | * ourselves. If someone else is doing it then we don't | 327 | * ourselves. If someone else is doing it then we don't |
| 328 | * want to go to the push routine and duplicate their efforts. | 328 | * want to go to the push routine and duplicate their efforts. |
| @@ -562,15 +562,14 @@ xfs_qm_qoffend_logitem_committed( | |||
| 562 | xfs_lsn_t lsn) | 562 | xfs_lsn_t lsn) |
| 563 | { | 563 | { |
| 564 | xfs_qoff_logitem_t *qfs; | 564 | xfs_qoff_logitem_t *qfs; |
| 565 | SPLDECL(s); | ||
| 566 | 565 | ||
| 567 | qfs = qfe->qql_start_lip; | 566 | qfs = qfe->qql_start_lip; |
| 568 | AIL_LOCK(qfs->qql_item.li_mountp,s); | 567 | spin_lock(&qfs->qql_item.li_mountp->m_ail_lock); |
| 569 | /* | 568 | /* |
| 570 | * Delete the qoff-start logitem from the AIL. | 569 | * Delete the qoff-start logitem from the AIL. |
| 571 | * xfs_trans_delete_ail() drops the AIL lock. | 570 | * xfs_trans_delete_ail() drops the AIL lock. |
| 572 | */ | 571 | */ |
| 573 | xfs_trans_delete_ail(qfs->qql_item.li_mountp, (xfs_log_item_t *)qfs, s); | 572 | xfs_trans_delete_ail(qfs->qql_item.li_mountp, (xfs_log_item_t *)qfs); |
| 574 | kmem_free(qfs, sizeof(xfs_qoff_logitem_t)); | 573 | kmem_free(qfs, sizeof(xfs_qoff_logitem_t)); |
| 575 | kmem_free(qfe, sizeof(xfs_qoff_logitem_t)); | 574 | kmem_free(qfe, sizeof(xfs_qoff_logitem_t)); |
| 576 | return (xfs_lsn_t)-1; | 575 | return (xfs_lsn_t)-1; |
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index c8f2c2886fe4..63debd147eb5 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c | |||
| @@ -378,7 +378,6 @@ xfs_buf_item_unpin( | |||
| 378 | xfs_mount_t *mp; | 378 | xfs_mount_t *mp; |
| 379 | xfs_buf_t *bp; | 379 | xfs_buf_t *bp; |
| 380 | int freed; | 380 | int freed; |
| 381 | SPLDECL(s); | ||
| 382 | 381 | ||
| 383 | bp = bip->bli_buf; | 382 | bp = bip->bli_buf; |
| 384 | ASSERT(bp != NULL); | 383 | ASSERT(bp != NULL); |
| @@ -409,8 +408,8 @@ xfs_buf_item_unpin( | |||
| 409 | XFS_BUF_SET_FSPRIVATE(bp, NULL); | 408 | XFS_BUF_SET_FSPRIVATE(bp, NULL); |
| 410 | XFS_BUF_CLR_IODONE_FUNC(bp); | 409 | XFS_BUF_CLR_IODONE_FUNC(bp); |
| 411 | } else { | 410 | } else { |
| 412 | AIL_LOCK(mp,s); | 411 | spin_lock(&mp->m_ail_lock); |
| 413 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)bip, s); | 412 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)bip); |
| 414 | xfs_buf_item_relse(bp); | 413 | xfs_buf_item_relse(bp); |
| 415 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) == NULL); | 414 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) == NULL); |
| 416 | } | 415 | } |
| @@ -1113,7 +1112,6 @@ xfs_buf_iodone( | |||
| 1113 | xfs_buf_log_item_t *bip) | 1112 | xfs_buf_log_item_t *bip) |
| 1114 | { | 1113 | { |
| 1115 | struct xfs_mount *mp; | 1114 | struct xfs_mount *mp; |
| 1116 | SPLDECL(s); | ||
| 1117 | 1115 | ||
| 1118 | ASSERT(bip->bli_buf == bp); | 1116 | ASSERT(bip->bli_buf == bp); |
| 1119 | 1117 | ||
| @@ -1128,11 +1126,11 @@ xfs_buf_iodone( | |||
| 1128 | * | 1126 | * |
| 1129 | * Either way, AIL is useless if we're forcing a shutdown. | 1127 | * Either way, AIL is useless if we're forcing a shutdown. |
| 1130 | */ | 1128 | */ |
| 1131 | AIL_LOCK(mp,s); | 1129 | spin_lock(&mp->m_ail_lock); |
| 1132 | /* | 1130 | /* |
| 1133 | * xfs_trans_delete_ail() drops the AIL lock. | 1131 | * xfs_trans_delete_ail() drops the AIL lock. |
| 1134 | */ | 1132 | */ |
| 1135 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)bip, s); | 1133 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)bip); |
| 1136 | 1134 | ||
| 1137 | #ifdef XFS_TRANS_DEBUG | 1135 | #ifdef XFS_TRANS_DEBUG |
| 1138 | kmem_free(bip->bli_orig, XFS_BUF_COUNT(bp)); | 1136 | kmem_free(bip->bli_orig, XFS_BUF_COUNT(bp)); |
diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index f938a51be81b..132bd07b9bb8 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c | |||
| @@ -110,19 +110,18 @@ STATIC void | |||
| 110 | xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) | 110 | xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) |
| 111 | { | 111 | { |
| 112 | xfs_mount_t *mp; | 112 | xfs_mount_t *mp; |
| 113 | SPLDECL(s); | ||
| 114 | 113 | ||
| 115 | mp = efip->efi_item.li_mountp; | 114 | mp = efip->efi_item.li_mountp; |
| 116 | AIL_LOCK(mp, s); | 115 | spin_lock(&mp->m_ail_lock); |
| 117 | if (efip->efi_flags & XFS_EFI_CANCELED) { | 116 | if (efip->efi_flags & XFS_EFI_CANCELED) { |
| 118 | /* | 117 | /* |
| 119 | * xfs_trans_delete_ail() drops the AIL lock. | 118 | * xfs_trans_delete_ail() drops the AIL lock. |
| 120 | */ | 119 | */ |
| 121 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); | 120 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip); |
| 122 | xfs_efi_item_free(efip); | 121 | xfs_efi_item_free(efip); |
| 123 | } else { | 122 | } else { |
| 124 | efip->efi_flags |= XFS_EFI_COMMITTED; | 123 | efip->efi_flags |= XFS_EFI_COMMITTED; |
| 125 | AIL_UNLOCK(mp, s); | 124 | spin_unlock(&mp->m_ail_lock); |
| 126 | } | 125 | } |
| 127 | } | 126 | } |
| 128 | 127 | ||
| @@ -138,10 +137,9 @@ xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) | |||
| 138 | { | 137 | { |
| 139 | xfs_mount_t *mp; | 138 | xfs_mount_t *mp; |
| 140 | xfs_log_item_desc_t *lidp; | 139 | xfs_log_item_desc_t *lidp; |
| 141 | SPLDECL(s); | ||
| 142 | 140 | ||
| 143 | mp = efip->efi_item.li_mountp; | 141 | mp = efip->efi_item.li_mountp; |
| 144 | AIL_LOCK(mp, s); | 142 | spin_lock(&mp->m_ail_lock); |
| 145 | if (efip->efi_flags & XFS_EFI_CANCELED) { | 143 | if (efip->efi_flags & XFS_EFI_CANCELED) { |
| 146 | /* | 144 | /* |
| 147 | * free the xaction descriptor pointing to this item | 145 | * free the xaction descriptor pointing to this item |
| @@ -152,11 +150,11 @@ xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) | |||
| 152 | * pull the item off the AIL. | 150 | * pull the item off the AIL. |
| 153 | * xfs_trans_delete_ail() drops the AIL lock. | 151 | * xfs_trans_delete_ail() drops the AIL lock. |
| 154 | */ | 152 | */ |
| 155 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); | 153 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip); |
| 156 | xfs_efi_item_free(efip); | 154 | xfs_efi_item_free(efip); |
| 157 | } else { | 155 | } else { |
| 158 | efip->efi_flags |= XFS_EFI_COMMITTED; | 156 | efip->efi_flags |= XFS_EFI_COMMITTED; |
| 159 | AIL_UNLOCK(mp, s); | 157 | spin_unlock(&mp->m_ail_lock); |
| 160 | } | 158 | } |
| 161 | } | 159 | } |
| 162 | 160 | ||
| @@ -350,13 +348,12 @@ xfs_efi_release(xfs_efi_log_item_t *efip, | |||
| 350 | { | 348 | { |
| 351 | xfs_mount_t *mp; | 349 | xfs_mount_t *mp; |
| 352 | int extents_left; | 350 | int extents_left; |
| 353 | SPLDECL(s); | ||
| 354 | 351 | ||
| 355 | mp = efip->efi_item.li_mountp; | 352 | mp = efip->efi_item.li_mountp; |
| 356 | ASSERT(efip->efi_next_extent > 0); | 353 | ASSERT(efip->efi_next_extent > 0); |
| 357 | ASSERT(efip->efi_flags & XFS_EFI_COMMITTED); | 354 | ASSERT(efip->efi_flags & XFS_EFI_COMMITTED); |
| 358 | 355 | ||
| 359 | AIL_LOCK(mp, s); | 356 | spin_lock(&mp->m_ail_lock); |
| 360 | ASSERT(efip->efi_next_extent >= nextents); | 357 | ASSERT(efip->efi_next_extent >= nextents); |
| 361 | efip->efi_next_extent -= nextents; | 358 | efip->efi_next_extent -= nextents; |
| 362 | extents_left = efip->efi_next_extent; | 359 | extents_left = efip->efi_next_extent; |
| @@ -364,10 +361,10 @@ xfs_efi_release(xfs_efi_log_item_t *efip, | |||
| 364 | /* | 361 | /* |
| 365 | * xfs_trans_delete_ail() drops the AIL lock. | 362 | * xfs_trans_delete_ail() drops the AIL lock. |
| 366 | */ | 363 | */ |
| 367 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); | 364 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip); |
| 368 | xfs_efi_item_free(efip); | 365 | xfs_efi_item_free(efip); |
| 369 | } else { | 366 | } else { |
| 370 | AIL_UNLOCK(mp, s); | 367 | spin_unlock(&mp->m_ail_lock); |
| 371 | } | 368 | } |
| 372 | } | 369 | } |
| 373 | 370 | ||
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index a6d35aee93b2..e7930680fff4 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -2205,7 +2205,6 @@ xfs_ifree_cluster( | |||
| 2205 | xfs_inode_log_item_t *iip; | 2205 | xfs_inode_log_item_t *iip; |
| 2206 | xfs_log_item_t *lip; | 2206 | xfs_log_item_t *lip; |
| 2207 | xfs_perag_t *pag = xfs_get_perag(mp, inum); | 2207 | xfs_perag_t *pag = xfs_get_perag(mp, inum); |
| 2208 | SPLDECL(s); | ||
| 2209 | 2208 | ||
| 2210 | if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) { | 2209 | if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) { |
| 2211 | blks_per_cluster = 1; | 2210 | blks_per_cluster = 1; |
| @@ -2307,9 +2306,9 @@ xfs_ifree_cluster( | |||
| 2307 | iip = (xfs_inode_log_item_t *)lip; | 2306 | iip = (xfs_inode_log_item_t *)lip; |
| 2308 | ASSERT(iip->ili_logged == 1); | 2307 | ASSERT(iip->ili_logged == 1); |
| 2309 | lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done; | 2308 | lip->li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) xfs_istale_done; |
| 2310 | AIL_LOCK(mp,s); | 2309 | spin_lock(&mp->m_ail_lock); |
| 2311 | iip->ili_flush_lsn = iip->ili_item.li_lsn; | 2310 | iip->ili_flush_lsn = iip->ili_item.li_lsn; |
| 2312 | AIL_UNLOCK(mp, s); | 2311 | spin_unlock(&mp->m_ail_lock); |
| 2313 | xfs_iflags_set(iip->ili_inode, XFS_ISTALE); | 2312 | xfs_iflags_set(iip->ili_inode, XFS_ISTALE); |
| 2314 | pre_flushed++; | 2313 | pre_flushed++; |
| 2315 | } | 2314 | } |
| @@ -2330,9 +2329,9 @@ xfs_ifree_cluster( | |||
| 2330 | iip->ili_last_fields = iip->ili_format.ilf_fields; | 2329 | iip->ili_last_fields = iip->ili_format.ilf_fields; |
| 2331 | iip->ili_format.ilf_fields = 0; | 2330 | iip->ili_format.ilf_fields = 0; |
| 2332 | iip->ili_logged = 1; | 2331 | iip->ili_logged = 1; |
| 2333 | AIL_LOCK(mp,s); | 2332 | spin_lock(&mp->m_ail_lock); |
| 2334 | iip->ili_flush_lsn = iip->ili_item.li_lsn; | 2333 | iip->ili_flush_lsn = iip->ili_item.li_lsn; |
| 2335 | AIL_UNLOCK(mp, s); | 2334 | spin_unlock(&mp->m_ail_lock); |
| 2336 | 2335 | ||
| 2337 | xfs_buf_attach_iodone(bp, | 2336 | xfs_buf_attach_iodone(bp, |
| 2338 | (void(*)(xfs_buf_t*,xfs_log_item_t*)) | 2337 | (void(*)(xfs_buf_t*,xfs_log_item_t*)) |
| @@ -2731,7 +2730,6 @@ void | |||
| 2731 | xfs_idestroy( | 2730 | xfs_idestroy( |
| 2732 | xfs_inode_t *ip) | 2731 | xfs_inode_t *ip) |
| 2733 | { | 2732 | { |
| 2734 | |||
| 2735 | switch (ip->i_d.di_mode & S_IFMT) { | 2733 | switch (ip->i_d.di_mode & S_IFMT) { |
| 2736 | case S_IFREG: | 2734 | case S_IFREG: |
| 2737 | case S_IFDIR: | 2735 | case S_IFDIR: |
| @@ -2771,16 +2769,15 @@ xfs_idestroy( | |||
| 2771 | */ | 2769 | */ |
| 2772 | xfs_mount_t *mp = ip->i_mount; | 2770 | xfs_mount_t *mp = ip->i_mount; |
| 2773 | xfs_log_item_t *lip = &ip->i_itemp->ili_item; | 2771 | xfs_log_item_t *lip = &ip->i_itemp->ili_item; |
| 2774 | int s; | ||
| 2775 | 2772 | ||
| 2776 | ASSERT(((lip->li_flags & XFS_LI_IN_AIL) == 0) || | 2773 | ASSERT(((lip->li_flags & XFS_LI_IN_AIL) == 0) || |
| 2777 | XFS_FORCED_SHUTDOWN(ip->i_mount)); | 2774 | XFS_FORCED_SHUTDOWN(ip->i_mount)); |
| 2778 | if (lip->li_flags & XFS_LI_IN_AIL) { | 2775 | if (lip->li_flags & XFS_LI_IN_AIL) { |
| 2779 | AIL_LOCK(mp, s); | 2776 | spin_lock(&mp->m_ail_lock); |
| 2780 | if (lip->li_flags & XFS_LI_IN_AIL) | 2777 | if (lip->li_flags & XFS_LI_IN_AIL) |
| 2781 | xfs_trans_delete_ail(mp, lip, s); | 2778 | xfs_trans_delete_ail(mp, lip); |
| 2782 | else | 2779 | else |
| 2783 | AIL_UNLOCK(mp, s); | 2780 | spin_unlock(&mp->m_ail_lock); |
| 2784 | } | 2781 | } |
| 2785 | xfs_inode_item_destroy(ip); | 2782 | xfs_inode_item_destroy(ip); |
| 2786 | } | 2783 | } |
| @@ -3334,7 +3331,6 @@ xfs_iflush_int( | |||
| 3334 | #ifdef XFS_TRANS_DEBUG | 3331 | #ifdef XFS_TRANS_DEBUG |
| 3335 | int first; | 3332 | int first; |
| 3336 | #endif | 3333 | #endif |
| 3337 | SPLDECL(s); | ||
| 3338 | 3334 | ||
| 3339 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS)); | 3335 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS)); |
| 3340 | ASSERT(issemalocked(&(ip->i_flock))); | 3336 | ASSERT(issemalocked(&(ip->i_flock))); |
| @@ -3529,9 +3525,9 @@ xfs_iflush_int( | |||
| 3529 | iip->ili_logged = 1; | 3525 | iip->ili_logged = 1; |
| 3530 | 3526 | ||
| 3531 | ASSERT(sizeof(xfs_lsn_t) == 8); /* don't lock if it shrinks */ | 3527 | ASSERT(sizeof(xfs_lsn_t) == 8); /* don't lock if it shrinks */ |
| 3532 | AIL_LOCK(mp,s); | 3528 | spin_lock(&mp->m_ail_lock); |
| 3533 | iip->ili_flush_lsn = iip->ili_item.li_lsn; | 3529 | iip->ili_flush_lsn = iip->ili_item.li_lsn; |
| 3534 | AIL_UNLOCK(mp, s); | 3530 | spin_unlock(&mp->m_ail_lock); |
| 3535 | 3531 | ||
| 3536 | /* | 3532 | /* |
| 3537 | * Attach the function xfs_iflush_done to the inode's | 3533 | * Attach the function xfs_iflush_done to the inode's |
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 565d470a6b4a..e365b137ee4f 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c | |||
| @@ -615,7 +615,7 @@ xfs_inode_item_trylock( | |||
| 615 | return XFS_ITEM_PUSHBUF; | 615 | return XFS_ITEM_PUSHBUF; |
| 616 | } else { | 616 | } else { |
| 617 | /* | 617 | /* |
| 618 | * We hold the AIL_LOCK, so we must specify the | 618 | * We hold the AIL lock, so we must specify the |
| 619 | * NONOTIFY flag so that we won't double trip. | 619 | * NONOTIFY flag so that we won't double trip. |
| 620 | */ | 620 | */ |
| 621 | xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); | 621 | xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); |
| @@ -749,7 +749,7 @@ xfs_inode_item_committed( | |||
| 749 | * marked delayed write. If that's the case, we'll initiate a bawrite on that | 749 | * marked delayed write. If that's the case, we'll initiate a bawrite on that |
| 750 | * buffer to expedite the process. | 750 | * buffer to expedite the process. |
| 751 | * | 751 | * |
| 752 | * We aren't holding the AIL_LOCK (or the flush lock) when this gets called, | 752 | * We aren't holding the AIL lock (or the flush lock) when this gets called, |
| 753 | * so it is inherently race-y. | 753 | * so it is inherently race-y. |
| 754 | */ | 754 | */ |
| 755 | STATIC void | 755 | STATIC void |
| @@ -792,7 +792,7 @@ xfs_inode_item_pushbuf( | |||
| 792 | if (XFS_BUF_ISDELAYWRITE(bp)) { | 792 | if (XFS_BUF_ISDELAYWRITE(bp)) { |
| 793 | /* | 793 | /* |
| 794 | * We were racing with iflush because we don't hold | 794 | * We were racing with iflush because we don't hold |
| 795 | * the AIL_LOCK or the flush lock. However, at this point, | 795 | * the AIL lock or the flush lock. However, at this point, |
| 796 | * we have the buffer, and we know that it's dirty. | 796 | * we have the buffer, and we know that it's dirty. |
| 797 | * So, it's possible that iflush raced with us, and | 797 | * So, it's possible that iflush raced with us, and |
| 798 | * this item is already taken off the AIL. | 798 | * this item is already taken off the AIL. |
| @@ -968,7 +968,6 @@ xfs_iflush_done( | |||
| 968 | xfs_inode_log_item_t *iip) | 968 | xfs_inode_log_item_t *iip) |
| 969 | { | 969 | { |
| 970 | xfs_inode_t *ip; | 970 | xfs_inode_t *ip; |
| 971 | SPLDECL(s); | ||
| 972 | 971 | ||
| 973 | ip = iip->ili_inode; | 972 | ip = iip->ili_inode; |
| 974 | 973 | ||
| @@ -983,15 +982,15 @@ xfs_iflush_done( | |||
| 983 | */ | 982 | */ |
| 984 | if (iip->ili_logged && | 983 | if (iip->ili_logged && |
| 985 | (iip->ili_item.li_lsn == iip->ili_flush_lsn)) { | 984 | (iip->ili_item.li_lsn == iip->ili_flush_lsn)) { |
| 986 | AIL_LOCK(ip->i_mount, s); | 985 | spin_lock(&ip->i_mount->m_ail_lock); |
| 987 | if (iip->ili_item.li_lsn == iip->ili_flush_lsn) { | 986 | if (iip->ili_item.li_lsn == iip->ili_flush_lsn) { |
| 988 | /* | 987 | /* |
| 989 | * xfs_trans_delete_ail() drops the AIL lock. | 988 | * xfs_trans_delete_ail() drops the AIL lock. |
| 990 | */ | 989 | */ |
| 991 | xfs_trans_delete_ail(ip->i_mount, | 990 | xfs_trans_delete_ail(ip->i_mount, |
| 992 | (xfs_log_item_t*)iip, s); | 991 | (xfs_log_item_t*)iip); |
| 993 | } else { | 992 | } else { |
| 994 | AIL_UNLOCK(ip->i_mount, s); | 993 | spin_unlock(&ip->i_mount->m_ail_lock); |
| 995 | } | 994 | } |
| 996 | } | 995 | } |
| 997 | 996 | ||
| @@ -1025,21 +1024,19 @@ xfs_iflush_abort( | |||
| 1025 | { | 1024 | { |
| 1026 | xfs_inode_log_item_t *iip; | 1025 | xfs_inode_log_item_t *iip; |
| 1027 | xfs_mount_t *mp; | 1026 | xfs_mount_t *mp; |
| 1028 | SPLDECL(s); | ||
| 1029 | 1027 | ||
| 1030 | iip = ip->i_itemp; | 1028 | iip = ip->i_itemp; |
| 1031 | mp = ip->i_mount; | 1029 | mp = ip->i_mount; |
| 1032 | if (iip) { | 1030 | if (iip) { |
| 1033 | if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { | 1031 | if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { |
| 1034 | AIL_LOCK(mp, s); | 1032 | spin_lock(&mp->m_ail_lock); |
| 1035 | if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { | 1033 | if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { |
| 1036 | /* | 1034 | /* |
| 1037 | * xfs_trans_delete_ail() drops the AIL lock. | 1035 | * xfs_trans_delete_ail() drops the AIL lock. |
| 1038 | */ | 1036 | */ |
| 1039 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)iip, | 1037 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)iip); |
| 1040 | s); | ||
| 1041 | } else | 1038 | } else |
| 1042 | AIL_UNLOCK(mp, s); | 1039 | spin_unlock(&mp->m_ail_lock); |
| 1043 | } | 1040 | } |
| 1044 | iip->ili_logged = 0; | 1041 | iip->ili_logged = 0; |
| 1045 | /* | 1042 | /* |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 851eca8a7150..4c39dc0e6841 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
| @@ -2660,7 +2660,6 @@ xlog_recover_do_efi_trans( | |||
| 2660 | xfs_mount_t *mp; | 2660 | xfs_mount_t *mp; |
| 2661 | xfs_efi_log_item_t *efip; | 2661 | xfs_efi_log_item_t *efip; |
| 2662 | xfs_efi_log_format_t *efi_formatp; | 2662 | xfs_efi_log_format_t *efi_formatp; |
| 2663 | SPLDECL(s); | ||
| 2664 | 2663 | ||
| 2665 | if (pass == XLOG_RECOVER_PASS1) { | 2664 | if (pass == XLOG_RECOVER_PASS1) { |
| 2666 | return 0; | 2665 | return 0; |
| @@ -2678,11 +2677,11 @@ xlog_recover_do_efi_trans( | |||
| 2678 | efip->efi_next_extent = efi_formatp->efi_nextents; | 2677 | efip->efi_next_extent = efi_formatp->efi_nextents; |
| 2679 | efip->efi_flags |= XFS_EFI_COMMITTED; | 2678 | efip->efi_flags |= XFS_EFI_COMMITTED; |
| 2680 | 2679 | ||
| 2681 | AIL_LOCK(mp,s); | 2680 | spin_lock(&mp->m_ail_lock); |
| 2682 | /* | 2681 | /* |
| 2683 | * xfs_trans_update_ail() drops the AIL lock. | 2682 | * xfs_trans_update_ail() drops the AIL lock. |
| 2684 | */ | 2683 | */ |
| 2685 | xfs_trans_update_ail(mp, (xfs_log_item_t *)efip, lsn, s); | 2684 | xfs_trans_update_ail(mp, (xfs_log_item_t *)efip, lsn); |
| 2686 | return 0; | 2685 | return 0; |
| 2687 | } | 2686 | } |
| 2688 | 2687 | ||
| @@ -2707,7 +2706,6 @@ xlog_recover_do_efd_trans( | |||
| 2707 | xfs_log_item_t *lip; | 2706 | xfs_log_item_t *lip; |
| 2708 | int gen; | 2707 | int gen; |
| 2709 | __uint64_t efi_id; | 2708 | __uint64_t efi_id; |
| 2710 | SPLDECL(s); | ||
| 2711 | 2709 | ||
| 2712 | if (pass == XLOG_RECOVER_PASS1) { | 2710 | if (pass == XLOG_RECOVER_PASS1) { |
| 2713 | return; | 2711 | return; |
| @@ -2725,7 +2723,7 @@ xlog_recover_do_efd_trans( | |||
| 2725 | * in the AIL. | 2723 | * in the AIL. |
| 2726 | */ | 2724 | */ |
| 2727 | mp = log->l_mp; | 2725 | mp = log->l_mp; |
| 2728 | AIL_LOCK(mp,s); | 2726 | spin_lock(&mp->m_ail_lock); |
| 2729 | lip = xfs_trans_first_ail(mp, &gen); | 2727 | lip = xfs_trans_first_ail(mp, &gen); |
| 2730 | while (lip != NULL) { | 2728 | while (lip != NULL) { |
| 2731 | if (lip->li_type == XFS_LI_EFI) { | 2729 | if (lip->li_type == XFS_LI_EFI) { |
| @@ -2735,7 +2733,7 @@ xlog_recover_do_efd_trans( | |||
| 2735 | * xfs_trans_delete_ail() drops the | 2733 | * xfs_trans_delete_ail() drops the |
| 2736 | * AIL lock. | 2734 | * AIL lock. |
| 2737 | */ | 2735 | */ |
| 2738 | xfs_trans_delete_ail(mp, lip, s); | 2736 | xfs_trans_delete_ail(mp, lip); |
| 2739 | break; | 2737 | break; |
| 2740 | } | 2738 | } |
| 2741 | } | 2739 | } |
| @@ -2749,7 +2747,7 @@ xlog_recover_do_efd_trans( | |||
| 2749 | if (lip != NULL) { | 2747 | if (lip != NULL) { |
| 2750 | xfs_efi_item_free(efip); | 2748 | xfs_efi_item_free(efip); |
| 2751 | } else { | 2749 | } else { |
| 2752 | AIL_UNLOCK(mp, s); | 2750 | spin_unlock(&mp->m_ail_lock); |
| 2753 | } | 2751 | } |
| 2754 | } | 2752 | } |
| 2755 | 2753 | ||
| @@ -3075,10 +3073,9 @@ xlog_recover_process_efis( | |||
| 3075 | xfs_efi_log_item_t *efip; | 3073 | xfs_efi_log_item_t *efip; |
| 3076 | int gen; | 3074 | int gen; |
| 3077 | xfs_mount_t *mp; | 3075 | xfs_mount_t *mp; |
| 3078 | SPLDECL(s); | ||
| 3079 | 3076 | ||
| 3080 | mp = log->l_mp; | 3077 | mp = log->l_mp; |
| 3081 | AIL_LOCK(mp,s); | 3078 | spin_lock(&mp->m_ail_lock); |
| 3082 | 3079 | ||
| 3083 | lip = xfs_trans_first_ail(mp, &gen); | 3080 | lip = xfs_trans_first_ail(mp, &gen); |
| 3084 | while (lip != NULL) { | 3081 | while (lip != NULL) { |
| @@ -3099,12 +3096,12 @@ xlog_recover_process_efis( | |||
| 3099 | continue; | 3096 | continue; |
| 3100 | } | 3097 | } |
| 3101 | 3098 | ||
| 3102 | AIL_UNLOCK(mp, s); | 3099 | spin_unlock(&mp->m_ail_lock); |
| 3103 | xlog_recover_process_efi(mp, efip); | 3100 | xlog_recover_process_efi(mp, efip); |
| 3104 | AIL_LOCK(mp,s); | 3101 | spin_lock(&mp->m_ail_lock); |
| 3105 | lip = xfs_trans_next_ail(mp, lip, &gen, NULL); | 3102 | lip = xfs_trans_next_ail(mp, lip, &gen, NULL); |
| 3106 | } | 3103 | } |
| 3107 | AIL_UNLOCK(mp, s); | 3104 | spin_unlock(&mp->m_ail_lock); |
| 3108 | } | 3105 | } |
| 3109 | 3106 | ||
| 3110 | /* | 3107 | /* |
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index f395f594e20c..9a80b5581844 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
| @@ -136,7 +136,7 @@ xfs_mount_init(void) | |||
| 136 | mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB; | 136 | mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB; |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | AIL_LOCKINIT(&mp->m_ail_lock, "xfs_ail"); | 139 | spinlock_init(&mp->m_ail_lock, "xfs_ail"); |
| 140 | spinlock_init(&mp->m_sb_lock, "xfs_sb"); | 140 | spinlock_init(&mp->m_sb_lock, "xfs_sb"); |
| 141 | mutex_init(&mp->m_ilock); | 141 | mutex_init(&mp->m_ilock); |
| 142 | mutex_init(&mp->m_growlock); | 142 | mutex_init(&mp->m_growlock); |
| @@ -171,7 +171,7 @@ xfs_mount_free( | |||
| 171 | sizeof(xfs_perag_t) * mp->m_sb.sb_agcount); | 171 | sizeof(xfs_perag_t) * mp->m_sb.sb_agcount); |
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | AIL_LOCK_DESTROY(&mp->m_ail_lock); | 174 | spinlock_destroy(&mp->m_ail_lock); |
| 175 | spinlock_destroy(&mp->m_sb_lock); | 175 | spinlock_destroy(&mp->m_sb_lock); |
| 176 | mutex_destroy(&mp->m_ilock); | 176 | mutex_destroy(&mp->m_ilock); |
| 177 | mutex_destroy(&mp->m_growlock); | 177 | mutex_destroy(&mp->m_growlock); |
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index f7b761f09ab4..723f01f59cb8 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h | |||
| @@ -63,13 +63,6 @@ struct xfs_extdelta; | |||
| 63 | struct xfs_swapext; | 63 | struct xfs_swapext; |
| 64 | struct xfs_mru_cache; | 64 | struct xfs_mru_cache; |
| 65 | 65 | ||
| 66 | #define AIL_LOCK_T lock_t | ||
| 67 | #define AIL_LOCKINIT(x,y) spinlock_init(x,y) | ||
| 68 | #define AIL_LOCK_DESTROY(x) spinlock_destroy(x) | ||
| 69 | #define AIL_LOCK(mp,s) s=mutex_spinlock(&(mp)->m_ail_lock) | ||
| 70 | #define AIL_UNLOCK(mp,s) mutex_spinunlock(&(mp)->m_ail_lock, s) | ||
| 71 | |||
| 72 | |||
| 73 | /* | 66 | /* |
| 74 | * Prototypes and functions for the Data Migration subsystem. | 67 | * Prototypes and functions for the Data Migration subsystem. |
| 75 | */ | 68 | */ |
| @@ -230,7 +223,7 @@ extern void xfs_icsb_sync_counters_flags(struct xfs_mount *, int); | |||
| 230 | typedef struct xfs_mount { | 223 | typedef struct xfs_mount { |
| 231 | struct super_block *m_super; | 224 | struct super_block *m_super; |
| 232 | xfs_tid_t m_tid; /* next unused tid for fs */ | 225 | xfs_tid_t m_tid; /* next unused tid for fs */ |
| 233 | AIL_LOCK_T m_ail_lock; /* fs AIL mutex */ | 226 | spinlock_t m_ail_lock; /* fs AIL mutex */ |
| 234 | xfs_ail_entry_t m_ail; /* fs active log item list */ | 227 | xfs_ail_entry_t m_ail; /* fs active log item list */ |
| 235 | uint m_ail_gen; /* fs AIL generation count */ | 228 | uint m_ail_gen; /* fs AIL generation count */ |
| 236 | xfs_sb_t m_sb; /* copy of fs superblock */ | 229 | xfs_sb_t m_sb; /* copy of fs superblock */ |
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 8878322ee793..71e4c8dcc69b 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c | |||
| @@ -1322,7 +1322,6 @@ xfs_trans_chunk_committed( | |||
| 1322 | xfs_lsn_t item_lsn; | 1322 | xfs_lsn_t item_lsn; |
| 1323 | struct xfs_mount *mp; | 1323 | struct xfs_mount *mp; |
| 1324 | int i; | 1324 | int i; |
| 1325 | SPLDECL(s); | ||
| 1326 | 1325 | ||
| 1327 | lidp = licp->lic_descs; | 1326 | lidp = licp->lic_descs; |
| 1328 | for (i = 0; i < licp->lic_unused; i++, lidp++) { | 1327 | for (i = 0; i < licp->lic_unused; i++, lidp++) { |
| @@ -1363,7 +1362,7 @@ xfs_trans_chunk_committed( | |||
| 1363 | * the test below. | 1362 | * the test below. |
| 1364 | */ | 1363 | */ |
| 1365 | mp = lip->li_mountp; | 1364 | mp = lip->li_mountp; |
| 1366 | AIL_LOCK(mp,s); | 1365 | spin_lock(&mp->m_ail_lock); |
| 1367 | if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0) { | 1366 | if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0) { |
| 1368 | /* | 1367 | /* |
| 1369 | * This will set the item's lsn to item_lsn | 1368 | * This will set the item's lsn to item_lsn |
| @@ -1372,9 +1371,9 @@ xfs_trans_chunk_committed( | |||
| 1372 | * | 1371 | * |
| 1373 | * xfs_trans_update_ail() drops the AIL lock. | 1372 | * xfs_trans_update_ail() drops the AIL lock. |
| 1374 | */ | 1373 | */ |
| 1375 | xfs_trans_update_ail(mp, lip, item_lsn, s); | 1374 | xfs_trans_update_ail(mp, lip, item_lsn); |
| 1376 | } else { | 1375 | } else { |
| 1377 | AIL_UNLOCK(mp, s); | 1376 | spin_unlock(&mp->m_ail_lock); |
| 1378 | } | 1377 | } |
| 1379 | 1378 | ||
| 1380 | /* | 1379 | /* |
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 5b2ff59f19cf..2d3c297259c2 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c | |||
| @@ -55,16 +55,15 @@ xfs_trans_tail_ail( | |||
| 55 | { | 55 | { |
| 56 | xfs_lsn_t lsn; | 56 | xfs_lsn_t lsn; |
| 57 | xfs_log_item_t *lip; | 57 | xfs_log_item_t *lip; |
| 58 | SPLDECL(s); | ||
| 59 | 58 | ||
| 60 | AIL_LOCK(mp,s); | 59 | spin_lock(&mp->m_ail_lock); |
| 61 | lip = xfs_ail_min(&(mp->m_ail)); | 60 | lip = xfs_ail_min(&(mp->m_ail)); |
| 62 | if (lip == NULL) { | 61 | if (lip == NULL) { |
| 63 | lsn = (xfs_lsn_t)0; | 62 | lsn = (xfs_lsn_t)0; |
| 64 | } else { | 63 | } else { |
| 65 | lsn = lip->li_lsn; | 64 | lsn = lip->li_lsn; |
| 66 | } | 65 | } |
| 67 | AIL_UNLOCK(mp, s); | 66 | spin_unlock(&mp->m_ail_lock); |
| 68 | 67 | ||
| 69 | return lsn; | 68 | return lsn; |
| 70 | } | 69 | } |
| @@ -89,17 +88,16 @@ xfs_trans_push_ail( | |||
| 89 | int restarts; | 88 | int restarts; |
| 90 | int lock_result; | 89 | int lock_result; |
| 91 | int flush_log; | 90 | int flush_log; |
| 92 | SPLDECL(s); | ||
| 93 | 91 | ||
| 94 | #define XFS_TRANS_PUSH_AIL_RESTARTS 1000 | 92 | #define XFS_TRANS_PUSH_AIL_RESTARTS 1000 |
| 95 | 93 | ||
| 96 | AIL_LOCK(mp,s); | 94 | spin_lock(&mp->m_ail_lock); |
| 97 | lip = xfs_trans_first_ail(mp, &gen); | 95 | lip = xfs_trans_first_ail(mp, &gen); |
| 98 | if (lip == NULL || XFS_FORCED_SHUTDOWN(mp)) { | 96 | if (lip == NULL || XFS_FORCED_SHUTDOWN(mp)) { |
| 99 | /* | 97 | /* |
| 100 | * Just return if the AIL is empty. | 98 | * Just return if the AIL is empty. |
| 101 | */ | 99 | */ |
| 102 | AIL_UNLOCK(mp, s); | 100 | spin_unlock(&mp->m_ail_lock); |
| 103 | return (xfs_lsn_t)0; | 101 | return (xfs_lsn_t)0; |
| 104 | } | 102 | } |
| 105 | 103 | ||
| @@ -112,7 +110,7 @@ xfs_trans_push_ail( | |||
| 112 | * beginning of the list. We'd like not to stop until we've at least | 110 | * beginning of the list. We'd like not to stop until we've at least |
| 113 | * tried to push on everything in the AIL with an LSN less than | 111 | * tried to push on everything in the AIL with an LSN less than |
| 114 | * the given threshold. However, we may give up before that if | 112 | * the given threshold. However, we may give up before that if |
| 115 | * we realize that we've been holding the AIL_LOCK for 'too long', | 113 | * we realize that we've been holding the AIL lock for 'too long', |
| 116 | * blocking interrupts. Currently, too long is < 500us roughly. | 114 | * blocking interrupts. Currently, too long is < 500us roughly. |
| 117 | */ | 115 | */ |
| 118 | flush_log = 0; | 116 | flush_log = 0; |
| @@ -136,14 +134,14 @@ xfs_trans_push_ail( | |||
| 136 | lock_result = IOP_TRYLOCK(lip); | 134 | lock_result = IOP_TRYLOCK(lip); |
| 137 | switch (lock_result) { | 135 | switch (lock_result) { |
| 138 | case XFS_ITEM_SUCCESS: | 136 | case XFS_ITEM_SUCCESS: |
| 139 | AIL_UNLOCK(mp, s); | 137 | spin_unlock(&mp->m_ail_lock); |
| 140 | XFS_STATS_INC(xs_push_ail_success); | 138 | XFS_STATS_INC(xs_push_ail_success); |
| 141 | IOP_PUSH(lip); | 139 | IOP_PUSH(lip); |
| 142 | AIL_LOCK(mp,s); | 140 | spin_lock(&mp->m_ail_lock); |
| 143 | break; | 141 | break; |
| 144 | 142 | ||
| 145 | case XFS_ITEM_PUSHBUF: | 143 | case XFS_ITEM_PUSHBUF: |
| 146 | AIL_UNLOCK(mp, s); | 144 | spin_unlock(&mp->m_ail_lock); |
| 147 | XFS_STATS_INC(xs_push_ail_pushbuf); | 145 | XFS_STATS_INC(xs_push_ail_pushbuf); |
| 148 | #ifdef XFSRACEDEBUG | 146 | #ifdef XFSRACEDEBUG |
| 149 | delay_for_intr(); | 147 | delay_for_intr(); |
| @@ -152,7 +150,7 @@ xfs_trans_push_ail( | |||
| 152 | ASSERT(lip->li_ops->iop_pushbuf); | 150 | ASSERT(lip->li_ops->iop_pushbuf); |
| 153 | ASSERT(lip); | 151 | ASSERT(lip); |
| 154 | IOP_PUSHBUF(lip); | 152 | IOP_PUSHBUF(lip); |
| 155 | AIL_LOCK(mp,s); | 153 | spin_lock(&mp->m_ail_lock); |
| 156 | break; | 154 | break; |
| 157 | 155 | ||
| 158 | case XFS_ITEM_PINNED: | 156 | case XFS_ITEM_PINNED: |
| @@ -181,7 +179,7 @@ xfs_trans_push_ail( | |||
| 181 | /* | 179 | /* |
| 182 | * Just return if we shut down during the last try. | 180 | * Just return if we shut down during the last try. |
| 183 | */ | 181 | */ |
| 184 | AIL_UNLOCK(mp, s); | 182 | spin_unlock(&mp->m_ail_lock); |
| 185 | return (xfs_lsn_t)0; | 183 | return (xfs_lsn_t)0; |
| 186 | } | 184 | } |
| 187 | 185 | ||
| @@ -193,10 +191,10 @@ xfs_trans_push_ail( | |||
| 193 | * push out the log so it will become unpinned and | 191 | * push out the log so it will become unpinned and |
| 194 | * move forward in the AIL. | 192 | * move forward in the AIL. |
| 195 | */ | 193 | */ |
| 196 | AIL_UNLOCK(mp, s); | 194 | spin_unlock(&mp->m_ail_lock); |
| 197 | XFS_STATS_INC(xs_push_ail_flush); | 195 | XFS_STATS_INC(xs_push_ail_flush); |
| 198 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); | 196 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); |
| 199 | AIL_LOCK(mp, s); | 197 | spin_lock(&mp->m_ail_lock); |
| 200 | } | 198 | } |
| 201 | 199 | ||
| 202 | lip = xfs_ail_min(&(mp->m_ail)); | 200 | lip = xfs_ail_min(&(mp->m_ail)); |
| @@ -206,7 +204,7 @@ xfs_trans_push_ail( | |||
| 206 | lsn = lip->li_lsn; | 204 | lsn = lip->li_lsn; |
| 207 | } | 205 | } |
| 208 | 206 | ||
| 209 | AIL_UNLOCK(mp, s); | 207 | spin_unlock(&mp->m_ail_lock); |
| 210 | return lsn; | 208 | return lsn; |
| 211 | } /* xfs_trans_push_ail */ | 209 | } /* xfs_trans_push_ail */ |
| 212 | 210 | ||
| @@ -269,15 +267,13 @@ xfs_trans_unlocked_item( | |||
| 269 | * has changed. | 267 | * has changed. |
| 270 | * | 268 | * |
| 271 | * This function must be called with the AIL lock held. The lock | 269 | * This function must be called with the AIL lock held. The lock |
| 272 | * is dropped before returning, so the caller must pass in the | 270 | * is dropped before returning. |
| 273 | * cookie returned by AIL_LOCK. | ||
| 274 | */ | 271 | */ |
| 275 | void | 272 | void |
| 276 | xfs_trans_update_ail( | 273 | xfs_trans_update_ail( |
| 277 | xfs_mount_t *mp, | 274 | xfs_mount_t *mp, |
| 278 | xfs_log_item_t *lip, | 275 | xfs_log_item_t *lip, |
| 279 | xfs_lsn_t lsn, | 276 | xfs_lsn_t lsn) __releases(mp->m_ail_lock) |
| 280 | unsigned long s) __releases(mp->m_ail_lock) | ||
| 281 | { | 277 | { |
| 282 | xfs_ail_entry_t *ailp; | 278 | xfs_ail_entry_t *ailp; |
| 283 | xfs_log_item_t *dlip=NULL; | 279 | xfs_log_item_t *dlip=NULL; |
| @@ -300,10 +296,10 @@ xfs_trans_update_ail( | |||
| 300 | 296 | ||
| 301 | if (mlip == dlip) { | 297 | if (mlip == dlip) { |
| 302 | mlip = xfs_ail_min(&(mp->m_ail)); | 298 | mlip = xfs_ail_min(&(mp->m_ail)); |
| 303 | AIL_UNLOCK(mp, s); | 299 | spin_unlock(&mp->m_ail_lock); |
| 304 | xfs_log_move_tail(mp, mlip->li_lsn); | 300 | xfs_log_move_tail(mp, mlip->li_lsn); |
| 305 | } else { | 301 | } else { |
| 306 | AIL_UNLOCK(mp, s); | 302 | spin_unlock(&mp->m_ail_lock); |
| 307 | } | 303 | } |
| 308 | 304 | ||
| 309 | 305 | ||
| @@ -322,14 +318,12 @@ xfs_trans_update_ail( | |||
| 322 | * has changed. | 318 | * has changed. |
| 323 | * | 319 | * |
| 324 | * This function must be called with the AIL lock held. The lock | 320 | * This function must be called with the AIL lock held. The lock |
| 325 | * is dropped before returning, so the caller must pass in the | 321 | * is dropped before returning. |
| 326 | * cookie returned by AIL_LOCK. | ||
| 327 | */ | 322 | */ |
| 328 | void | 323 | void |
| 329 | xfs_trans_delete_ail( | 324 | xfs_trans_delete_ail( |
| 330 | xfs_mount_t *mp, | 325 | xfs_mount_t *mp, |
| 331 | xfs_log_item_t *lip, | 326 | xfs_log_item_t *lip) __releases(mp->m_ail_lock) |
| 332 | unsigned long s) __releases(mp->m_ail_lock) | ||
| 333 | { | 327 | { |
| 334 | xfs_ail_entry_t *ailp; | 328 | xfs_ail_entry_t *ailp; |
| 335 | xfs_log_item_t *dlip; | 329 | xfs_log_item_t *dlip; |
| @@ -348,10 +342,10 @@ xfs_trans_delete_ail( | |||
| 348 | 342 | ||
| 349 | if (mlip == dlip) { | 343 | if (mlip == dlip) { |
| 350 | mlip = xfs_ail_min(&(mp->m_ail)); | 344 | mlip = xfs_ail_min(&(mp->m_ail)); |
| 351 | AIL_UNLOCK(mp, s); | 345 | spin_unlock(&mp->m_ail_lock); |
| 352 | xfs_log_move_tail(mp, (mlip ? mlip->li_lsn : 0)); | 346 | xfs_log_move_tail(mp, (mlip ? mlip->li_lsn : 0)); |
| 353 | } else { | 347 | } else { |
| 354 | AIL_UNLOCK(mp, s); | 348 | spin_unlock(&mp->m_ail_lock); |
| 355 | } | 349 | } |
| 356 | } | 350 | } |
| 357 | else { | 351 | else { |
| @@ -360,12 +354,12 @@ xfs_trans_delete_ail( | |||
| 360 | * serious trouble if we get to this stage. | 354 | * serious trouble if we get to this stage. |
| 361 | */ | 355 | */ |
| 362 | if (XFS_FORCED_SHUTDOWN(mp)) | 356 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 363 | AIL_UNLOCK(mp, s); | 357 | spin_unlock(&mp->m_ail_lock); |
| 364 | else { | 358 | else { |
| 365 | xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp, | 359 | xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp, |
| 366 | "%s: attempting to delete a log item that is not in the AIL", | 360 | "%s: attempting to delete a log item that is not in the AIL", |
| 367 | __FUNCTION__); | 361 | __FUNCTION__); |
| 368 | AIL_UNLOCK(mp, s); | 362 | spin_unlock(&mp->m_ail_lock); |
| 369 | xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); | 363 | xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); |
| 370 | } | 364 | } |
| 371 | } | 365 | } |
diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 447ac4308c91..c40f0512097a 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h | |||
| @@ -47,11 +47,10 @@ xfs_log_busy_slot_t *xfs_trans_add_busy(xfs_trans_t *tp, | |||
| 47 | * From xfs_trans_ail.c | 47 | * From xfs_trans_ail.c |
| 48 | */ | 48 | */ |
| 49 | void xfs_trans_update_ail(struct xfs_mount *mp, | 49 | void xfs_trans_update_ail(struct xfs_mount *mp, |
| 50 | struct xfs_log_item *lip, xfs_lsn_t lsn, | 50 | struct xfs_log_item *lip, xfs_lsn_t lsn) |
| 51 | unsigned long s) | ||
| 52 | __releases(mp->m_ail_lock); | 51 | __releases(mp->m_ail_lock); |
| 53 | void xfs_trans_delete_ail(struct xfs_mount *mp, | 52 | void xfs_trans_delete_ail(struct xfs_mount *mp, |
| 54 | struct xfs_log_item *lip, unsigned long s) | 53 | struct xfs_log_item *lip) |
| 55 | __releases(mp->m_ail_lock); | 54 | __releases(mp->m_ail_lock); |
| 56 | struct xfs_log_item *xfs_trans_first_ail(struct xfs_mount *, int *); | 55 | struct xfs_log_item *xfs_trans_first_ail(struct xfs_mount *, int *); |
| 57 | struct xfs_log_item *xfs_trans_next_ail(struct xfs_mount *, | 56 | struct xfs_log_item *xfs_trans_next_ail(struct xfs_mount *, |
