mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-27 06:55:18 +00:00
qemu: Disk Geometry Override Support
Qemu command line generation for geometry override and testcases. Signed-off-by: J.B. Joret <jb@linux.vnet.ibm.com> Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
This commit is contained in:
parent
5d4f8d9746
commit
a46af26004
@ -2076,6 +2076,8 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|||||||
{
|
{
|
||||||
virBuffer opt = VIR_BUFFER_INITIALIZER;
|
virBuffer opt = VIR_BUFFER_INITIALIZER;
|
||||||
const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
|
const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
|
||||||
|
const char *trans =
|
||||||
|
virDomainDiskGeometryTransTypeToString(disk->geometry.trans);
|
||||||
int idx = virDiskNameToIndex(disk->dst);
|
int idx = virDiskNameToIndex(disk->dst);
|
||||||
int busid = -1, unitid = -1;
|
int busid = -1, unitid = -1;
|
||||||
|
|
||||||
@ -2278,6 +2280,21 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|||||||
disk->type != VIR_DOMAIN_DISK_TYPE_DIR &&
|
disk->type != VIR_DOMAIN_DISK_TYPE_DIR &&
|
||||||
qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_FORMAT))
|
qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_FORMAT))
|
||||||
virBufferAsprintf(&opt, ",format=%s", disk->driverType);
|
virBufferAsprintf(&opt, ",format=%s", disk->driverType);
|
||||||
|
|
||||||
|
/* generate geometry command string */
|
||||||
|
if (disk->geometry.cylinders > 0 &&
|
||||||
|
disk->geometry.heads > 0 &&
|
||||||
|
disk->geometry.sectors > 0) {
|
||||||
|
|
||||||
|
virBufferAsprintf(&opt, ",cyls=%u,heads=%u,secs=%u",
|
||||||
|
disk->geometry.cylinders,
|
||||||
|
disk->geometry.heads,
|
||||||
|
disk->geometry.sectors);
|
||||||
|
|
||||||
|
if (disk->geometry.trans != VIR_DOMAIN_DISK_TRANS_DEFAULT)
|
||||||
|
virBufferEscapeString(&opt, ",trans=%s", trans);
|
||||||
|
}
|
||||||
|
|
||||||
if (disk->serial &&
|
if (disk->serial &&
|
||||||
qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) {
|
qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) {
|
||||||
if (qemuSafeSerialParamValue(disk->serial) < 0)
|
if (qemuSafeSerialParamValue(disk->serial) < 0)
|
||||||
@ -6723,6 +6740,7 @@ qemuParseCommandLineDisk(virCapsPtr caps,
|
|||||||
int idx = -1;
|
int idx = -1;
|
||||||
int busid = -1;
|
int busid = -1;
|
||||||
int unitid = -1;
|
int unitid = -1;
|
||||||
|
int trans = VIR_DOMAIN_DISK_TRANS_DEFAULT;
|
||||||
|
|
||||||
if ((nkeywords = qemuParseKeywords(val,
|
if ((nkeywords = qemuParseKeywords(val,
|
||||||
&keywords,
|
&keywords,
|
||||||
@ -6927,6 +6945,44 @@ qemuParseCommandLineDisk(virCapsPtr caps,
|
|||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("cannot parse io mode '%s'"), values[i]);
|
_("cannot parse io mode '%s'"), values[i]);
|
||||||
}
|
}
|
||||||
|
} else if (STREQ(keywords[i], "cyls")) {
|
||||||
|
if (virStrToLong_ui(values[i], NULL, 10,
|
||||||
|
&(def->geometry.cylinders)) < 0) {
|
||||||
|
virDomainDiskDefFree(def);
|
||||||
|
def = NULL;
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("cannot parse cylinders value'%s'"),
|
||||||
|
values[i]);
|
||||||
|
}
|
||||||
|
} else if (STREQ(keywords[i], "heads")) {
|
||||||
|
if (virStrToLong_ui(values[i], NULL, 10,
|
||||||
|
&(def->geometry.heads)) < 0) {
|
||||||
|
virDomainDiskDefFree(def);
|
||||||
|
def = NULL;
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("cannot parse heads value'%s'"),
|
||||||
|
values[i]);
|
||||||
|
}
|
||||||
|
} else if (STREQ(keywords[i], "secs")) {
|
||||||
|
if (virStrToLong_ui(values[i], NULL, 10,
|
||||||
|
&(def->geometry.sectors)) < 0) {
|
||||||
|
virDomainDiskDefFree(def);
|
||||||
|
def = NULL;
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("cannot parse sectors value'%s'"),
|
||||||
|
values[i]);
|
||||||
|
}
|
||||||
|
} else if (STREQ(keywords[i], "trans")) {
|
||||||
|
def->geometry.trans =
|
||||||
|
virDomainDiskGeometryTransTypeFromString(values[i]);
|
||||||
|
if ((trans < VIR_DOMAIN_DISK_TRANS_DEFAULT) ||
|
||||||
|
(trans >= VIR_DOMAIN_DISK_TRANS_LAST)) {
|
||||||
|
virDomainDiskDefFree(def);
|
||||||
|
def = NULL;
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("cannot parse translation value'%s'"),
|
||||||
|
values[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
tests/qemuxml2argvdata/qemuxml2argv-disk-geometry.args
Normal file
5
tests/qemuxml2argvdata/qemuxml2argv-disk-geometry.args
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
|
||||||
|
pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \
|
||||||
|
-no-acpi -boot c -drive file=/dev/HostVG/QEMUGuest1,if=ide,bus=0,unit=0,\
|
||||||
|
cyls=16383,heads=16,secs=63,trans=lba \
|
||||||
|
-net none -serial none -parallel none -usb
|
26
tests/qemuxml2argvdata/qemuxml2argv-disk-geometry.xml
Normal file
26
tests/qemuxml2argvdata/qemuxml2argv-disk-geometry.xml
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<domain type='qemu'>
|
||||||
|
<name>QEMUGuest1</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory>219136</memory>
|
||||||
|
<currentMemory>219136</currentMemory>
|
||||||
|
<vcpu>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='i686' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/qemu</emulator>
|
||||||
|
<disk type='block' device='disk'>
|
||||||
|
<source dev='/dev/HostVG/QEMUGuest1'/>
|
||||||
|
<geometry cyls='16383' heads='16' secs='63' trans='lba'/>
|
||||||
|
<target dev='hda' bus='ide'/>
|
||||||
|
<address type='drive' controller='0' bus='0' unit='0'/>
|
||||||
|
</disk>
|
||||||
|
<controller type='ide' index='0'/>
|
||||||
|
<memballoon model='virtio'/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -788,6 +788,8 @@ mymain(void)
|
|||||||
QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
|
QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
|
||||||
QEMU_CAPS_IDE_CD);
|
QEMU_CAPS_IDE_CD);
|
||||||
|
|
||||||
|
DO_TEST("disk-geometry", QEMU_CAPS_DRIVE);
|
||||||
|
|
||||||
VIR_FREE(driver.stateDir);
|
VIR_FREE(driver.stateDir);
|
||||||
virCapabilitiesFree(driver.caps);
|
virCapabilitiesFree(driver.caps);
|
||||||
VIR_FREE(map);
|
VIR_FREE(map);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user