aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_trans_buf.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_trans_buf.c')
-rw-r--r--fs/xfs/xfs_trans_buf.c23
1 files changed, 2 insertions, 21 deletions
diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c
index 7498f87ceed3..286a287ac57a 100644
--- a/fs/xfs/xfs_trans_buf.c
+++ b/fs/xfs/xfs_trans_buf.c
@@ -339,8 +339,6 @@ xfs_trans_brelse(
339 struct xfs_buf *bp) 339 struct xfs_buf *bp)
340{ 340{
341 struct xfs_buf_log_item *bip = bp->b_log_item; 341 struct xfs_buf_log_item *bip = bp->b_log_item;
342 bool freed;
343 bool dirty;
344 342
345 ASSERT(bp->b_transp == tp); 343 ASSERT(bp->b_transp == tp);
346 344
@@ -379,25 +377,8 @@ xfs_trans_brelse(
379 xfs_trans_del_item(&bip->bli_item); 377 xfs_trans_del_item(&bip->bli_item);
380 bip->bli_flags &= ~XFS_BLI_HOLD; 378 bip->bli_flags &= ~XFS_BLI_HOLD;
381 379
382 /* 380 /* drop the reference to the bli */
383 * Drop the reference to the bli. At this point, the bli must be either 381 xfs_buf_item_put(bip);
384 * freed or dirty (or both). If freed, there are a couple cases where we
385 * are responsible to free the item. If the bli is clean, we're the last
386 * user of it. If the fs has shut down, the bli may be dirty and AIL
387 * resident, but won't ever be written back. We therefore may also need
388 * to remove it from the AIL before freeing it.
389 */
390 freed = atomic_dec_and_test(&bip->bli_refcount);
391 dirty = bip->bli_flags & XFS_BLI_DIRTY;
392 ASSERT(freed || dirty);
393 if (freed) {
394 bool abort = XFS_FORCED_SHUTDOWN(tp->t_mountp);
395 ASSERT(abort || !test_bit(XFS_LI_IN_AIL, &bip->bli_item.li_flags));
396 if (abort)
397 xfs_trans_ail_remove(&bip->bli_item, SHUTDOWN_LOG_IO_ERROR);
398 if (!dirty || abort)
399 xfs_buf_item_relse(bp);
400 }
401 382
402 bp->b_transp = NULL; 383 bp->b_transp = NULL;
403 xfs_buf_relse(bp); 384 xfs_buf_relse(bp);