Revision 18846dee

b/block.c
665 665

  
666 666
void bdrv_delete(BlockDriverState *bs)
667 667
{
668
    assert(!bs->peer);
669

  
668 670
    /* remove from list, if necessary */
669 671
    if (bs->device_name[0] != '\0') {
670 672
        QTAILQ_REMOVE(&bdrv_states, bs, list);
......
678 680
    qemu_free(bs);
679 681
}
680 682

  
683
int bdrv_attach(BlockDriverState *bs, DeviceState *qdev)
684
{
685
    if (bs->peer) {
686
        return -EBUSY;
687
    }
688
    bs->peer = qdev;
689
    return 0;
690
}
691

  
692
void bdrv_detach(BlockDriverState *bs, DeviceState *qdev)
693
{
694
    assert(bs->peer == qdev);
695
    bs->peer = NULL;
696
}
697

  
698
DeviceState *bdrv_get_attached(BlockDriverState *bs)
699
{
700
    return bs->peer;
701
}
702

  
681 703
/*
682 704
 * Run consistency checks on an image
683 705
 *
b/block.h
71 71
int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
72 72
              BlockDriver *drv);
73 73
void bdrv_close(BlockDriverState *bs);
74
int bdrv_attach(BlockDriverState *bs, DeviceState *qdev);
75
void bdrv_detach(BlockDriverState *bs, DeviceState *qdev);
76
DeviceState *bdrv_get_attached(BlockDriverState *bs);
74 77
int bdrv_check(BlockDriverState *bs);
75 78
int bdrv_read(BlockDriverState *bs, int64_t sector_num,
76 79
              uint8_t *buf, int nb_sectors);
b/block_int.h
148 148
    BlockDriver *drv; /* NULL means no media */
149 149
    void *opaque;
150 150

  
151
    DeviceState *peer;
152

  
151 153
    char filename[1024];
152 154
    char backing_file[1024]; /* if non zero, the image is a diff of
153 155
                                this file image */
b/hw/fdc.c
1860 1860

  
1861 1861
    dev = isa_create("isa-fdc");
1862 1862
    if (fds[0]) {
1863
        qdev_prop_set_drive(&dev->qdev, "driveA", fds[0]->bdrv);
1863
        qdev_prop_set_drive_nofail(&dev->qdev, "driveA", fds[0]->bdrv);
1864 1864
    }
1865 1865
    if (fds[1]) {
1866
        qdev_prop_set_drive(&dev->qdev, "driveB", fds[1]->bdrv);
1866
        qdev_prop_set_drive_nofail(&dev->qdev, "driveB", fds[1]->bdrv);
1867 1867
    }
1868 1868
    if (qdev_init(&dev->qdev) < 0)
1869 1869
        return NULL;
......
1882 1882
    fdctrl = &sys->state;
1883 1883
    fdctrl->dma_chann = dma_chann; /* FIXME */
1884 1884
    if (fds[0]) {
1885
        qdev_prop_set_drive(dev, "driveA", fds[0]->bdrv);
1885
        qdev_prop_set_drive_nofail(dev, "driveA", fds[0]->bdrv);
1886 1886
    }
1887 1887
    if (fds[1]) {
1888
        qdev_prop_set_drive(dev, "driveB", fds[1]->bdrv);
1888
        qdev_prop_set_drive_nofail(dev, "driveB", fds[1]->bdrv);
1889 1889
    }
1890 1890
    qdev_init_nofail(dev);
1891 1891
    sysbus_connect_irq(&sys->busdev, 0, irq);
......
1903 1903

  
1904 1904
    dev = qdev_create(NULL, "SUNW,fdtwo");
1905 1905
    if (fds[0]) {
1906
        qdev_prop_set_drive(dev, "drive", fds[0]->bdrv);
1906
        qdev_prop_set_drive_nofail(dev, "drive", fds[0]->bdrv);
1907 1907
    }
1908 1908
    qdev_init_nofail(dev);
1909 1909
    sys = DO_UPCAST(FDCtrlSysBus, busdev.qdev, dev);
b/hw/ide/qdev.c
83 83

  
84 84
    dev = qdev_create(&bus->qbus, "ide-drive");
85 85
    qdev_prop_set_uint32(dev, "unit", unit);
86
    qdev_prop_set_drive(dev, "drive", drive->bdrv);
86
    qdev_prop_set_drive_nofail(dev, "drive", drive->bdrv);
87 87
    qdev_init_nofail(dev);
88 88
    return DO_UPCAST(IDEDevice, qdev, dev);
89 89
}
b/hw/pci-hotplug.c
214 214
            return NULL;
215 215
        }
216 216
        dev = pci_create(bus, devfn, "virtio-blk-pci");
217
        qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv);
217
        if (qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv) < 0) {
218
            qdev_free(&dev->qdev);
219
            dev = NULL;
220
            break;
221
        }
218 222
        if (qdev_init(&dev->qdev) < 0)
219 223
            dev = NULL;
220 224
        break;
b/hw/qdev-properties.c
311 311
    bs = bdrv_find(str);
312 312
    if (bs == NULL)
313 313
        return -ENOENT;
314
    if (bdrv_attach(bs, dev) < 0)
315
        return -EEXIST;
314 316
    *ptr = bs;
315 317
    return 0;
316 318
}
......
320 322
    BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
321 323

  
322 324
    if (*ptr) {
325
        bdrv_detach(*ptr, dev);
323 326
        blockdev_auto_del(*ptr);
324 327
    }
325 328
}
......
660 663
    qdev_prop_set(dev, name, &value, PROP_TYPE_STRING);
661 664
}
662 665

  
663
void qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value)
666
int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value)
664 667
{
668
    int res;
669

  
670
    res = bdrv_attach(value, dev);
671
    if (res < 0) {
672
        error_report("Can't attach drive %s to %s.%s: %s",
673
                     bdrv_get_device_name(value),
674
                     dev->id ? dev->id : dev->info->name,
675
                     name, strerror(-res));
676
        return -1;
677
    }
665 678
    qdev_prop_set(dev, name, &value, PROP_TYPE_DRIVE);
679
    return 0;
666 680
}
667 681

  
682
void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name, BlockDriverState *value)
683
{
684
    if (qdev_prop_set_drive(dev, name, value) < 0) {
685
        exit(1);
686
    }
687
}
668 688
void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value)
669 689
{
670 690
    qdev_prop_set(dev, name, &value, PROP_TYPE_CHR);
b/hw/qdev.h
275 275
void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value);
276 276
void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value);
277 277
void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value);
278
void qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value);
278
int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value) QEMU_WARN_UNUSED_RESULT;
279
void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name, BlockDriverState *value);
279 280
void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value);
280 281
/* FIXME: Remove opaque pointer properties.  */
281 282
void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value);
b/hw/s390-virtio.c
262 262
        }
263 263

  
264 264
        dev = qdev_create((BusState *)s390_bus, "virtio-blk-s390");
265
        qdev_prop_set_drive(dev, "drive", dinfo->bdrv);
265
        qdev_prop_set_drive_nofail(dev, "drive", dinfo->bdrv);
266 266
        qdev_init_nofail(dev);
267 267
    }
268 268
}
b/hw/scsi-bus.c
91 91
    driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk";
92 92
    dev = qdev_create(&bus->qbus, driver);
93 93
    qdev_prop_set_uint32(dev, "scsi-id", unit);
94
    qdev_prop_set_drive(dev, "drive", bdrv);
94
    if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) {
95
        qdev_free(dev);
96
        return NULL;
97
    }
95 98
    if (qdev_init(dev) < 0)
96 99
        return NULL;
97 100
    return DO_UPCAST(SCSIDevice, qdev, dev);
b/hw/usb-msd.c
532 532
    /*
533 533
     * Hack alert: this pretends to be a block device, but it's really
534 534
     * a SCSI bus that can serve only a single device, which it
535
     * creates automatically.  Two drive properties pointing to the
536
     * same drive is not good: free_drive() dies for the second one.
537
     * Zap the one we're not going to use.
535
     * creates automatically.  But first it needs to detach from its
536
     * blockdev, or else scsi_bus_legacy_add_drive() dies when it
537
     * attaches again.
538 538
     *
539 539
     * The hack is probably a bad idea.
540 540
     */
541
    bdrv_detach(bs, &s->dev.qdev);
541 542
    s->conf.bs = NULL;
542 543

  
543 544
    s->dev.speed = USB_SPEED_FULL;
......
609 610
    if (!dev) {
610 611
        return NULL;
611 612
    }
612
    qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv);
613
    if (qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv) < 0) {
614
        qdev_free(&dev->qdev);
615
        return NULL;
616
    }
613 617
    if (qdev_init(&dev->qdev) < 0)
614 618
        return NULL;
615 619

  

Also available in: Unified diff