Kevin Wolf <kw...@redhat.com> writes: > Any non-default -drive options are now passed down to the block drivers. > > Signed-off-by: Kevin Wolf <kw...@redhat.com> > Reviewed-by: Eric Blake <ebl...@redhat.com> > Reviewed-by: Stefan Hajnoczi <stefa...@redhat.com>
According to git-bisect, this breaks virtio-blk serial property. Here's the output from qemu-test: Using RANDOM seed 26105 Formatting '.tmp-32392/disk.img', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off /home/aliguori/build/qemu/x86_64-softmmu/qemu-system-x86_64 -kernel /usr/local/share/qemu-jeos/kernel-x86_64-pc -initrd .tmp-32392/initramfs-32392.img.gz -device isa-debug-exit -append console=ttyS0 seed=26105 -nographic -enable-kvm -drive file=.tmp-32392/disk.img,if=none,id=drive-virtio-disk0,format=raw,cache=none,serial=0123456789abcdefghi -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 -pidfile .tmp-32392/pidfile-32392.pid -qmp unix:.tmp-32392/qmpsock-32392.sock,server,nowait [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 3.4.0 (root@ccnode4) (gcc version 4.6.4 20120830 (prerelease) (GCC) ) #2 SMP Mon Dec 3 19:40:41 CST 2012 [ 0.000000] Command line: console=ttyS0 seed=26105 [ 0.000000] BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: 0000000000000000 - 000000000009fc00 (usable) [ 0.000000] BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved) [ 0.000000] BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) [ 0.000000] BIOS-e820: 0000000000100000 - 0000000007ffe000 (usable) [ 0.000000] BIOS-e820: 0000000007ffe000 - 0000000008000000 (reserved) [ 0.000000] BIOS-e820: 00000000feffc000 - 00000000ff000000 (reserved) [ 0.000000] BIOS-e820: 00000000fffc0000 - 0000000100000000 (reserved) [ 0.000000] NX (Execute Disable) protection: active [ 0.000000] DMI 2.4 present. [ 0.000000] No AGP bridge found [ 0.000000] last_pfn = 0x7ffe max_arch_pfn = 0x400000000 [ 0.000000] PAT not supported by CPU. [ 0.000000] found SMP MP-table at [ffff8800000fdaf0] fdaf0 [ 0.000000] init_memory_mapping: 0000000000000000-0000000007ffe000 [ 0.000000] RAMDISK: 07f58000 - 07ff0000 [ 0.000000] ACPI: RSDP 00000000000fd990 00014 (v00 BOCHS ) [ 0.000000] ACPI: RSDT 0000000007ffe4b0 00034 (v01 BOCHS BXPCRSDT 00000001 BXPC 00000001) [ 0.000000] ACPI: FACP 0000000007ffff80 00074 (v01 BOCHS BXPCFACP 00000001 BXPC 00000001) [ 0.000000] ACPI: DSDT 0000000007ffe4f0 011A9 (v01 BXPC BXDSDT 00000001 INTL 20100528) [ 0.000000] ACPI: FACS 0000000007ffff40 00040 [ 0.000000] ACPI: SSDT 0000000007fff800 00735 (v01 BOCHS BXPCSSDT 00000001 BXPC 00000001) [ 0.000000] ACPI: APIC 0000000007fff6e0 00078 (v01 BOCHS BXPCAPIC 00000001 BXPC 00000001) [ 0.000000] ACPI: HPET 0000000007fff6a0 00038 (v01 BOCHS BXPCHPET 00000001 BXPC 00000001) [ 0.000000] No NUMA configuration found [ 0.000000] Faking a node at 0000000000000000-0000000007ffe000 [ 0.000000] Initmem setup node 0 0000000000000000-0000000007ffe000 [ 0.000000] NODE_DATA [0000000007ff7000 - 0000000007ffafff] [ 0.000000] Zone PFN ranges: [ 0.000000] DMA 0x00000010 -> 0x00001000 [ 0.000000] DMA32 0x00001000 -> 0x00100000 [ 0.000000] Normal empty [ 0.000000] Movable zone start PFN for each node [ 0.000000] Early memory PFN ranges [ 0.000000] 0: 0x00000010 -> 0x0000009f [ 0.000000] 0: 0x00000100 -> 0x00007ffe [ 0.000000] ACPI: PM-Timer IO Port: 0xb008 [ 0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled) [ 0.000000] ACPI: LAPIC_NMI (acpi_id[0xff] dfl dfl lint[0x1]) [ 0.000000] ACPI: IOAPIC (id[0x00] address[0xfec00000] gsi_base[0]) [ 0.000000] IOAPIC[0]: apic_id 0, version 17, address 0xfec00000, GSI 0-23 [ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) [ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 5 global_irq 5 high level) [ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) [ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 high level) [ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 high level) [ 0.000000] Using ACPI (MADT) for SMP configuration information [ 0.000000] ACPI: HPET id: 0x8086a201 base: 0xfed00000 [ 0.000000] SMP: Allowing 1 CPUs, 0 hotplug CPUs [ 0.000000] PM: Registered nosave memory: 000000000009f000 - 00000000000a0000 [ 0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000f0000 [ 0.000000] PM: Registered nosave memory: 00000000000f0000 - 0000000000100000 [ 0.000000] Allocating PCI resources starting at 8000000 (gap: 8000000:f6ffc000) [ 0.000000] setup_percpu: NR_CPUS:64 nr_cpumask_bits:64 nr_cpu_ids:1 nr_node_ids:1 [ 0.000000] PERCPU: Embedded 26 pages/cpu @ffff880007c00000 s77056 r8192 d21248 u2097152 [ 0.000000] Built 1 zonelists in Node order, mobility grouping on. Total pages: 32136 [ 0.000000] Policy zone: DMA32 [ 0.000000] Kernel command line: console=ttyS0 seed=26105 [ 0.000000] PID hash table entries: 512 (order: 0, 4096 bytes) [ 0.000000] Checking aperture... [ 0.000000] No AGP bridge found [ 0.000000] Memory: 113188k/131064k available (7532k kernel code, 452k absent, 17424k reserved, 5454k data, 584k init) [ 0.000000] SLUB: Genslabs=15, HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] Hierarchical RCU implementation. [ 0.000000] NR_IRQS:4352 nr_irqs:256 16 [ 0.000000] Console: colour VGA+ 80x25 [ 0.000000] console [ttyS0] enabled [ 0.000000] Fast TSC calibration using PIT [ 0.000000] Detected 2933.141 MHz processor. [ 0.003001] Calibrating delay loop (skipped), value calculated using timer frequency.. 5866.28 BogoMIPS (lpj=2933141) [ 0.004335] pid_max: default: 32768 minimum: 301 [ 0.005029] Security Framework initialized [ 0.005539] SELinux: Initializing. [ 0.006026] Dentry cache hash table entries: 16384 (order: 5, 131072 bytes) [ 0.007027] Inode-cache hash table entries: 8192 (order: 4, 65536 bytes) [ 0.007817] Mount-cache hash table entries: 256 [ 0.008122] Initializing cgroup subsys cpuacct [ 0.009002] Initializing cgroup subsys freezer [ 0.009567] mce: CPU supports 10 MCE banks [ 0.010206] SMP alternatives: switching to UP code [ 0.019659] Freeing SMP alternatives: 24k freed [ 0.020008] ACPI: Core revision 20120320 [ 0.022372] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1 [ 0.033188] CPU0: Intel QEMU Virtual CPU version 1.4.50 stepping 03 [ 0.033997] Performance Events: unsupported p6 CPU model 2 no PMU driver, software events only. [ 0.034065] Brought up 1 CPUs [ 0.034407] Total of 1 processors activated (5866.28 BogoMIPS). [ 0.035380] kworker/u:0 used greatest stack depth: 6368 bytes left [ 0.036066] RTC time: 5:32:36, date: 03/15/13 [ 0.036595] NET: Registered protocol family 16 [ 0.037246] ACPI: bus type pci registered [ 0.038049] kworker/u:0 used greatest stack depth: 6304 bytes left [ 0.039011] PCI: Using configuration type 1 for base access [ 0.039870] kworker/u:0 used greatest stack depth: 5968 bytes left [ 0.040276] kworker/u:0 used greatest stack depth: 5536 bytes left [ 0.046505] bio: create slab <bio-0> at 0 [ 0.047133] ACPI: Added _OSI(Module Device) [ 0.047623] ACPI: Added _OSI(Processor Device) [ 0.048001] ACPI: Added _OSI(3.0 _SCP Extensions) [ 0.048534] ACPI: Added _OSI(Processor Aggregator Device) [ 0.050713] ACPI: Interpreter enabled [ 0.050999] ACPI: (supports S0 S3 S4 S5) [ 0.051525] ACPI: Using IOAPIC for interrupt routing [ 0.055088] ACPI: No dock devices found. [ 0.055537] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug [ 0.056065] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff]) [ 0.057083] pci_root PNP0A03:00: host bridge window [io 0x0000-0x0cf7] [ 0.058011] pci_root PNP0A03:00: host bridge window [io 0x0d00-0xffff] [ 0.059000] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x000bffff] [ 0.059826] pci_root PNP0A03:00: host bridge window [mem 0x80000000-0xfebfffff] [ 0.060033] PCI host bridge to bus 0000:00 [ 0.061006] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7] [ 0.061997] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff] [ 0.062692] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff] [ 0.062996] pci_bus 0000:00: root bus resource [mem 0x80000000-0xfebfffff] [ 0.069435] pci 0000:00:01.3: quirk: [io 0xb000-0xb03f] claimed by PIIX4 ACPI [ 0.070009] pci 0000:00:01.3: quirk: [io 0xb100-0xb10f] claimed by PIIX4 SMB [ 0.094617] pci0000:00: Unable to request _OSC control (_OSC support mask: 0x1e) [ 0.097206] ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11) [ 0.098028] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11) [ 0.098799] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11) [ 0.099248] ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11) [ 0.100225] ACPI: PCI Interrupt Link [LNKS] (IRQs *9) [ 0.101133] vgaarb: device added: PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none [ 0.101997] vgaarb: loaded [ 0.102314] vgaarb: bridge control possible 0000:00:02.0 [ 0.103078] SCSI subsystem initialized [ 0.103682] usbcore: registered new interface driver usbfs [ 0.104027] usbcore: registered new interface driver hub [ 0.105033] usbcore: registered new device driver usb [ 0.105750] Advanced Linux Sound Architecture Driver Version 1.0.25. [ 0.105997] PCI: Using ACPI for IRQ routing [ 0.107288] cfg80211: Calling CRDA to update world regulatory domain [ 0.108086] NetLabel: Initializing [ 0.108482] NetLabel: domain hash size = 128 [ 0.108999] NetLabel: protocols = UNLABELED CIPSOv4 [ 0.109572] NetLabel: unlabeled traffic allowed by default [ 0.110073] HPET: 3 timers in total, 0 timers will be used for per-cpu timer [ 0.111012] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0 [ 0.112028] hpet0: 3 comparators, 64-bit 100.000000 MHz counter [ 0.118003] Switching to clocksource hpet [ 0.119594] pnp: PnP ACPI init [ 0.119953] ACPI: bus type pnp registered [ 0.121314] pnp: PnP ACPI: found 8 devices [ 0.121817] ACPI: ACPI bus type pnp unregistered [ 0.130081] NET: Registered protocol family 2 [ 0.130657] IP route cache hash table entries: 1024 (order: 1, 8192 bytes) [ 0.131565] TCP established hash table entries: 4096 (order: 4, 65536 bytes) [ 0.132452] TCP bind hash table entries: 4096 (order: 4, 65536 bytes) [ 0.133220] TCP: Hash tables configured (established 4096 bind 4096) [ 0.133937] TCP: reno registered [ 0.134345] UDP hash table entries: 128 (order: 0, 4096 bytes) [ 0.135085] UDP-Lite hash table entries: 128 (order: 0, 4096 bytes) [ 0.135831] NET: Registered protocol family 1 [ 0.136464] RPC: Registered named UNIX socket transport module. [ 0.137180] RPC: Registered udp transport module. [ 0.137757] RPC: Registered tcp transport module. [ 0.138326] RPC: Registered tcp NFSv4.1 backchannel transport module. [ 0.139129] pci 0000:00:00.0: Limiting direct PCI/PCI transfers [ 0.139814] pci 0000:00:01.0: PIIX3: Enabling Passive Release [ 0.140565] pci 0000:00:01.0: Activating ISA DMA hang workarounds [ 0.141380] Trying to unpack rootfs image as initramfs... [ 0.150640] Freeing initrd memory: 608k freed [ 0.151590] microcode: CPU0 sig=0x623, pf=0x0, revision=0x1 [ 0.152307] microcode: Microcode Update Driver: v2.00 <tig...@aivazian.fsnet.co.uk>, Peter Oruba [ 0.153645] audit: initializing netlink socket (disabled) [ 0.154311] type=2000 audit(1363325556.153:1): initialized [ 0.172729] HugeTLB registered 2 MB page size, pre-allocated 0 pages [ 0.176730] VFS: Disk quotas dquot_6.5.2 [ 0.177317] Dquot-cache hash table entries: 512 (order 0, 4096 bytes) [ 0.178637] NFS: Registering the id_resolver key type [ 0.179501] msgmni has been set to 222 [ 0.180358] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) [ 0.181246] io scheduler noop registered [ 0.181705] io scheduler deadline registered [ 0.182316] io scheduler cfq registered (default) [ 0.182968] pci_hotplug: PCI Hot Plug PCI Core version: 0.5 [ 0.183688] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 [ 0.184528] acpiphp: Slot [3] registered [ 0.185069] acpiphp: Slot [4] registered [ 0.185572] acpiphp: Slot [5] registered [ 0.186110] acpiphp: Slot [6] registered [ 0.186616] acpiphp: Slot [7] registered [ 0.187154] acpiphp: Slot [8] registered [ 0.187657] acpiphp: Slot [9] registered [ 0.188195] acpiphp: Slot [10] registered [ 0.188709] acpiphp: Slot [11] registered [ 0.189257] acpiphp: Slot [12] registered [ 0.189816] acpiphp: Slot [13] registered [ 0.190362] acpiphp: Slot [14] registered [ 0.190878] acpiphp: Slot [15] registered [ 0.191477] acpiphp: Slot [16] registered [ 0.191987] acpiphp: Slot [17] registered [ 0.192540] acpiphp: Slot [18] registered [ 0.193086] acpiphp: Slot [19] registered [ 0.193640] acpiphp: Slot [20] registered [ 0.194187] acpiphp: Slot [21] registered [ 0.194742] acpiphp: Slot [22] registered [ 0.195290] acpiphp: Slot [23] registered [ 0.195797] acpiphp: Slot [24] registered [ 0.196346] acpiphp: Slot [25] registered [ 0.196861] acpiphp: Slot [26] registered [ 0.197452] acpiphp: Slot [27] registered [ 0.197962] acpiphp: Slot [28] registered [ 0.198517] acpiphp: Slot [29] registered [ 0.199068] acpiphp: Slot [30] registered [ 0.199580] acpiphp: Slot [31] registered [ 0.200289] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0 [ 0.201178] ACPI: Power Button [PWRF] [ 0.203226] ACPI: PCI Interrupt Link [LNKD] enabled at IRQ 11 [ 0.205056] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled [ 0.471590] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [ 0.496552] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [ 0.497596] Non-volatile memory driver v1.3 [ 0.498115] Linux agpgart interface v0.103 [ 0.498758] [drm] Initialized drm 1.1.0 20060810 [ 0.499330] [drm:i915_init] *ERROR* drm/i915 can't work without intel_agp module! [ 0.501775] brd: module loaded [ 0.503062] loop: module loaded [ 0.506804] vda: unknown partition table [ 0.508880] DC390: clustering now enabled by default. If you get problems load [ 0.510423] with "disable_clustering=1" and report to maintainers [ 0.511723] megasas: 00.00.06.14-rc1 Fri. Jan. 6 17:00:00 PDT 2012 [ 0.513783] scsi0 : ata_piix [ 0.514260] scsi1 : ata_piix [ 0.514674] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc080 irq 14 [ 0.515490] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc088 irq 15 [ 0.517372] pcnet32: pcnet32.c:v1.35 21.Apr.2008 tsbog...@alpha.franken.de [ 0.518267] e100: Intel(R) PRO/100 Network Driver, 3.5.24-k2-NAPI [ 0.518999] e100: Copyright(c) 1999-2006 Intel Corporation [ 0.519692] e1000: Intel(R) PRO/1000 Network Driver - version 7.3.21-k8-NAPI [ 0.520570] e1000: Copyright (c) 1999-2006 Intel Corporation. [ 0.521348] ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10 [ 0.818823] ata2.00: ATAPI: QEMU DVD-ROM, 1.4.50, max UDMA/100 [ 0.819915] ata2.00: configured for MWDMA2 [ 0.820892] scsi 1:0:0:0: CD-ROM QEMU QEMU DVD-ROM 1.4. PQ: 0 ANSI: 5 [ 0.822640] sr0: scsi3-mmc drive: 4x/4x cd/rw xa/form2 tray [ 0.823315] cdrom: Uniform CD-ROM driver Revision: 3.20 [ 0.824467] sr 1:0:0:0: Attached scsi generic sg0 type 5 [ 0.850040] e1000 0000:00:03.0: eth0: (PCI:33MHz:32-bit) 52:54:00:12:34:56 [ 0.850891] e1000 0000:00:03.0: eth0: Intel(R) PRO/1000 Network Connection [ 0.851750] sky2: driver version 1.30 [ 0.852495] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [ 0.853319] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 0.854106] uhci_hcd: USB Universal Host Controller Interface driver [ 0.854910] usbcore: registered new interface driver usblp [ 0.855617] Initializing USB Mass Storage driver... [ 0.856242] usbcore: registered new interface driver usb-storage [ 0.856921] USB Mass Storage support registered. [ 0.857567] usbcore: registered new interface driver libusual [ 0.858337] i8042: PNP: PS/2 Controller [PNP0303:KBD,PNP0f13:MOU] at 0x60,0x64 irq 1,12 [ 0.859890] serio: i8042 KBD port at 0x60,0x64 irq 1 [ 0.860503] serio: i8042 AUX port at 0x60,0x64 irq 12 [ 0.861260] mousedev: PS/2 mouse device common for all mice [ 0.862317] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input1 [ 0.863440] rtc_cmos 00:01: RTC can wake from S4 [ 0.866320] rtc_cmos 00:01: rtc core: registered rtc_cmos as rtc0 [ 0.867146] rtc0: alarms up to one day, 114 bytes nvram, hpet irqs [ 0.868095] device-mapper: ioctl: 4.22.0-ioctl (2011-10-19) initialised: dm-de...@redhat.com [ 0.869143] cpuidle: using governor ladder [ 0.869618] cpuidle: using governor menu [ 0.870103] EFI Variables Facility v0.08 2004-May-17 [ 0.871534] usbcore: registered new interface driver usbhid [ 0.872203] usbhid: USB HID core driver [ 0.873144] Netfilter messages via NETLINK v0.30. [ 0.873690] nf_conntrack version 0.5.0 (889 buckets, 3556 max) [ 0.874481] ctnetlink v0.93: registering with nfnetlink. [ 0.875199] ip_tables: (C) 2000-2006 Netfilter Core Team [ 0.875822] TCP: cubic registered [ 0.876243] Initializing XFRM netlink socket [ 0.876940] NET: Registered protocol family 10 [ 0.877667] ip6_tables: (C) 2000-2006 Netfilter Core Team [ 0.878329] IPv6 over IPv4 tunneling driver [ 0.878955] NET: Registered protocol family 17 [ 0.879504] Registering the dns_resolver key type [ 0.880219] registered taskstats version 1 [ 0.880864] Magic number: 5:114:517 [ 0.881356] console [netcon0] enabled [ 0.881782] netconsole: network logging started [ 0.882361] ALSA device list: [ 0.882723] No soundcards found. [ 0.884214] Freeing unused kernel memory: 584k freed [ 0.884907] Write protecting the kernel read-only data: 12288k [ 0.887218] Freeing unused kernel memory: 640k freed [ 0.891939] Freeing unused kernel memory: 1724k freed Setting guest RANDOM seed to 26105 *** Running tests *** [1;32m/tests/virtio-blk-drive-serial.sh[0m Running test /tests/virtio-blk-drive-serial.sh...drive has wrong serial! Expected '0123456789abcdefghi', got '8' FAILED (2) Regards, Anthony Liguori > --- > blockdev.c | 69 > +++++++++++++++++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 59 insertions(+), 10 deletions(-) > > diff --git a/blockdev.c b/blockdev.c > index d679174..d0fd1e2 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -22,6 +22,7 @@ > #include "sysemu/arch_init.h" > > static QTAILQ_HEAD(drivelist, DriveInfo) drives = > QTAILQ_HEAD_INITIALIZER(drives); > +extern QemuOptsList qemu_common_drive_opts; > > static const char *const if_name[IF_COUNT] = { > [IF_NONE] = "none", > @@ -287,7 +288,7 @@ static bool do_check_io_limits(BlockIOLimit *io_limits, > Error **errp) > return true; > } > > -DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType block_default_type) > +DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType > block_default_type) > { > const char *buf; > const char *file = NULL; > @@ -310,10 +311,36 @@ DriveInfo *drive_init(QemuOpts *opts, > BlockInterfaceType block_default_type) > bool copy_on_read; > int ret; > Error *error = NULL; > + QemuOpts *opts; > + QDict *bs_opts; > + const char *id; > > translation = BIOS_ATA_TRANSLATION_AUTO; > media = MEDIA_DISK; > > + /* Check common options by copying from all_opts to opts, all other > options > + * are stored in bs_opts. */ > + id = qemu_opts_id(all_opts); > + opts = qemu_opts_create(&qemu_common_drive_opts, id, 1, &error); > + if (error_is_set(&error)) { > + qerror_report_err(error); > + error_free(error); > + return NULL; > + } > + > + bs_opts = qdict_new(); > + qemu_opts_to_qdict(all_opts, bs_opts); > + qemu_opts_absorb_qdict(opts, bs_opts, &error); > + if (error_is_set(&error)) { > + qerror_report_err(error); > + error_free(error); > + return NULL; > + } > + > + if (id) { > + qdict_del(bs_opts, "id"); > + } > + > /* extract parameters */ > bus_id = qemu_opt_get_number(opts, "bus", 0); > unit_id = qemu_opt_get_number(opts, "unit", -1); > @@ -564,7 +591,7 @@ DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType > block_default_type) > dinfo->heads = heads; > dinfo->secs = secs; > dinfo->trans = translation; > - dinfo->opts = opts; > + dinfo->opts = all_opts; > dinfo->refcount = 1; > dinfo->serial = serial; > QTAILQ_INSERT_TAIL(&drives, dinfo, next); > @@ -587,17 +614,20 @@ DriveInfo *drive_init(QemuOpts *opts, > BlockInterfaceType block_default_type) > case IF_MTD: > break; > case IF_VIRTIO: > + { > /* add virtio block device */ > - opts = qemu_opts_create_nofail(qemu_find_opts("device")); > + QemuOpts *devopts; > + devopts = qemu_opts_create_nofail(qemu_find_opts("device")); > if (arch_type == QEMU_ARCH_S390X) { > - qemu_opt_set(opts, "driver", "virtio-blk-s390"); > + qemu_opt_set(devopts, "driver", "virtio-blk-s390"); > } else { > - qemu_opt_set(opts, "driver", "virtio-blk-pci"); > + qemu_opt_set(devopts, "driver", "virtio-blk-pci"); > } > - qemu_opt_set(opts, "drive", dinfo->id); > + qemu_opt_set(devopts, "drive", dinfo->id); > if (devaddr) > - qemu_opt_set(opts, "addr", devaddr); > + qemu_opt_set(devopts, "addr", devaddr); > break; > + } > default: > abort(); > } > @@ -635,7 +665,9 @@ DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType > block_default_type) > error_report("warning: disabling copy_on_read on readonly drive"); > } > > - ret = bdrv_open(dinfo->bdrv, file, NULL, bdrv_flags, drv); > + ret = bdrv_open(dinfo->bdrv, file, bs_opts, bdrv_flags, drv); > + bs_opts = NULL; > + > if (ret < 0) { > if (ret == -EMEDIUMTYPE) { > error_report("could not open disk image %s: not in %s format", > @@ -649,9 +681,14 @@ DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType > block_default_type) > > if (bdrv_key_required(dinfo->bdrv)) > autostart = 0; > + > + qemu_opts_del(opts); > + > return dinfo; > > err: > + qemu_opts_del(opts); > + QDECREF(bs_opts); > bdrv_delete(dinfo->bdrv); > g_free(dinfo->id); > QTAILQ_REMOVE(&drives, dinfo, next); > @@ -1461,9 +1498,9 @@ BlockJobInfoList *qmp_query_block_jobs(Error **errp) > return dummy.next; > } > > -QemuOptsList qemu_drive_opts = { > +QemuOptsList qemu_common_drive_opts = { > .name = "drive", > - .head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head), > + .head = QTAILQ_HEAD_INITIALIZER(qemu_common_drive_opts.head), > .desc = { > { > .name = "bus", > @@ -1582,3 +1619,15 @@ QemuOptsList qemu_drive_opts = { > { /* end of list */ } > }, > }; > + > +QemuOptsList qemu_drive_opts = { > + .name = "drive", > + .head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head), > + .desc = { > + /* > + * no elements => accept any params > + * validation will happen later > + */ > + { /* end of list */ } > + }, > +}; > -- > 1.8.1.4