qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 06/13] block: Support driver specific options in


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH 06/13] block: Support driver specific options in drive_init()
Date: Thu, 14 Mar 2013 16:11:07 -0500
User-agent: Notmuch/0.13.2+93~ged93d79 (http://notmuchmail.org) Emacs/23.3.1 (x86_64-pc-linux-gnu)

Kevin Wolf <address@hidden> writes:

> Any non-default -drive options are now passed down to the block drivers.
>
> Signed-off-by: Kevin Wolf <address@hidden>
> Reviewed-by: Eric Blake <address@hidden>
> Reviewed-by: Stefan Hajnoczi <address@hidden>

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 (address@hidden) (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 <address@hidden>, 
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 address@hidden
[    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: 
address@hidden
[    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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]