Commit 2a05cbe4 authored by Max Reitz's avatar Max Reitz Committed by Kevin Wolf
Browse files

block: Allow block devices without files



blkdebug and blkverify will, in order to retain compatibility, not
support the field "file" implicitly through bdrv_open(). In order to be
able to use those drivers without giving a filename anyway, it is
necessary to be able to have block devices without files implicitly
opened by bdrv_open(). This is the case, if there was neither a file
name, a reference to an existing block device to use as a file nor
options specific to the file.

Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 2258e3fe
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -1145,12 +1145,15 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
    qdict_extract_subqdict(options, &file_options, "file.");
    file_reference = qdict_get_try_str(options, "file");

    if (filename || file_reference || qdict_size(file_options)) {
        ret = bdrv_file_open(&file, filename, file_reference, file_options,
                         bdrv_open_flags(bs, flags | BDRV_O_UNMAP), &local_err);
                             bdrv_open_flags(bs, flags | BDRV_O_UNMAP),
                             &local_err);
        qdict_del(options, "file");
        if (ret < 0) {
            goto fail;
        }
    }

    /* Find the right image format driver */
    drvname = qdict_get_try_str(options, "driver");
@@ -1165,7 +1168,13 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
    }

    if (!drv) {
        if (file) {
            ret = find_image_format(file, filename, &drv, &local_err);
        } else {
            error_setg(errp, "Must specify either driver or file");
            ret = -EINVAL;
            goto unlink_and_fail;
        }
    }

    if (!drv) {
@@ -1178,7 +1187,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
        goto unlink_and_fail;
    }

    if (bs->file != file) {
    if (file && (bs->file != file)) {
        bdrv_unref(file);
        file = NULL;
    }