Am 13.06.2018 um 09:46 hat Fam Zheng geschrieben:
> Similar to the host_device's implementation, we check the requested
> length against the namespace size.
> 
> Truncation is necessary to make qcow2 creation work.
> 
> Signed-off-by: Fam Zheng <[email protected]>

> +static int coroutine_fn nvme_co_create_opts(const char *filename, QemuOpts 
> *opts,
> +                                            Error **errp)
> +{
> +    int ret = 0;
> +    BlockDriverState *bs = NULL;
> +    int64_t size;
> +
> +    if (strncmp(filename, "nvme://", strlen("nvme://"))) {
> +        error_setg(errp, "Invalid filename (must start with \"nvme://\")");
> +        ret = -EINVAL;
> +        goto out;
> +    }
> +
> +    bs = bdrv_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_PROTOCOL, 
> errp);
> +    if (!bs) {
> +        ret = -EINVAL;
> +        goto out;
> +    }
> +
> +    size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0);
> +
> +    if (size < 0 || bdrv_getlength(bs) < size) {
> +        error_setg(errp, "Invalid image size");
> +        ret = -EINVAL;
> +    }
> +
> +out:
> +    bdrv_unref(bs);
> +    /* Hold breath for a little while before letting image format creation 
> run.
> +     * The problem is when testing with Intel P3700, the controller doesn't
> +     * like the immediate open after close, as a result, nvme_init() will 
> fail.
> +     * This works around that.
> +     **/
> +    g_usleep(2000000);

This suggests that nbd_init() is buggy.

If we need to sleep here (for two whole seconds?!), I'm sure there are
other cases that would have to sleep as well. So even if we can't find a
solution other than sleeping - which feels horribly wrong - the sleep
should probably be in nvme_init() rather than here.

What kind of error are you running into without the sleep?

Kevin

Reply via email to