lkml.org 
[lkml]   [2020]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 162/376] xfs: reset buffer write failure state on successful completion
    Date
    From: Brian Foster <bfoster@redhat.com>

    [ Upstream commit b6983e80b03bd4fd42de71993b3ac7403edac758 ]

    The buffer write failure flag is intended to control the internal
    write retry that XFS has historically implemented to help mitigate
    the severity of transient I/O errors. The flag is set when a buffer
    is resubmitted from the I/O completion path due to a previous
    failure. It is checked on subsequent I/O completions to skip the
    internal retry and fall through to the higher level configurable
    error handling mechanism. The flag is cleared in the synchronous and
    delwri submission paths and also checked in various places to log
    write failure messages.

    There are a couple minor problems with the current usage of this
    flag. One is that we issue an internal retry after every submission
    from xfsaild due to how delwri submission clears the flag. This
    results in double the expected or configured number of write
    attempts when under sustained failures. Another more subtle issue is
    that the flag is never cleared on successful I/O completion. This
    can cause xfs_wait_buftarg() to suggest that dirty buffers are being
    thrown away due to the existence of the flag, when the reality is
    that the flag might still be set because the write succeeded on the
    retry.

    Clear the write failure flag on successful I/O completion to address
    both of these problems. This means that the internal retry attempt
    occurs once since the last time a buffer write failed and that
    various other contexts only see the flag set when the immediately
    previous write attempt has failed.

    Signed-off-by: Brian Foster <bfoster@redhat.com>
    Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Allison Collins <allison.henderson@oracle.com>
    Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/xfs/xfs_buf.c | 8 +++++---
    1 file changed, 5 insertions(+), 3 deletions(-)

    diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
    index 9ec3eaf1c618..afa73a19caa1 100644
    --- a/fs/xfs/xfs_buf.c
    +++ b/fs/xfs/xfs_buf.c
    @@ -1197,8 +1197,10 @@ xfs_buf_ioend(
    bp->b_ops->verify_read(bp);
    }

    - if (!bp->b_error)
    + if (!bp->b_error) {
    + bp->b_flags &= ~XBF_WRITE_FAIL;
    bp->b_flags |= XBF_DONE;
    + }

    if (bp->b_iodone)
    (*(bp->b_iodone))(bp);
    @@ -1258,7 +1260,7 @@ xfs_bwrite(

    bp->b_flags |= XBF_WRITE;
    bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q |
    - XBF_WRITE_FAIL | XBF_DONE);
    + XBF_DONE);

    error = xfs_buf_submit(bp);
    if (error)
    @@ -1983,7 +1985,7 @@ xfs_buf_delwri_submit_buffers(
    * synchronously. Otherwise, drop the buffer from the delwri
    * queue and submit async.
    */
    - bp->b_flags &= ~(_XBF_DELWRI_Q | XBF_WRITE_FAIL);
    + bp->b_flags &= ~_XBF_DELWRI_Q;
    bp->b_flags |= XBF_WRITE;
    if (wait_list) {
    bp->b_flags &= ~XBF_ASYNC;
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-06-19 17:52    [W:5.229 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site