Skip to content

Commit ffde32a

Browse files
Ming Leiaxboe
authored andcommitted
selftests: ublk: fix starting ublk device
Firstly ublk char device node may not be created by udev yet, so wait a while until it can be opened or timeout. Secondly delete created ublk device in case of start failure, otherwise the device becomes zombie. Signed-off-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20250321135324.259677-1-ming.lei@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 07754bf commit ffde32a

2 files changed

Lines changed: 23 additions & 11 deletions

File tree

tools/testing/selftests/ublk/file_backed.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,13 @@ static int ublk_loop_tgt_init(struct ublk_dev *dev)
196196
},
197197
};
198198

199-
assert(dev->tgt.nr_backing_files == 1);
200199
ret = backing_file_tgt_init(dev);
201200
if (ret)
202201
return ret;
203202

203+
if (dev->tgt.nr_backing_files != 1)
204+
return -EINVAL;
205+
204206
bytes = dev->tgt.backing_file_size[0];
205207
dev->tgt.dev_size = bytes;
206208
p.basic.dev_sectors = bytes >> 9;

tools/testing/selftests/ublk/kublk.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -379,26 +379,34 @@ static int ublk_queue_init(struct ublk_queue *q)
379379
return -ENOMEM;
380380
}
381381

382+
#define WAIT_USEC 100000
383+
#define MAX_WAIT_USEC (3 * 1000000)
382384
static int ublk_dev_prep(struct ublk_dev *dev)
383385
{
384386
int dev_id = dev->dev_info.dev_id;
387+
unsigned int wait_usec = 0;
388+
int ret = 0, fd = -1;
385389
char buf[64];
386-
int ret = 0;
387390

388391
snprintf(buf, 64, "%s%d", UBLKC_DEV, dev_id);
389-
dev->fds[0] = open(buf, O_RDWR);
390-
if (dev->fds[0] < 0) {
391-
ret = -EBADF;
392-
ublk_err("can't open %s, ret %d\n", buf, dev->fds[0]);
393-
goto fail;
392+
393+
while (wait_usec < MAX_WAIT_USEC) {
394+
fd = open(buf, O_RDWR);
395+
if (fd >= 0)
396+
break;
397+
usleep(WAIT_USEC);
398+
wait_usec += WAIT_USEC;
399+
}
400+
if (fd < 0) {
401+
ublk_err("can't open %s %s\n", buf, strerror(errno));
402+
return -1;
394403
}
395404

405+
dev->fds[0] = fd;
396406
if (dev->tgt.ops->init_tgt)
397407
ret = dev->tgt.ops->init_tgt(dev);
398-
399-
return ret;
400-
fail:
401-
close(dev->fds[0]);
408+
if (ret)
409+
close(dev->fds[0]);
402410
return ret;
403411
}
404412

@@ -856,6 +864,8 @@ static int __cmd_dev_add(const struct dev_ctx *ctx)
856864

857865
ret = ublk_start_daemon(ctx, dev);
858866
ublk_dbg(UBLK_DBG_DEV, "%s: daemon exit %d\b", ret);
867+
if (ret < 0)
868+
ublk_ctrl_del_dev(dev);
859869

860870
fail:
861871
if (ret < 0)

0 commit comments

Comments
 (0)