• Y
    dm mpath: fix missing call of path selector type->end_io · 47869f53
    Yufen Yu 提交于
    [ Upstream commit 5de719e3d01b4abe0de0d7b857148a880ff2a90b ]
    
    After commit 396eaf21 ("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 396eaf21, 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: 396eaf21 ("blk-mq: improve DM's blk-mq IO merging via blk_insert_cloned_request feedback")
    Cc: stable@vger.kernl.org
    Signed-off-by: NYufen Yu <yuyufen@huawei.com>
    Signed-off-by: NMike Snitzer <snitzer@redhat.com>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    47869f53
device-mapper.h 17.1 KB