Commit 960c60af authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Ben Myers

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarMark Tinguely <tinguely@sgi.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent fe7257fd
...@@ -460,6 +460,12 @@ xfs_buf_item_unpin( ...@@ -460,6 +460,12 @@ xfs_buf_item_unpin(
ASSERT(bp->b_fspriv == NULL); ASSERT(bp->b_fspriv == NULL);
} }
xfs_buf_relse(bp); xfs_buf_relse(bp);
} else if (freed && remove) {
xfs_buf_lock(bp);
xfs_buf_ioerror(bp, EIO);
XFS_BUF_UNDONE(bp);
xfs_buf_stale(bp);
xfs_buf_ioend(bp, 0);
} }
} }
...@@ -604,9 +610,7 @@ xfs_buf_item_committed( ...@@ -604,9 +610,7 @@ xfs_buf_item_committed(
} }
/* /*
* The buffer is locked, but is not a delayed write buffer. This happens * The buffer is locked, but is not a delayed write buffer.
* if we race with IO completion and hence we don't want to try to write it
* again. Just release the buffer.
*/ */
STATIC void STATIC void
xfs_buf_item_push( xfs_buf_item_push(
...@@ -620,6 +624,7 @@ xfs_buf_item_push( ...@@ -620,6 +624,7 @@ xfs_buf_item_push(
trace_xfs_buf_item_push(bip); trace_xfs_buf_item_push(bip);
xfs_buf_delwri_queue(bp);
xfs_buf_relse(bp); xfs_buf_relse(bp);
} }
......
...@@ -626,8 +626,6 @@ xfs_trans_log_buf(xfs_trans_t *tp, ...@@ -626,8 +626,6 @@ xfs_trans_log_buf(xfs_trans_t *tp,
bp->b_iodone = xfs_buf_iodone_callbacks; bp->b_iodone = xfs_buf_iodone_callbacks;
bip->bli_item.li_cb = xfs_buf_iodone; bip->bli_item.li_cb = xfs_buf_iodone;
xfs_buf_delwri_queue(bp);
trace_xfs_trans_log_buf(bip); trace_xfs_trans_log_buf(bip);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment