Files
kernel/include/linux
Yufen Yu 5de719e3d0 dm mpath: fix missing call of path selector type->end_io
After commit 396eaf21ee ("blk-mq: improve DM's blk-mq IO merging via
blk_insert_cloned_request feedback"), map_request() will requeue the tio
when issued clone request return BLK_STS_RESOURCE or BLK_STS_DEV_RESOURCE.

Thus, if device driver status is error, a tio may be requeued multiple
times until the return value is not DM_MAPIO_REQUEUE.  That means
type->start_io may be called multiple times, while type->end_io is only
called when IO complete.

In fact, even without commit 396eaf21ee, setup_clone() failure can
also cause tio requeue and associated missed call to type->end_io.

The service-time path selector selects path based on in_flight_size,
which is increased by st_start_io() and decreased by st_end_io().
Missed calls to st_end_io() can lead to in_flight_size count error and
will cause the selector to make the wrong choice.  In addition,
queue-length path selector will also be affected.

To fix the problem, call type->end_io in ->release_clone_rq before tio
requeue.  map_info is passed to ->release_clone_rq() for map_request()
error path that result in requeue.

Fixes: 396eaf21ee ("blk-mq: improve DM's blk-mq IO merging via blk_insert_cloned_request feedback")
Cc: stable@vger.kernl.org
Signed-off-by: Yufen Yu <yuyufen@huawei.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
2019-04-25 15:38:52 -04:00
..
2019-02-15 16:47:55 +02:00
2019-03-29 12:24:41 -07:00
2019-02-28 09:16:12 +01:00
2019-02-08 22:39:01 -08:00
2019-03-18 10:44:48 -06:00
2019-03-18 07:07:30 +01:00
2019-02-28 03:28:53 -05:00
2019-03-12 18:59:17 -07:00
2019-02-28 08:24:23 -07:00
2019-03-12 10:04:02 -07:00
2019-03-05 21:07:16 -08:00
2019-02-15 16:54:38 +01:00
2019-03-12 10:04:00 -07:00
2019-03-09 19:52:47 -08:00
2019-02-24 08:20:17 -07:00
2019-03-07 18:32:03 -08:00
2019-03-15 15:29:47 -07:00
2019-02-20 07:22:17 -07:00
2019-02-20 07:22:10 -07:00
2019-02-08 15:02:49 -08:00
2019-03-05 21:07:19 -08:00
2019-03-03 21:47:57 -08:00
2019-03-12 10:04:03 -07:00
2019-02-25 21:20:45 +01:00
2019-03-15 15:29:47 -07:00
2019-02-07 16:38:35 +01:00
2019-04-05 16:02:30 -10:00
2019-02-07 00:13:27 +01:00
2019-02-26 12:53:55 +01:00