diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index f6e5a0766721..2d6250d61a7b 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -2953,8 +2953,10 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub, if (wait_for_completion_interruptible(&ub->completion) != 0) return -EINTR; - if (ub->ublksrv_tgid != ublksrv_pid) - return -EINVAL; + if (ub->ublksrv_tgid != ublksrv_pid) { + ret = -EINVAL; + goto out; + } mutex_lock(&ub->mutex); if (ub->dev_info.state == UBLK_S_DEV_LIVE || @@ -3017,6 +3019,9 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub, put_disk(disk); out_unlock: mutex_unlock(&ub->mutex); +out: + if (ret) + ublk_cancel_dev(ub); return ret; } diff --git a/tools/testing/selftests/ublk/kublk.c b/tools/testing/selftests/ublk/kublk.c index 185ba553686a..0c62a967f2cb 100644 --- a/tools/testing/selftests/ublk/kublk.c +++ b/tools/testing/selftests/ublk/kublk.c @@ -153,11 +153,10 @@ static int ublk_ctrl_add_dev(struct ublk_dev *dev) return __ublk_ctrl_cmd(dev, &data); } -static int ublk_ctrl_del_dev(struct ublk_dev *dev) +static int ublk_ctrl_del_dev(struct ublk_dev *dev, bool async) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_U_CMD_DEL_DEV, - .flags = 0, + .cmd_op = async ? UBLK_U_CMD_DEL_DEV_ASYNC: UBLK_U_CMD_DEL_DEV, }; return __ublk_ctrl_cmd(dev, &data); @@ -1063,11 +1062,11 @@ static int ublk_start_daemon(const struct dev_ctx *ctx, struct ublk_dev *dev) else ublk_send_dev_event(ctx, dev, dev->dev_info.dev_id); + fail: /* wait until we are terminated */ for (i = 0; i < dev->nthreads; i++) pthread_join(tinfo[i].thread, &thread_ret); free(tinfo); - fail: for (i = 0; i < dinfo->nr_hw_queues; i++) ublk_queue_deinit(&dev->q[i]); ublk_dev_unprep(dev); @@ -1272,9 +1271,9 @@ static int __cmd_dev_add(const struct dev_ctx *ctx) } ret = ublk_start_daemon(ctx, dev); - ublk_dbg(UBLK_DBG_DEV, "%s: daemon exit %d\b", ret); + ublk_dbg(UBLK_DBG_DEV, "%s: daemon exit %d\n", __func__, ret); if (ret < 0) - ublk_ctrl_del_dev(dev); + ublk_ctrl_del_dev(dev, true); fail: if (ret < 0) @@ -1371,7 +1370,7 @@ static int __cmd_dev_del(struct dev_ctx *ctx) if (ret < 0) ublk_err("%s: stop daemon id %d dev %d, ret %d\n", __func__, dev->dev_info.ublksrv_pid, number, ret); - ublk_ctrl_del_dev(dev); + ublk_ctrl_del_dev(dev, false); fail: ublk_ctrl_deinit(dev); @@ -1622,6 +1621,7 @@ int main(int argc, char *argv[]) .nr_hw_queues = 2, .dev_id = -1, .tgt_type = "unknown", + ._evtfd = -1, }; int ret = -EINVAL, i; int tgt_argc = 1;