Commit 23e62cf7 authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

selftests/ublk: fix error handling for starting device



Fix error handling in ublk_start_daemon() when start_dev fails:

1. Call ublk_ctrl_stop_dev() to cancel inflight uring_cmd before
   cleanup. Without this, the device deletion may hang waiting for
   I/O completion that will never happen.

2. Add fail_start label so that pthread_join() is called on the
   error path. This ensures proper thread cleanup when startup fails.

Fixes: 6aecda00 ("selftests: ublk: add kernel selftests for ublk")
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Reviewed-by: default avatarCaleb Sander Mateos <csander@purestorage.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 75aad5ff
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -1054,7 +1054,9 @@ static int ublk_start_daemon(const struct dev_ctx *ctx, struct ublk_dev *dev)
	}
	if (ret < 0) {
		ublk_err("%s: ublk_ctrl_start_dev failed: %d\n", __func__, ret);
		goto fail;
		/* stop device so that inflight uring_cmd can be cancelled */
		ublk_ctrl_stop_dev(dev);
		goto fail_start;
	}

	ublk_ctrl_get_info(dev);
@@ -1062,7 +1064,7 @@ static int ublk_start_daemon(const struct dev_ctx *ctx, struct ublk_dev *dev)
		ublk_ctrl_dump(dev);
	else
		ublk_send_dev_event(ctx, dev, dev->dev_info.dev_id);

fail_start:
	/* wait until we are terminated */
	for (i = 0; i < dev->nthreads; i++)
		pthread_join(tinfo[i].thread, &thread_ret);