|
@@ -1001,12 +1001,13 @@ xfs_buf_iodone_work(
|
|
* We can get an EOPNOTSUPP to ordered writes. Here we clear the
|
|
* We can get an EOPNOTSUPP to ordered writes. Here we clear the
|
|
* ordered flag and reissue them. Because we can't tell the higher
|
|
* ordered flag and reissue them. Because we can't tell the higher
|
|
* layers directly that they should not issue ordered I/O anymore, they
|
|
* layers directly that they should not issue ordered I/O anymore, they
|
|
- * need to check if the ordered flag was cleared during I/O completion.
|
|
|
|
|
|
+ * need to check if the _XFS_BARRIER_FAILED flag was set during I/O completion.
|
|
*/
|
|
*/
|
|
if ((bp->b_error == EOPNOTSUPP) &&
|
|
if ((bp->b_error == EOPNOTSUPP) &&
|
|
(bp->b_flags & (XBF_ORDERED|XBF_ASYNC)) == (XBF_ORDERED|XBF_ASYNC)) {
|
|
(bp->b_flags & (XBF_ORDERED|XBF_ASYNC)) == (XBF_ORDERED|XBF_ASYNC)) {
|
|
XB_TRACE(bp, "ordered_retry", bp->b_iodone);
|
|
XB_TRACE(bp, "ordered_retry", bp->b_iodone);
|
|
bp->b_flags &= ~XBF_ORDERED;
|
|
bp->b_flags &= ~XBF_ORDERED;
|
|
|
|
+ bp->b_flags |= _XFS_BARRIER_FAILED;
|
|
xfs_buf_iorequest(bp);
|
|
xfs_buf_iorequest(bp);
|
|
} else if (bp->b_iodone)
|
|
} else if (bp->b_iodone)
|
|
(*(bp->b_iodone))(bp);
|
|
(*(bp->b_iodone))(bp);
|