xfs: don't use REQ_PREFLUSH for split log writes
authorChristoph Hellwig <hch@lst.de>
Sat, 29 Jun 2019 02:27:21 +0000 (19:27 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Sat, 29 Jun 2019 02:27:21 +0000 (19:27 -0700)
If we have to split a log write because it wraps the end of the log we
can't just use REQ_PREFLUSH to flush before the first log write,
as the writes might get reordered somewhere in the I/O stack.  Issue
a manual flush in that case so that the ordering of the two log I/Os
doesn't matter.

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

index 49e7f64..99509d2 100644 (file)
@@ -1904,7 +1904,7 @@ xlog_sync(
         * synchronously here; for an internal log we can simply use the block
         * layer state machine for preflushes.
         */
-       if (log->l_mp->m_logdev_targp != log->l_mp->m_ddev_targp)
+       if (log->l_mp->m_logdev_targp != log->l_mp->m_ddev_targp || split)
                xfs_blkdev_issue_flush(log->l_mp->m_ddev_targp);
        else
                bp->b_flags |= XBF_FLUSH;