aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2012-04-23 01:58:38 -0400
committerBen Myers <bpm@sgi.com>2012-05-14 17:20:30 -0400
commit960c60af8b9481595e68875e79b2602e73169c29 (patch)
tree26756622c5a0c63ead727621602cc1670604c0a3 /fs/xfs
parentfe7257fd4b8ae9a3e354d9edb61890973e373ef0 (diff)
xfs: do not add buffers to the delwri queue until pushed
Instead of adding buffers to the delwri list as soon as they are logged, even if they can't be written until commited because they are pinned defer adding them to the delwri list until xfsaild pushes them. This makes the code more similar to other log items and prepares for writing buffers directly from xfsaild. The complication here is that we need to fail buffers that were added but not logged yet in xfs_buf_item_unpin, borrowing code from xfs_bioerror. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Mark Tinguely <tinguely@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/xfs_buf_item.c11
-rw-r--r--fs/xfs/xfs_trans_buf.c2
2 files changed, 8 insertions, 5 deletions
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index eac97ef81e2a..3a0bc38f1859 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -460,6 +460,12 @@ xfs_buf_item_unpin(
460 ASSERT(bp->b_fspriv == NULL); 460 ASSERT(bp->b_fspriv == NULL);
461 } 461 }
462 xfs_buf_relse(bp); 462 xfs_buf_relse(bp);
463 } else if (freed && remove) {
464 xfs_buf_lock(bp);
465 xfs_buf_ioerror(bp, EIO);
466 XFS_BUF_UNDONE(bp);
467 xfs_buf_stale(bp);
468 xfs_buf_ioend(bp, 0);
463 } 469 }
464} 470}
465 471
@@ -604,9 +610,7 @@ xfs_buf_item_committed(
604} 610}
605 611
606/* 612/*
607 * The buffer is locked, but is not a delayed write buffer. This happens 613 * The buffer is locked, but is not a delayed write buffer.
608 * if we race with IO completion and hence we don't want to try to write it
609 * again. Just release the buffer.
610 */ 614 */
611STATIC void 615STATIC void
612xfs_buf_item_push( 616xfs_buf_item_push(
@@ -620,6 +624,7 @@ xfs_buf_item_push(
620 624
621 trace_xfs_buf_item_push(bip); 625 trace_xfs_buf_item_push(bip);
622 626
627 xfs_buf_delwri_queue(bp);
623 xfs_buf_relse(bp); 628 xfs_buf_relse(bp);
624} 629}
625 630
diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c
index 1302d1d95a58..296a7995a007 100644
--- a/fs/xfs/xfs_trans_buf.c
+++ b/fs/xfs/xfs_trans_buf.c
@@ -626,8 +626,6 @@ xfs_trans_log_buf(xfs_trans_t *tp,
626 bp->b_iodone = xfs_buf_iodone_callbacks; 626 bp->b_iodone = xfs_buf_iodone_callbacks;
627 bip->bli_item.li_cb = xfs_buf_iodone; 627 bip->bli_item.li_cb = xfs_buf_iodone;
628 628
629 xfs_buf_delwri_queue(bp);
630
631 trace_xfs_trans_log_buf(bip); 629 trace_xfs_trans_log_buf(bip);
632 630
633 /* 631 /*