mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
xfs: simplify __xfs_buf_ioend
__xfs_buf_ioend can only resubmit the buffer for asynchronous writes, which means the retry handling xfs_buf_iowait is not needed. Because of this can stop returning a value from __xfs_buf_ioend and just release the buffer for async I/O that does not require retries. Also drop the __-prefix now that the semantics are straight forward. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
parent
93e21ef2a8
commit
e4281086ae
|
|
@ -1098,11 +1098,17 @@ xfs_buf_ioend_handle_error(
|
|||
return false;
|
||||
}
|
||||
|
||||
/* returns false if the caller needs to resubmit the I/O, else true */
|
||||
static bool
|
||||
__xfs_buf_ioend(
|
||||
/*
|
||||
* Complete a buffer read or write.
|
||||
*
|
||||
* Releases the buffer if the I/O was asynchronous.
|
||||
*/
|
||||
static void
|
||||
xfs_buf_ioend(
|
||||
struct xfs_buf *bp)
|
||||
{
|
||||
bool async = bp->b_flags & XBF_ASYNC;
|
||||
|
||||
trace_xfs_buf_iodone(bp, _RET_IP_);
|
||||
|
||||
if (bp->b_flags & XBF_READ) {
|
||||
|
|
@ -1116,14 +1122,16 @@ __xfs_buf_ioend(
|
|||
if (bp->b_flags & XBF_READ_AHEAD)
|
||||
percpu_counter_dec(&bp->b_target->bt_readahead_count);
|
||||
} else {
|
||||
if (!bp->b_error) {
|
||||
if (unlikely(bp->b_error)) {
|
||||
if (xfs_buf_ioend_handle_error(bp)) {
|
||||
ASSERT(async);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
bp->b_flags &= ~XBF_WRITE_FAIL;
|
||||
bp->b_flags |= XBF_DONE;
|
||||
}
|
||||
|
||||
if (unlikely(bp->b_error) && xfs_buf_ioend_handle_error(bp))
|
||||
return false;
|
||||
|
||||
/* clear the retry state */
|
||||
bp->b_last_error = 0;
|
||||
bp->b_retries = 0;
|
||||
|
|
@ -1143,18 +1151,15 @@ __xfs_buf_ioend(
|
|||
|
||||
bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD |
|
||||
_XBF_LOGRECOVERY);
|
||||
return true;
|
||||
if (async)
|
||||
xfs_buf_relse(bp);
|
||||
}
|
||||
|
||||
static void
|
||||
xfs_buf_ioend_work(
|
||||
struct work_struct *work)
|
||||
{
|
||||
struct xfs_buf *bp =
|
||||
container_of(work, struct xfs_buf, b_ioend_work);
|
||||
|
||||
if (__xfs_buf_ioend(bp))
|
||||
xfs_buf_relse(bp);
|
||||
xfs_buf_ioend(container_of(work, struct xfs_buf, b_ioend_work));
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -1195,8 +1200,7 @@ xfs_buf_fail(
|
|||
bp->b_flags &= ~XBF_DONE;
|
||||
xfs_buf_stale(bp);
|
||||
xfs_buf_ioerror(bp, -EIO);
|
||||
if (__xfs_buf_ioend(bp))
|
||||
xfs_buf_relse(bp);
|
||||
xfs_buf_ioend(bp);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -1305,12 +1309,11 @@ xfs_buf_iowait(
|
|||
{
|
||||
ASSERT(!(bp->b_flags & XBF_ASYNC));
|
||||
|
||||
do {
|
||||
trace_xfs_buf_iowait(bp, _RET_IP_);
|
||||
wait_for_completion(&bp->b_iowait);
|
||||
trace_xfs_buf_iowait_done(bp, _RET_IP_);
|
||||
} while (!__xfs_buf_ioend(bp));
|
||||
trace_xfs_buf_iowait(bp, _RET_IP_);
|
||||
wait_for_completion(&bp->b_iowait);
|
||||
trace_xfs_buf_iowait_done(bp, _RET_IP_);
|
||||
|
||||
xfs_buf_ioend(bp);
|
||||
return bp->b_error;
|
||||
}
|
||||
|
||||
|
|
@ -1404,12 +1407,10 @@ xfs_buf_submit(
|
|||
bp->b_flags &= ~XBF_DONE;
|
||||
xfs_buf_stale(bp);
|
||||
end_io:
|
||||
if (bp->b_flags & XBF_ASYNC) {
|
||||
if (__xfs_buf_ioend(bp))
|
||||
xfs_buf_relse(bp);
|
||||
} else {
|
||||
if (bp->b_flags & XBF_ASYNC)
|
||||
xfs_buf_ioend(bp);
|
||||
else
|
||||
complete(&bp->b_iowait);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user