]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dm mpath: Add missing dm_put_device when failing to get scsi dh name
authorBenjamin Marzinski <bmarzins@redhat.com>
Wed, 28 Jan 2026 00:12:22 +0000 (19:12 -0500)
committerMikulas Patocka <mpatocka@redhat.com>
Wed, 28 Jan 2026 14:43:34 +0000 (15:43 +0100)
When commit fd81bc5cca8f ("scsi: device_handler: Return error pointer in
scsi_dh_attached_handler_name()") added code to fail parsing the path if
scsi_dh_attached_handler_name() failed with -ENOMEM, it didn't clean up
the reference to the path device that had just been taken. Fix this, and
steamline the error paths of parse_path() a little.

Fixes: fd81bc5cca8f ("scsi: device_handler: Return error pointer in scsi_dh_attached_handler_name()")
Cc: stable@vger.kernel.org
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
drivers/md/dm-mpath.c

index c748e7f952c443f8f05100f42b221b6a134be7d1..6f9d86f4b912c40a3e92403b2dc7851a23afb10d 100644 (file)
@@ -960,27 +960,27 @@ static struct pgpath *parse_path(struct dm_arg_set *as, struct path_selector *ps
                        attached_handler_name = NULL;
                } else {
                        r = PTR_ERR(attached_handler_name);
-                       goto bad;
+                       ti->error = "error allocating handler name";
+                       goto bad_put_device;
                }
        }
        if (attached_handler_name || m->hw_handler_name) {
                INIT_DELAYED_WORK(&p->activate_path, activate_path_work);
                r = setup_scsi_dh(p->path.dev->bdev, m, &attached_handler_name, &ti->error);
                kfree(attached_handler_name);
-               if (r) {
-                       dm_put_device(ti, p->path.dev);
-                       goto bad;
-               }
+               if (r)
+                       goto bad_put_device;
        }
 
        r = ps->type->add_path(ps, &p->path, as->argc, as->argv, &ti->error);
-       if (r) {
-               dm_put_device(ti, p->path.dev);
-               goto bad;
-       }
+       if (r)
+               goto bad_put_device;
 
        return p;
- bad:
+
+bad_put_device:
+       dm_put_device(ti, p->path.dev);
+bad:
        free_pgpath(p);
        return ERR_PTR(r);
 }