Skip to content

Commit

Permalink
xfs: do not add buffers to the delwri queue until pushed
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Christoph Hellwig authored and Ben Myers committed May 14, 2012
1 parent fe7257f commit 960c60a
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 5 deletions.
11 changes: 8 additions & 3 deletions fs/xfs/xfs_buf_item.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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(
Expand All @@ -620,6 +624,7 @@ xfs_buf_item_push(

trace_xfs_buf_item_push(bip);

xfs_buf_delwri_queue(bp);
xfs_buf_relse(bp);
}

Expand Down
2 changes: 0 additions & 2 deletions fs/xfs/xfs_trans_buf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/*
Expand Down

0 comments on commit 960c60a

Please sign in to comment.