diff options
Diffstat (limited to 'fs/xfs/xfs_buf_item.c')
-rw-r--r-- | fs/xfs/xfs_buf_item.c | 45 |
1 files changed, 14 insertions, 31 deletions
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 002fc2617c8e..92af4098c7e8 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c | |||
@@ -375,7 +375,7 @@ xfs_buf_item_unpin( | |||
375 | xfs_buf_log_item_t *bip, | 375 | xfs_buf_log_item_t *bip, |
376 | int stale) | 376 | int stale) |
377 | { | 377 | { |
378 | xfs_mount_t *mp; | 378 | struct xfs_ail *ailp; |
379 | xfs_buf_t *bp; | 379 | xfs_buf_t *bp; |
380 | int freed; | 380 | int freed; |
381 | 381 | ||
@@ -387,7 +387,7 @@ xfs_buf_item_unpin( | |||
387 | xfs_buftrace("XFS_UNPIN", bp); | 387 | xfs_buftrace("XFS_UNPIN", bp); |
388 | 388 | ||
389 | freed = atomic_dec_and_test(&bip->bli_refcount); | 389 | freed = atomic_dec_and_test(&bip->bli_refcount); |
390 | mp = bip->bli_item.li_mountp; | 390 | ailp = bip->bli_item.li_ailp; |
391 | xfs_bunpin(bp); | 391 | xfs_bunpin(bp); |
392 | if (freed && stale) { | 392 | if (freed && stale) { |
393 | ASSERT(bip->bli_flags & XFS_BLI_STALE); | 393 | ASSERT(bip->bli_flags & XFS_BLI_STALE); |
@@ -399,17 +399,17 @@ xfs_buf_item_unpin( | |||
399 | xfs_buftrace("XFS_UNPIN STALE", bp); | 399 | xfs_buftrace("XFS_UNPIN STALE", bp); |
400 | /* | 400 | /* |
401 | * If we get called here because of an IO error, we may | 401 | * If we get called here because of an IO error, we may |
402 | * or may not have the item on the AIL. xfs_trans_delete_ail() | 402 | * or may not have the item on the AIL. xfs_trans_ail_delete() |
403 | * will take care of that situation. | 403 | * will take care of that situation. |
404 | * xfs_trans_delete_ail() drops the AIL lock. | 404 | * xfs_trans_ail_delete() drops the AIL lock. |
405 | */ | 405 | */ |
406 | if (bip->bli_flags & XFS_BLI_STALE_INODE) { | 406 | if (bip->bli_flags & XFS_BLI_STALE_INODE) { |
407 | xfs_buf_do_callbacks(bp, (xfs_log_item_t *)bip); | 407 | xfs_buf_do_callbacks(bp, (xfs_log_item_t *)bip); |
408 | XFS_BUF_SET_FSPRIVATE(bp, NULL); | 408 | XFS_BUF_SET_FSPRIVATE(bp, NULL); |
409 | XFS_BUF_CLR_IODONE_FUNC(bp); | 409 | XFS_BUF_CLR_IODONE_FUNC(bp); |
410 | } else { | 410 | } else { |
411 | spin_lock(&mp->m_ail_lock); | 411 | spin_lock(&ailp->xa_lock); |
412 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)bip); | 412 | xfs_trans_ail_delete(ailp, (xfs_log_item_t *)bip); |
413 | xfs_buf_item_relse(bp); | 413 | xfs_buf_item_relse(bp); |
414 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) == NULL); | 414 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) == NULL); |
415 | } | 415 | } |
@@ -707,8 +707,8 @@ xfs_buf_item_init( | |||
707 | * the first. If we do already have one, there is | 707 | * the first. If we do already have one, there is |
708 | * nothing to do here so return. | 708 | * nothing to do here so return. |
709 | */ | 709 | */ |
710 | if (XFS_BUF_FSPRIVATE3(bp, xfs_mount_t *) != mp) | 710 | if (bp->b_mount != mp) |
711 | XFS_BUF_SET_FSPRIVATE3(bp, mp); | 711 | bp->b_mount = mp; |
712 | XFS_BUF_SET_BDSTRAT_FUNC(bp, xfs_bdstrat_cb); | 712 | XFS_BUF_SET_BDSTRAT_FUNC(bp, xfs_bdstrat_cb); |
713 | if (XFS_BUF_FSPRIVATE(bp, void *) != NULL) { | 713 | if (XFS_BUF_FSPRIVATE(bp, void *) != NULL) { |
714 | lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); | 714 | lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); |
@@ -731,6 +731,7 @@ xfs_buf_item_init( | |||
731 | bip->bli_item.li_type = XFS_LI_BUF; | 731 | bip->bli_item.li_type = XFS_LI_BUF; |
732 | bip->bli_item.li_ops = &xfs_buf_item_ops; | 732 | bip->bli_item.li_ops = &xfs_buf_item_ops; |
733 | bip->bli_item.li_mountp = mp; | 733 | bip->bli_item.li_mountp = mp; |
734 | bip->bli_item.li_ailp = mp->m_ail; | ||
734 | bip->bli_buf = bp; | 735 | bip->bli_buf = bp; |
735 | xfs_buf_hold(bp); | 736 | xfs_buf_hold(bp); |
736 | bip->bli_format.blf_type = XFS_LI_BUF; | 737 | bip->bli_format.blf_type = XFS_LI_BUF; |
@@ -997,21 +998,7 @@ xfs_buf_iodone_callbacks( | |||
997 | xfs_buf_do_callbacks(bp, lip); | 998 | xfs_buf_do_callbacks(bp, lip); |
998 | XFS_BUF_SET_FSPRIVATE(bp, NULL); | 999 | XFS_BUF_SET_FSPRIVATE(bp, NULL); |
999 | XFS_BUF_CLR_IODONE_FUNC(bp); | 1000 | XFS_BUF_CLR_IODONE_FUNC(bp); |
1000 | 1001 | xfs_biodone(bp); | |
1001 | /* | ||
1002 | * XFS_SHUT flag gets set when we go thru the | ||
1003 | * entire buffer cache and deliberately start | ||
1004 | * throwing away delayed write buffers. | ||
1005 | * Since there's no biowait done on those, | ||
1006 | * we should just brelse them. | ||
1007 | */ | ||
1008 | if (XFS_BUF_ISSHUT(bp)) { | ||
1009 | XFS_BUF_UNSHUT(bp); | ||
1010 | xfs_buf_relse(bp); | ||
1011 | } else { | ||
1012 | xfs_biodone(bp); | ||
1013 | } | ||
1014 | |||
1015 | return; | 1002 | return; |
1016 | } | 1003 | } |
1017 | 1004 | ||
@@ -1122,27 +1109,23 @@ xfs_buf_iodone( | |||
1122 | xfs_buf_t *bp, | 1109 | xfs_buf_t *bp, |
1123 | xfs_buf_log_item_t *bip) | 1110 | xfs_buf_log_item_t *bip) |
1124 | { | 1111 | { |
1125 | struct xfs_mount *mp; | 1112 | struct xfs_ail *ailp = bip->bli_item.li_ailp; |
1126 | 1113 | ||
1127 | ASSERT(bip->bli_buf == bp); | 1114 | ASSERT(bip->bli_buf == bp); |
1128 | 1115 | ||
1129 | xfs_buf_rele(bp); | 1116 | xfs_buf_rele(bp); |
1130 | mp = bip->bli_item.li_mountp; | ||
1131 | 1117 | ||
1132 | /* | 1118 | /* |
1133 | * If we are forcibly shutting down, this may well be | 1119 | * If we are forcibly shutting down, this may well be |
1134 | * off the AIL already. That's because we simulate the | 1120 | * off the AIL already. That's because we simulate the |
1135 | * log-committed callbacks to unpin these buffers. Or we may never | 1121 | * log-committed callbacks to unpin these buffers. Or we may never |
1136 | * have put this item on AIL because of the transaction was | 1122 | * have put this item on AIL because of the transaction was |
1137 | * aborted forcibly. xfs_trans_delete_ail() takes care of these. | 1123 | * aborted forcibly. xfs_trans_ail_delete() takes care of these. |
1138 | * | 1124 | * |
1139 | * Either way, AIL is useless if we're forcing a shutdown. | 1125 | * Either way, AIL is useless if we're forcing a shutdown. |
1140 | */ | 1126 | */ |
1141 | spin_lock(&mp->m_ail_lock); | 1127 | spin_lock(&ailp->xa_lock); |
1142 | /* | 1128 | xfs_trans_ail_delete(ailp, (xfs_log_item_t *)bip); |
1143 | * xfs_trans_delete_ail() drops the AIL lock. | ||
1144 | */ | ||
1145 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)bip); | ||
1146 | xfs_buf_item_free(bip); | 1129 | xfs_buf_item_free(bip); |
1147 | } | 1130 | } |
1148 | 1131 | ||