Am 11.10.2013 17:05, schrieb Kevin Wolf: > 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 <kw...@redhat.com> > Reviewed-by: Eric Blake <ebl...@redhat.com> > --- >
This patch breaks current QEMU (SIGSEGV with ARM in several test scenarios): $ git bisect bad 4f8a066b5fc254eeaabbbde56ba4f5b29cc68fdf is the first bad commit commit 4f8a066b5fc254eeaabbbde56ba4f5b29cc68fdf Author: Kevin Wolf <kw...@redhat.com> Date: Fri Sep 13 15:51:47 2013 +0200 blockdev: Remove IF_* check for read-only blockdev_init [...] See the gdb protocol below for more details (Linux x86_64 host, default configuration). I got a bug report from a Windows user, but the crash is not OS specific. Regards, Stefan (gdb) r Starting program: bin/arm-softmmu/qemu-system-arm -M versatilepb -L pc-bios -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile -sd debian_squeeze_armel_standard.qcow2 -append root=/dev/sda1 [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Breakpoint 5, pl181_init (sbd=0x5555565d3020) at hw/sd/pl181.c:482 482 { (gdb) i s #0 pl181_init (sbd=0x5555565d3020) at hw/sd/pl181.c:482 #1 0x00005555556d10e8 in sysbus_device_init (dev=0x5555565d3020) at hw/core/sysbus.c:143 #2 0x00005555556ce6d3 in device_realize (dev=0x5555565d3020, err=0x7fffffffdb08) at hw/core/qdev.c:178 #3 0x00005555556d002a in device_set_realized (obj=0x5555565d3020, value=true, err=0x7fffffffdc80) at hw/core/qdev.c:699 #4 0x0000555555849520 in property_set_bool (obj=0x5555565d3020, v=0x5555565d54d0, opaque=0x5555565ca870, name=0x555555a3c186 "realized", errp=0x7fffffffdc80) at qom/object.c:1315 #5 0x0000555555848065 in object_property_set (obj=0x5555565d3020, v=0x5555565d54d0, name=0x555555a3c186 "realized", errp=0x7fffffffdc80) at qom/object.c:803 #6 0x00005555558497ca in object_property_set_qobject (obj=0x5555565d3020, value=0x5555565adc20, name=0x555555a3c186 "realized", errp=0x7fffffffdc80) at qom/qom-qobject.c:24 #7 0x0000555555848351 in object_property_set_bool (obj=0x5555565d3020, value=true, name=0x555555a3c186 "realized", errp=0x7fffffffdc80) at qom/object.c:866 #8 0x00005555556ce60f in qdev_init (dev=0x5555565d3020) at hw/core/qdev.c:163 #9 0x00005555556ceb8e in qdev_init_nofail (dev=0x5555565d3020) at hw/core/qdev.c:277 #10 0x00005555556d11c3 in sysbus_create_varargs (name=0x555555a87f74 "pl181", addr=268455936) at hw/core/sysbus.c:157 #11 0x0000555555901572 in versatile_init (args=0x7fffffffe2d0, board_id=387) at hw/arm/versatilepb.c:284 #12 0x0000555555901835 in vpb_init (args=0x7fffffffe2d0) at hw/arm/versatilepb.c:357 #13 0x000055555589a38b in main (argc=13, argv=0x7fffffffe508, envp=0x7fffffffe578) at vl.c:4245 (gdb) c Continuing. Breakpoint 5, pl181_init (sbd=0x5555565deda0) at hw/sd/pl181.c:482 482 { (gdb) Continuing. Program received signal SIGSEGV, Segmentation fault. 0x000055555560b25f in bdrv_is_read_only (bs=0x0) at block.c:2933 2933 return bs->read_only; (gdb) i s #0 0x000055555560b25f in bdrv_is_read_only (bs=0x0) at block.c:2933 #1 0x0000555555794220 in sd_init (bs=0x0, is_spi=false) at hw/sd/sd.c:497 #2 0x000055555579316e in pl181_init (sbd=0x5555565deda0) at hw/sd/pl181.c:493 #3 0x00005555556d10e8 in sysbus_device_init (dev=0x5555565deda0) at hw/core/sysbus.c:143 #4 0x00005555556ce6d3 in device_realize (dev=0x5555565deda0, err=0x7fffffffdb08) at hw/core/qdev.c:178 #5 0x00005555556d002a in device_set_realized (obj=0x5555565deda0, value=true, err=0x7fffffffdc80) at hw/core/qdev.c:699 #6 0x0000555555849520 in property_set_bool (obj=0x5555565deda0, v=0x5555565e1250, opaque=0x5555565ca500, name=0x555555a3c186 "realized", errp=0x7fffffffdc80) at qom/object.c:1315 #7 0x0000555555848065 in object_property_set (obj=0x5555565deda0, v=0x5555565e1250, name=0x555555a3c186 "realized", errp=0x7fffffffdc80) at qom/object.c:803 #8 0x00005555558497ca in object_property_set_qobject (obj=0x5555565deda0, value=0x5555565ca5f0, name=0x555555a3c186 "realized", errp=0x7fffffffdc80) at qom/qom-qobject.c:24 #9 0x0000555555848351 in object_property_set_bool (obj=0x5555565deda0, value=true, name=0x555555a3c186 "realized", errp=0x7fffffffdc80) at qom/object.c:866 #10 0x00005555556ce60f in qdev_init (dev=0x5555565deda0) at hw/core/qdev.c:163 #11 0x00005555556ceb8e in qdev_init_nofail (dev=0x5555565deda0) at hw/core/qdev.c:277 #12 0x00005555556d11c3 in sysbus_create_varargs (name=0x555555a87f74 "pl181", addr=268480512) at hw/core/sysbus.c:157 #13 0x000055555590159f in versatile_init (args=0x7fffffffe2d0, board_id=387) at hw/arm/versatilepb.c:285 #14 0x0000555555901835 in vpb_init (args=0x7fffffffe2d0) at hw/arm/versatilepb.c:357 #15 0x000055555589a38b in main (argc=13, argv=0x7fffffffe508, envp=0x7fffffffe578) at vl.c:4245