xfs: clear the read/write flags later in xfs_buf_ioend
authorChristoph Hellwig <hch@lst.de>
Tue, 1 Sep 2020 17:55:46 +0000 (10:55 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 16 Sep 2020 03:52:39 +0000 (20:52 -0700)
Clear the flags at the end of xfs_buf_ioend so that they can be used
during the completion.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_buf.c

index 13435cce2699e46127026be5108c511bbe5c9f04..24cc0c94b5b803575d96582bfeafdc72213db88e 100644 (file)
@@ -1283,12 +1283,13 @@ xfs_buf_ioend_handle_error(
 
 resubmit:
        xfs_buf_ioerror(bp, 0);
-       bp->b_flags |= (XBF_WRITE | XBF_DONE | XBF_WRITE_FAIL);
+       bp->b_flags |= (XBF_DONE | XBF_WRITE_FAIL);
        xfs_buf_submit(bp);
        return true;
 out_stale:
        xfs_buf_stale(bp);
        bp->b_flags |= XBF_DONE;
+       bp->b_flags &= ~XBF_WRITE;
        trace_xfs_buf_error_relse(bp, _RET_IP_);
        return false;
 }
@@ -1297,12 +1298,8 @@ static void
 xfs_buf_ioend(
        struct xfs_buf  *bp)
 {
-       bool            read = bp->b_flags & XBF_READ;
-
        trace_xfs_buf_iodone(bp, _RET_IP_);
 
-       bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD);
-
        /*
         * Pull in IO completion errors now. We are guaranteed to be running
         * single threaded, so we don't need the lock to read b_io_error.
@@ -1310,7 +1307,7 @@ xfs_buf_ioend(
        if (!bp->b_error && bp->b_io_error)
                xfs_buf_ioerror(bp, bp->b_io_error);
 
-       if (read) {
+       if (bp->b_flags & XBF_READ) {
                if (!bp->b_error && bp->b_ops)
                        bp->b_ops->verify_read(bp);
                if (!bp->b_error)
@@ -1350,6 +1347,8 @@ xfs_buf_ioend(
                        xfs_buf_dquot_iodone(bp);
        }
 
+       bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD);
+
        if (bp->b_flags & XBF_ASYNC)
                xfs_buf_relse(bp);
        else