Revision ddf5636d

b/block.c
1046 1046
    }
1047 1047

  
1048 1048
    if (!drv->bdrv_file_open) {
1049
        ret = bdrv_open(&bs, filename, options, flags, drv, &local_err);
1049
        ret = bdrv_open(&bs, filename, NULL, options, flags, drv, &local_err);
1050 1050
        options = NULL;
1051 1051
    } else {
1052 1052
        ret = bdrv_open_common(bs, NULL, options, flags, drv, &local_err);
......
1125 1125

  
1126 1126
    assert(bs->backing_hd == NULL);
1127 1127
    ret = bdrv_open(&bs->backing_hd,
1128
                    *backing_filename ? backing_filename : NULL, options,
1128
                    *backing_filename ? backing_filename : NULL, NULL, options,
1129 1129
                    back_flags, back_drv, &local_err);
1130 1130
    if (ret < 0) {
1131 1131
        bs->backing_hd = NULL;
......
1206 1206
            goto done;
1207 1207
        }
1208 1208

  
1209
        ret = bdrv_open(pbs, filename, image_options, flags, NULL, errp);
1209
        ret = bdrv_open(pbs, filename, NULL, image_options, flags, NULL, errp);
1210 1210
    } else {
1211 1211
        ret = bdrv_file_open(pbs, filename, reference, image_options, flags,
1212 1212
                             errp);
......
1227 1227
 *
1228 1228
 * If *pbs is NULL, a new BDS will be created with a pointer to it stored there.
1229 1229
 * If it is not NULL, the referenced BDS will be reused.
1230
 *
1231
 * The reference parameter may be used to specify an existing block device which
1232
 * should be opened. If specified, neither options nor a filename may be given,
1233
 * nor can an existing BDS be reused (that is, *pbs has to be NULL).
1230 1234
 */
1231
int bdrv_open(BlockDriverState **pbs, const char *filename, QDict *options,
1232
              int flags, BlockDriver *drv, Error **errp)
1235
int bdrv_open(BlockDriverState **pbs, const char *filename,
1236
              const char *reference, QDict *options, int flags,
1237
              BlockDriver *drv, Error **errp)
1233 1238
{
1234 1239
    int ret;
1235 1240
    /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
......
1240 1245

  
1241 1246
    assert(pbs);
1242 1247

  
1248
    if (reference) {
1249
        bool options_non_empty = options ? qdict_size(options) : false;
1250
        QDECREF(options);
1251

  
1252
        if (*pbs) {
1253
            error_setg(errp, "Cannot reuse an existing BDS when referencing "
1254
                       "another block device");
1255
            return -EINVAL;
1256
        }
1257

  
1258
        if (filename || options_non_empty) {
1259
            error_setg(errp, "Cannot reference an existing block device with "
1260
                       "additional options or a new filename");
1261
            return -EINVAL;
1262
        }
1263

  
1264
        bs = bdrv_lookup_bs(reference, reference, errp);
1265
        if (!bs) {
1266
            return -ENODEV;
1267
        }
1268
        bdrv_ref(bs);
1269
        *pbs = bs;
1270
        return 0;
1271
    }
1272

  
1243 1273
    if (*pbs) {
1244 1274
        bs = *pbs;
1245 1275
    } else {
......
1268 1298
        /* Get the required size from the image */
1269 1299
        QINCREF(options);
1270 1300
        bs1 = NULL;
1271
        ret = bdrv_open(&bs1, filename, options, BDRV_O_NO_BACKING,
1301
        ret = bdrv_open(&bs1, filename, NULL, options, BDRV_O_NO_BACKING,
1272 1302
                        drv, &local_err);
1273 1303
        if (ret < 0) {
1274 1304
            goto fail;
......
5309 5339
                flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
5310 5340

  
5311 5341
            bs = NULL;
5312
            ret = bdrv_open(&bs, backing_file->value.s, NULL, back_flags,
5342
            ret = bdrv_open(&bs, backing_file->value.s, NULL, NULL, back_flags,
5313 5343
                            backing_drv, &local_err);
5314 5344
            if (ret < 0) {
5315 5345
                error_setg_errno(errp, -ret, "Could not open '%s': %s",
b/block/qcow2.c
1553 1553
     */
1554 1554
    BlockDriver* drv = bdrv_find_format("qcow2");
1555 1555
    assert(drv != NULL);
1556
    ret = bdrv_open(&bs, filename, NULL,
1556
    ret = bdrv_open(&bs, filename, NULL, NULL,
1557 1557
        BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH, drv, &local_err);
1558 1558
    if (ret < 0) {
1559 1559
        error_propagate(errp, local_err);
......
1604 1604
    bs = NULL;
1605 1605

  
1606 1606
    /* Reopen the image without BDRV_O_NO_FLUSH to flush it before returning */
1607
    ret = bdrv_open(&bs, filename, NULL,
1607
    ret = bdrv_open(&bs, filename, NULL, NULL,
1608 1608
                    BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_BACKING,
1609 1609
                    drv, &local_err);
1610 1610
    if (local_err) {
b/block/vmdk.c
1756 1756
    }
1757 1757
    if (backing_file) {
1758 1758
        BlockDriverState *bs = NULL;
1759
        ret = bdrv_open(&bs, backing_file, NULL, BDRV_O_NO_BACKING, NULL, errp);
1759
        ret = bdrv_open(&bs, backing_file, NULL, NULL, BDRV_O_NO_BACKING, NULL,
1760
                        errp);
1760 1761
        if (ret != 0) {
1761 1762
            goto exit;
1762 1763
        }
b/block/vvfat.c
2937 2937
    }
2938 2938

  
2939 2939
    s->qcow = NULL;
2940
    ret = bdrv_open(&s->qcow, s->qcow_filename, NULL,
2940
    ret = bdrv_open(&s->qcow, s->qcow_filename, NULL, NULL,
2941 2941
            BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH, bdrv_qcow,
2942 2942
            &local_err);
2943 2943
    if (ret < 0) {
b/blockdev.c
504 504
    bdrv_flags |= ro ? 0 : BDRV_O_RDWR;
505 505

  
506 506
    QINCREF(bs_opts);
507
    ret = bdrv_open(&dinfo->bdrv, file, bs_opts, bdrv_flags, drv, &error);
507
    ret = bdrv_open(&dinfo->bdrv, file, NULL, bs_opts, bdrv_flags, drv, &error);
508 508

  
509 509
    if (ret < 0) {
510 510
        error_setg(errp, "could not open disk image %s: %s",
......
1333 1333
    /* TODO Inherit bs->options or only take explicit options with an
1334 1334
     * extended QMP command? */
1335 1335
    assert(state->new_bs == NULL);
1336
    ret = bdrv_open(&state->new_bs, new_image_file, options,
1336
    ret = bdrv_open(&state->new_bs, new_image_file, NULL, options,
1337 1337
                    flags | BDRV_O_NO_BACKING, drv, &local_err);
1338 1338
    /* We will manually add the backing_hd field to the bs later */
1339 1339
    if (ret != 0) {
......
1582 1582
    Error *local_err = NULL;
1583 1583
    int ret;
1584 1584

  
1585
    ret = bdrv_open(&bs, filename, NULL, bdrv_flags, drv, &local_err);
1585
    ret = bdrv_open(&bs, filename, NULL, NULL, bdrv_flags, drv, &local_err);
1586 1586
    if (ret < 0) {
1587 1587
        error_propagate(errp, local_err);
1588 1588
        return;
......
2019 2019
    }
2020 2020

  
2021 2021
    target_bs = NULL;
2022
    ret = bdrv_open(&target_bs, target, NULL, flags, drv, &local_err);
2022
    ret = bdrv_open(&target_bs, target, NULL, NULL, flags, drv, &local_err);
2023 2023
    if (ret < 0) {
2024 2024
        error_propagate(errp, local_err);
2025 2025
        return;
......
2162 2162
     * file.
2163 2163
     */
2164 2164
    target_bs = NULL;
2165
    ret = bdrv_open(&target_bs, target, NULL, flags | BDRV_O_NO_BACKING, drv,
2166
                    &local_err);
2165
    ret = bdrv_open(&target_bs, target, NULL, NULL, flags | BDRV_O_NO_BACKING,
2166
                    drv, &local_err);
2167 2167
    if (ret < 0) {
2168 2168
        error_propagate(errp, local_err);
2169 2169
        return;
b/hw/block/xen_disk.c
813 813
            Error *local_err = NULL;
814 814
            BlockDriver *drv = bdrv_find_whitelisted_format(blkdev->fileproto,
815 815
                                                           readonly);
816
            if (bdrv_open(&blkdev->bs,
817
                          blkdev->filename, NULL, qflags, drv, &local_err) != 0)
816
            if (bdrv_open(&blkdev->bs, blkdev->filename, NULL, NULL, qflags,
817
                          drv, &local_err) != 0)
818 818
            {
819 819
                xen_be_printf(&blkdev->xendev, 0, "error: %s\n",
820 820
                              error_get_pretty(local_err));
b/include/block/block.h
190 190
                    QDict *options, const char *bdref_key, int flags,
191 191
                    bool force_raw, bool allow_none, Error **errp);
192 192
int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp);
193
int bdrv_open(BlockDriverState **pbs, const char *filename, QDict *options,
194
              int flags, BlockDriver *drv, Error **errp);
193
int bdrv_open(BlockDriverState **pbs, const char *filename,
194
              const char *reference, QDict *options, int flags,
195
              BlockDriver *drv, Error **errp);
195 196
BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
196 197
                                    BlockDriverState *bs, int flags);
197 198
int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp);
b/qemu-img.c
289 289
        drv = NULL;
290 290
    }
291 291

  
292
    ret = bdrv_open(&bs, filename, NULL, flags, drv, &local_err);
292
    ret = bdrv_open(&bs, filename, NULL, NULL, flags, drv, &local_err);
293 293
    if (ret < 0) {
294 294
        error_report("Could not open '%s': %s", filename,
295 295
                     error_get_pretty(local_err));
......
2312 2312

  
2313 2313
        bs_old_backing = bdrv_new("old_backing");
2314 2314
        bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
2315
        ret = bdrv_open(&bs_old_backing, backing_name, NULL, BDRV_O_FLAGS,
2315
        ret = bdrv_open(&bs_old_backing, backing_name, NULL, NULL, BDRV_O_FLAGS,
2316 2316
                        old_backing_drv, &local_err);
2317 2317
        if (ret) {
2318 2318
            error_report("Could not open old backing file '%s': %s",
......
2322 2322
        }
2323 2323
        if (out_baseimg[0]) {
2324 2324
            bs_new_backing = bdrv_new("new_backing");
2325
            ret = bdrv_open(&bs_new_backing, out_baseimg, NULL, BDRV_O_FLAGS,
2326
                        new_backing_drv, &local_err);
2325
            ret = bdrv_open(&bs_new_backing, out_baseimg, NULL, NULL,
2326
                            BDRV_O_FLAGS, new_backing_drv, &local_err);
2327 2327
            if (ret) {
2328 2328
                error_report("Could not open new backing file '%s': %s",
2329 2329
                             out_baseimg, error_get_pretty(local_err));
b/qemu-io.c
68 68
    } else {
69 69
        qemuio_bs = bdrv_new("hda");
70 70

  
71
        if (bdrv_open(&qemuio_bs, name, opts, flags, NULL, &local_err) < 0) {
71
        if (bdrv_open(&qemuio_bs, name, NULL, opts, flags, NULL, &local_err)
72
            < 0)
73
        {
72 74
            fprintf(stderr, "%s: can't open device %s: %s\n", progname, name,
73 75
                    error_get_pretty(local_err));
74 76
            error_free(local_err);
b/qemu-nbd.c
597 597

  
598 598
    bs = bdrv_new("hda");
599 599
    srcpath = argv[optind];
600
    ret = bdrv_open(&bs, srcpath, NULL, flags, drv, &local_err);
600
    ret = bdrv_open(&bs, srcpath, NULL, NULL, flags, drv, &local_err);
601 601
    if (ret < 0) {
602 602
        errno = -ret;
603 603
        err(EXIT_FAILURE, "Failed to bdrv_open '%s': %s", argv[optind],

Also available in: Unified diff