aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/dm.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index e34d694ddd04..910bce85f443 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -536,9 +536,11 @@ static void dec_pending(struct dm_io *io, int error)
536 * Target requested pushing back the I/O. 536 * Target requested pushing back the I/O.
537 */ 537 */
538 spin_lock_irqsave(&md->deferred_lock, flags); 538 spin_lock_irqsave(&md->deferred_lock, flags);
539 if (__noflush_suspending(md)) 539 if (__noflush_suspending(md)) {
540 bio_list_add_head(&md->deferred, io->bio); 540 if (!bio_barrier(io->bio))
541 else 541 bio_list_add_head(&md->deferred,
542 io->bio);
543 } else
542 /* noflush suspend was interrupted. */ 544 /* noflush suspend was interrupted. */
543 io->error = -EIO; 545 io->error = -EIO;
544 spin_unlock_irqrestore(&md->deferred_lock, flags); 546 spin_unlock_irqrestore(&md->deferred_lock, flags);
@@ -1458,6 +1460,11 @@ static void process_barrier(struct mapped_device *md, struct bio *bio)
1458 1460
1459 if (md->barrier_error != DM_ENDIO_REQUEUE) 1461 if (md->barrier_error != DM_ENDIO_REQUEUE)
1460 bio_endio(bio, md->barrier_error); 1462 bio_endio(bio, md->barrier_error);
1463 else {
1464 spin_lock_irq(&md->deferred_lock);
1465 bio_list_add_head(&md->deferred, bio);
1466 spin_unlock_irq(&md->deferred_lock);
1467 }
1461} 1468}
1462 1469
1463/* 1470/*