Commit 2761e95f authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Alasdair G Kergon

dm: process requeue in dm_wq_work

If barrier request was returned with DM_ENDIO_REQUEUE,
requeue it in dm_wq_work instead of dec_pending.

This allows us to correctly handle a situation when some targets
are asking for a requeue and other targets signal an error.
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent 531fe963
...@@ -536,9 +536,11 @@ static void dec_pending(struct dm_io *io, int error) ...@@ -536,9 +536,11 @@ static void dec_pending(struct dm_io *io, int error)
* Target requested pushing back the I/O. * Target requested pushing back the I/O.
*/ */
spin_lock_irqsave(&md->deferred_lock, flags); spin_lock_irqsave(&md->deferred_lock, flags);
if (__noflush_suspending(md)) if (__noflush_suspending(md)) {
bio_list_add_head(&md->deferred, io->bio); if (!bio_barrier(io->bio))
else bio_list_add_head(&md->deferred,
io->bio);
} else
/* noflush suspend was interrupted. */ /* noflush suspend was interrupted. */
io->error = -EIO; io->error = -EIO;
spin_unlock_irqrestore(&md->deferred_lock, flags); spin_unlock_irqrestore(&md->deferred_lock, flags);
...@@ -1458,6 +1460,11 @@ static void process_barrier(struct mapped_device *md, struct bio *bio) ...@@ -1458,6 +1460,11 @@ static void process_barrier(struct mapped_device *md, struct bio *bio)
if (md->barrier_error != DM_ENDIO_REQUEUE) if (md->barrier_error != DM_ENDIO_REQUEUE)
bio_endio(bio, md->barrier_error); bio_endio(bio, md->barrier_error);
else {
spin_lock_irq(&md->deferred_lock);
bio_list_add_head(&md->deferred, bio);
spin_unlock_irq(&md->deferred_lock);
}
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment