| From 2f7ccbe15215fd420ae9ed35766f060d636fc410 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 20 Apr 2020 22:29:09 +0200 |
| Subject: dm mpath: switch paths in dm_blk_ioctl() code path |
| |
| From: Martin Wilck <mwilck@suse.com> |
| |
| [ Upstream commit 2361ae595352dec015d14292f1b539242d8446d6 ] |
| |
| SCSI LUN passthrough code such as qemu's "scsi-block" device model |
| pass every IO to the host via SG_IO ioctls. Currently, dm-multipath |
| calls choose_pgpath() only in the block IO code path, not in the ioctl |
| code path (unless current_pgpath is NULL). This has the effect that no |
| path switching and thus no load balancing is done for SCSI-passthrough |
| IO, unless the active path fails. |
| |
| Fix this by using the same logic in multipath_prepare_ioctl() as in |
| multipath_clone_and_map(). |
| |
| Note: The allegedly best path selection algorithm, service-time, |
| still wouldn't work perfectly, because the io size of the current |
| request is always set to 0. Changing that for the IO passthrough |
| case would require the ioctl cmd and arg to be passed to dm's |
| prepare_ioctl() method. |
| |
| Signed-off-by: Martin Wilck <mwilck@suse.com> |
| Reviewed-by: Hannes Reinecke <hare@suse.de> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/md/dm-mpath.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c |
| index 8b7328666eaaf..7c60aace8d25d 100644 |
| --- a/drivers/md/dm-mpath.c |
| +++ b/drivers/md/dm-mpath.c |
| @@ -1815,7 +1815,7 @@ static int multipath_prepare_ioctl(struct dm_target *ti, |
| int r; |
| |
| current_pgpath = READ_ONCE(m->current_pgpath); |
| - if (!current_pgpath) |
| + if (!current_pgpath || !test_bit(MPATHF_QUEUE_IO, &m->flags)) |
| current_pgpath = choose_pgpath(m, 0); |
| |
| if (current_pgpath) { |
| -- |
| 2.25.1 |
| |