xfs: do not add buffers to the delwri queue until pushed
authorChristoph Hellwig <hch@infradead.org>
Mon, 23 Apr 2012 05:58:38 +0000 (15:58 +1000)
committerBen Myers <bpm@sgi.com>
Mon, 14 May 2012 21:20:30 +0000 (16:20 -0500)
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>
fs/xfs/xfs_buf_item.c
fs/xfs/xfs_trans_buf.c

index eac97ef81e2a156a58d9b74b54607c6a0d2e76c3..3a0bc38f18599ae1ec11eecd88cfe2962753da8b 100644 (file)
@@ -460,6 +460,12 @@ xfs_buf_item_unpin(
                        ASSERT(bp->b_fspriv == NULL);
                }
                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(
 }
 
 /*
- * The buffer is locked, but is not a delayed write buffer. This happens
- * if we race with IO completion and hence we don't want to try to write it
- * again. Just release the buffer.
+ * The buffer is locked, but is not a delayed write buffer.
  */
 STATIC void
 xfs_buf_item_push(
@@ -620,6 +624,7 @@ xfs_buf_item_push(
 
        trace_xfs_buf_item_push(bip);
 
+       xfs_buf_delwri_queue(bp);
        xfs_buf_relse(bp);
 }
 
index 1302d1d95a5850d121af792719b04d2d5672af39..296a7995a0076ec7f1e8220b0c5eb1dc78a339eb 100644 (file)
@@ -626,8 +626,6 @@ xfs_trans_log_buf(xfs_trans_t       *tp,
        bp->b_iodone = xfs_buf_iodone_callbacks;
        bip->bli_item.li_cb = xfs_buf_iodone;
 
-       xfs_buf_delwri_queue(bp);
-
        trace_xfs_trans_log_buf(bip);
 
        /*