Do not modify *__clone if blk_mq_alloc_request() fails. This makes
it easier to figure out what is going on if the caller accidentally
dereferences *__clone if blk_mq_alloc_request() failed.

Signed-off-by: Bart Van Assche <[email protected]>
---
 drivers/md/dm-mpath.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index 1c97f0e..5c73818 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -582,16 +582,17 @@ static int __multipath_map(struct dm_target *ti, struct 
request *clone,
                 * .request_fn stacked on blk-mq path(s) and
                 * blk-mq stacked on blk-mq path(s).
                 */
-               *__clone = blk_mq_alloc_request(bdev_get_queue(bdev),
-                                               rq_data_dir(rq), 
BLK_MQ_REQ_NOWAIT);
-               if (IS_ERR(*__clone)) {
-                       /* ENOMEM, requeue */
+               clone = blk_mq_alloc_request(bdev_get_queue(bdev),
+                                       rq_data_dir(rq), BLK_MQ_REQ_NOWAIT);
+               if (IS_ERR(clone)) {
+                       /* EBUSY, ENODEV or EWOULDBLOCK; requeue */
                        clear_request_fn_mpio(m, map_context);
                        return r;
                }
-               (*__clone)->bio = (*__clone)->biotail = NULL;
-               (*__clone)->rq_disk = bdev->bd_disk;
-               (*__clone)->cmd_flags |= REQ_FAILFAST_TRANSPORT;
+               *__clone = clone;
+               clone->bio = clone->biotail = NULL;
+               clone->rq_disk = bdev->bd_disk;
+               clone->cmd_flags |= REQ_FAILFAST_TRANSPORT;
        }
 
        if (pgpath->pg->ps.type->start_io)
-- 
2.10.1

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to