Commit 787bd63e authored by Benjamin Marzinski's avatar Benjamin Marzinski Committed by Mikulas Patocka
Browse files

dm mpath: Add missing dm_put_device when failing to get scsi dh name



When commit fd81bc5c ("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: fd81bc5c ("scsi: device_handler: Return error pointer in scsi_dh_attached_handler_name()")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarBenjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
parent ec853402
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -960,26 +960,26 @@ 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_put_device:
	dm_put_device(ti, p->path.dev);
bad:
	free_pgpath(p);
	return ERR_PTR(r);