blockdev: Remove IF_* check for read-only blockdev_init
IF_NONE allows read-only, which makes forbidding it in this place for other types pretty much pointless. Instead, make sure that all devices for which the check would have errored out check in their init function that they don't get a read-only BlockDriverState. This catches even cases where IF_NONE and -device is used. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
394c7d4d6b
commit
4f8a066b5f
@ -528,12 +528,6 @@ static DriveInfo *blockdev_init(QDict *bs_opts,
|
||||
if (media == MEDIA_CDROM) {
|
||||
/* CDROM is fine for any interface, don't check. */
|
||||
ro = 1;
|
||||
} else if (ro == 1) {
|
||||
if (type != IF_SCSI && type != IF_VIRTIO && type != IF_FLOPPY &&
|
||||
type != IF_NONE && type != IF_PFLASH) {
|
||||
error_report("read-only not supported by this bus type");
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
bdrv_flags |= ro ? 0 : BDRV_O_RDWR;
|
||||
|
@ -624,6 +624,11 @@ static int m25p80_init(SSISlave *ss)
|
||||
if (dinfo && dinfo->bdrv) {
|
||||
DB_PRINT_L(0, "Binding to IF_MTD drive\n");
|
||||
s->bdrv = dinfo->bdrv;
|
||||
if (bdrv_is_read_only(s->bdrv)) {
|
||||
fprintf(stderr, "Can't use a read-only drive");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* FIXME: Move to late init */
|
||||
if (bdrv_read(s->bdrv, 0, s->storage, DIV_ROUND_UP(s->size,
|
||||
BDRV_SECTOR_SIZE))) {
|
||||
|
@ -830,6 +830,11 @@ static int blk_connect(struct XenDevice *xendev)
|
||||
/* setup via qemu cmdline -> already setup for us */
|
||||
xen_be_printf(&blkdev->xendev, 2, "get configured bdrv (cmdline setup)\n");
|
||||
blkdev->bs = blkdev->dinfo->bdrv;
|
||||
if (bdrv_is_read_only(blkdev->bs) && !readonly) {
|
||||
xen_be_printf(&blkdev->xendev, 0, "Unexpected read-only drive");
|
||||
blkdev->bs = NULL;
|
||||
return -1;
|
||||
}
|
||||
/* blkdev->bs is not create by us, we get a reference
|
||||
* so we can bdrv_unref() unconditionally */
|
||||
bdrv_ref(blkdev->bs);
|
||||
|
@ -255,6 +255,10 @@ static int milkymist_memcard_init(SysBusDevice *dev)
|
||||
|
||||
dinfo = drive_get_next(IF_SD);
|
||||
s->card = sd_init(dinfo ? dinfo->bdrv : NULL, false);
|
||||
if (s->card == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
s->enabled = dinfo ? bdrv_is_inserted(dinfo->bdrv) : 0;
|
||||
|
||||
memory_region_init_io(&s->regs_region, OBJECT(s), &memcard_mmio_ops, s,
|
||||
|
@ -593,6 +593,9 @@ struct omap_mmc_s *omap_mmc_init(hwaddr base,
|
||||
|
||||
/* Instantiate the storage */
|
||||
s->card = sd_init(bd, false);
|
||||
if (s->card == NULL) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
@ -618,6 +621,9 @@ struct omap_mmc_s *omap2_mmc_init(struct omap_target_agent_s *ta,
|
||||
|
||||
/* Instantiate the storage */
|
||||
s->card = sd_init(bd, false);
|
||||
if (s->card == NULL) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
s->cdet = qemu_allocate_irqs(omap_mmc_cover_cb, s, 1)[0];
|
||||
sd_set_cb(s->card, NULL, s->cdet);
|
||||
|
@ -491,6 +491,10 @@ static int pl181_init(SysBusDevice *sbd)
|
||||
qdev_init_gpio_out(dev, s->cardstatus, 2);
|
||||
dinfo = drive_get_next(IF_SD);
|
||||
s->card = sd_init(dinfo ? dinfo->bdrv : NULL, false);
|
||||
if (s->card == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -539,6 +539,9 @@ PXA2xxMMCIState *pxa2xx_mmci_init(MemoryRegion *sysmem,
|
||||
|
||||
/* Instantiate the actual storage */
|
||||
s->card = sd_init(bd, false);
|
||||
if (s->card == NULL) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
register_savevm(NULL, "pxa2xx_mmci", 0, 0,
|
||||
pxa2xx_mmci_save, pxa2xx_mmci_load, s);
|
||||
|
@ -494,6 +494,11 @@ SDState *sd_init(BlockDriverState *bs, bool is_spi)
|
||||
{
|
||||
SDState *sd;
|
||||
|
||||
if (bdrv_is_read_only(bs)) {
|
||||
fprintf(stderr, "sd_init: Cannot use read-only drive\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sd = (SDState *) g_malloc0(sizeof(SDState));
|
||||
sd->buf = qemu_blockalign(bs, 512);
|
||||
sd->spi = is_spi;
|
||||
|
@ -1166,6 +1166,9 @@ static void sdhci_initfn(Object *obj)
|
||||
|
||||
di = drive_get_next(IF_SD);
|
||||
s->card = sd_init(di ? di->bdrv : NULL, false);
|
||||
if (s->card == NULL) {
|
||||
exit(1);
|
||||
}
|
||||
s->eject_cb = qemu_allocate_irqs(sdhci_insert_eject_cb, s, 1)[0];
|
||||
s->ro_cb = qemu_allocate_irqs(sdhci_card_readonly_cb, s, 1)[0];
|
||||
sd_set_cb(s->card, s->ro_cb, s->eject_cb);
|
||||
|
@ -246,6 +246,9 @@ static int ssi_sd_init(SSISlave *dev)
|
||||
s->mode = SSI_SD_CMD;
|
||||
dinfo = drive_get_next(IF_SD);
|
||||
s->sd = sd_init(dinfo ? dinfo->bdrv : NULL, true);
|
||||
if (s->sd == NULL) {
|
||||
return -1;
|
||||
}
|
||||
register_savevm(&dev->qdev, "ssi_sd", -1, 1, ssi_sd_save, ssi_sd_load, s);
|
||||
return 0;
|
||||
}
|
||||
|
@ -139,7 +139,10 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
|
||||
|
||||
Testing: -drive file=TEST_DIR/t.qcow2,if=ide,readonly=on
|
||||
QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=ide,readonly=on: read-only not supported by this bus type
|
||||
QEMU X.Y.Z monitor - type 'help' for more information
|
||||
(qemu) QEMU_PROG: Can't use a read-only drive
|
||||
QEMU_PROG: Device initialization failed.
|
||||
QEMU_PROG: Initialization of device ide-hd failed
|
||||
|
||||
Testing: -drive file=TEST_DIR/t.qcow2,if=virtio,readonly=on
|
||||
QEMU X.Y.Z monitor - type 'help' for more information
|
||||
|
Loading…
Reference in New Issue
Block a user