diff --git a/block/copy-on-read.c b/block/copy-on-read.c index 22f24fd0db..6631f30205 100644 --- a/block/copy-on-read.c +++ b/block/copy-on-read.c @@ -56,16 +56,14 @@ static void cor_child_perm(BlockDriverState *bs, BdrvChild *c, uint64_t perm, uint64_t shared, uint64_t *nperm, uint64_t *nshared) { - if (c == NULL) { - *nperm = (perm & PERM_PASSTHROUGH) | BLK_PERM_WRITE_UNCHANGED; - *nshared = (shared & PERM_PASSTHROUGH) | PERM_UNCHANGED; - return; - } + *nperm = perm & PERM_PASSTHROUGH; + *nshared = (shared & PERM_PASSTHROUGH) | PERM_UNCHANGED; - *nperm = (perm & PERM_PASSTHROUGH) | - (c->perm & PERM_UNCHANGED); - *nshared = (shared & PERM_PASSTHROUGH) | - (c->shared_perm & PERM_UNCHANGED); + /* We must not request write permissions for an inactive node, the child + * cannot provide it. */ + if (!(bs->open_flags & BDRV_O_INACTIVE)) { + *nperm |= BLK_PERM_WRITE_UNCHANGED; + } } diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 8e95e3e38d..af3e622dc5 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -2318,6 +2318,7 @@ static void scsi_disk_unit_attention_reported(SCSIDevice *dev) static void scsi_realize(SCSIDevice *dev, Error **errp) { SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); + bool read_only; if (!s->qdev.conf.blk) { error_setg(errp, "drive property not set"); @@ -2351,8 +2352,13 @@ static void scsi_realize(SCSIDevice *dev, Error **errp) return; } } - if (!blkconf_apply_backend_options(&dev->conf, - blk_is_read_only(s->qdev.conf.blk), + + read_only = blk_is_read_only(s->qdev.conf.blk); + if (dev->type == TYPE_ROM) { + read_only = true; + } + + if (!blkconf_apply_backend_options(&dev->conf, read_only, dev->type == TYPE_DISK, errp)) { return; } diff --git a/tests/multiboot/link.ld b/tests/multiboot/link.ld index 3d49b58c60..2eafcffc4f 100644 --- a/tests/multiboot/link.ld +++ b/tests/multiboot/link.ld @@ -3,14 +3,14 @@ ENTRY(_start) SECTIONS { . = 0x100000; - .text : { + .text : AT(ADDR(.text)) { *(multiboot) *(.text) } - .data ALIGN(4096) : { + .data ALIGN(4096) : AT(ADDR(.data)) { *(.data) } - .rodata ALIGN(4096) : { + .rodata ALIGN(4096) : AT(ADDR(.rodata)) { *(.rodata) } .bss ALIGN(4096) : { diff --git a/tests/qemu-iotests/051.out b/tests/qemu-iotests/051.out index 8993835b94..554c5ca90a 100644 --- a/tests/qemu-iotests/051.out +++ b/tests/qemu-iotests/051.out @@ -149,23 +149,23 @@ QEMU X.Y.Z monitor - type 'help' for more information === Cache modes === -Testing: -drive driver=null-co,cache=none +Testing: -drive driver=null-co,read-zeroes=on,cache=none QEMU X.Y.Z monitor - type 'help' for more information (qemu) quit -Testing: -drive driver=null-co,cache=directsync +Testing: -drive driver=null-co,read-zeroes=on,cache=directsync QEMU X.Y.Z monitor - type 'help' for more information (qemu) quit -Testing: -drive driver=null-co,cache=writeback +Testing: -drive driver=null-co,read-zeroes=on,cache=writeback QEMU X.Y.Z monitor - type 'help' for more information (qemu) quit -Testing: -drive driver=null-co,cache=writethrough +Testing: -drive driver=null-co,read-zeroes=on,cache=writethrough QEMU X.Y.Z monitor - type 'help' for more information (qemu) quit -Testing: -drive driver=null-co,cache=unsafe +Testing: -drive driver=null-co,read-zeroes=on,cache=unsafe QEMU X.Y.Z monitor - type 'help' for more information (qemu) quit