Revision 18846dee hw/qdev-properties.c

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);

Also available in: Unified diff