Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -536,9 +536,11 @@ static void dec_pending(struct dm_io *io, int error)
			 * Target requested pushing back the I/O.
			 */
			spin_lock_irqsave(&md->deferred_lock, flags);
			if (__noflush_suspending(md))
				bio_list_add_head(&md->deferred, io->bio);
			else
			if (__noflush_suspending(md)) {
				if (!bio_barrier(io->bio))
					bio_list_add_head(&md->deferred,
							  io->bio);
			} else
				/* noflush suspend was interrupted. */
				io->error = -EIO;
			spin_unlock_irqrestore(&md->deferred_lock, flags);
@@ -1458,6 +1460,11 @@ static void process_barrier(struct mapped_device *md, struct bio *bio)

	if (md->barrier_error != DM_ENDIO_REQUEUE)
		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);
	}
}

/*