[libvirt] [PATCH v2 0/3] qemu: util: vz: support setting disk serial number

Actually this is a combination of the two previous series https://www.redhat.com/archives/libvir-list/2016-October/msg00890.html and https://www.redhat.com/archives/libvir-list/2016-September/msg01024.html Maxim Nestratov (1): util: qemu: make qemuSafeSerialParamValue function usable by other drivers Nikolay Shirokovskiy (2): vz: set something in disk driver name vz: add serial number to disk devices src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 19 +------------------ src/util/virutil.c | 16 ++++++++++++++++ src/util/virutil.h | 2 ++ src/vz/vz_sdk.c | 24 ++++++++++++++++++++++++ src/vz/vz_utils.c | 6 +++--- 6 files changed, 47 insertions(+), 21 deletions(-) -- 2.4.11

From: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> Absent driver name attribute is invalid xml. Which in turn makes unusable 'virsh edit' for example. The value does not make much sense and ignored on input so nobody will hurt. --- src/vz/vz_sdk.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index f36064d..8178d3b 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -632,6 +632,9 @@ prlsdkGetDiskInfo(vzDriverPtr driver, if (virDiskNameToBusDeviceIndex(disk, &busIdx, &devIdx) < 0) goto cleanup; + if (virDomainDiskSetDriver(disk, "vz") < 0) + goto cleanup; + address = &disk->info.addr.drive; address->bus = busIdx; address->target = 0; -- 2.4.11

Rename qemuSafeSerialParamValue to virSafeSerialParamValue and move it to utils Signed-off-by: Maxim Nestratov <mnestratov@virtuozzo.com> --- src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 19 +------------------ src/util/virutil.c | 16 ++++++++++++++++ src/util/virutil.h | 2 ++ 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index bf503a5..170195b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2649,6 +2649,7 @@ virParseVersionString; virPipeReadUntilEOF; virReadFCHost; virReadSCSIUniqueId; +virSafeSerialParamValue; virScaleInteger; virSetBlocking; virSetCloseExec; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 8282162..0be2ffa 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -427,23 +427,6 @@ qemuBuildIoEventFdStr(virBufferPtr buf, return 0; } -#define QEMU_SERIAL_PARAM_ACCEPTED_CHARS \ - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ " - -static int -qemuSafeSerialParamValue(const char *value) -{ - if (strspn(value, QEMU_SERIAL_PARAM_ACCEPTED_CHARS) != strlen(value)) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("driver serial '%s' contains unsafe characters"), - value); - return -1; - } - - return 0; -} - - static int qemuNetworkDriveGetPort(int protocol, const char *port) @@ -1600,7 +1583,7 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk, if (disk->serial && virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) { - if (qemuSafeSerialParamValue(disk->serial) < 0) + if (virSafeSerialParamValue(disk->serial) < 0) goto error; if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI && disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) { diff --git a/src/util/virutil.c b/src/util/virutil.c index 844c947..58ace3f 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -2684,3 +2684,19 @@ virMemoryMaxValue(bool capped) else return LLONG_MAX; } + +#define VIR_SERIAL_PARAM_ACCEPTED_CHARS \ + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ " + +int +virSafeSerialParamValue(const char *value) +{ + if (strspn(value, VIR_SERIAL_PARAM_ACCEPTED_CHARS) != strlen(value)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("driver serial '%s' contains unsafe characters"), + value); + return -1; + } + + return 0; +} diff --git a/src/util/virutil.h b/src/util/virutil.h index 8c0d83c..f9b4831 100644 --- a/src/util/virutil.h +++ b/src/util/virutil.h @@ -252,6 +252,8 @@ unsigned long long virMemoryLimitTruncate(unsigned long long value); bool virMemoryLimitIsSet(unsigned long long value); unsigned long long virMemoryMaxValue(bool ulong); +int virSafeSerialParamValue(const char *value); + /** * VIR_ASSIGN_IS_OVERFLOW: * @rvalue: value that is checked (evaluated twice) -- 2.4.11

From: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> vz sdk supports setting serial number only for disk devices. Getting serial upon cdrom(for example) is error however setting is just ignored. Let's check for disk device explicitly for clarity in both cases. Setting serial number for other devices is ignored with an info note just as before. We need usual conversion from "" to NULL in direction vz sdk -> libvirt, because "" is not valid for libvirt and "" means unspecifiend in vz sdk which is NULL for libvirt. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> Signed-off-by: Maxim Nestratov <mnestratov@virtuozzo.com> --- src/vz/vz_sdk.c | 21 +++++++++++++++++++++ src/vz/vz_utils.c | 6 +++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 8178d3b..e14caa5 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -590,6 +590,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver, bool isCt) { char *buf = NULL; + char *serial = NULL; PRL_RESULT pret; PRL_UINT32 emulatedType; virDomainDeviceDriveAddressPtr address; @@ -626,6 +627,20 @@ prlsdkGetDiskInfo(vzDriverPtr driver, if (*buf != '\0' && virDomainDiskSetSource(disk, buf) < 0) goto cleanup; + if (!isCdrom) { + serial = prlsdkGetStringParamVar(PrlVmDevHd_GetSerialNumber, prldisk); + if (serial) { + if (virSafeSerialParamValue(serial) < 0) + goto cleanup; + + if (*serial == '\0') + VIR_FREE(serial); + else + disk->serial = serial; + serial = NULL; + } + } + if (prlsdkGetDiskId(prldisk, &disk->bus, &disk->dst) < 0) goto cleanup; @@ -646,6 +661,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver, cleanup: VIR_FREE(buf); + VIR_FREE(serial); return ret; } @@ -3495,6 +3511,11 @@ static int prlsdkConfigureDisk(vzDriverPtr driver, pret = PrlVmDev_SetStackIndex(sdkdisk, idx); prlsdkCheckRetGoto(pret, cleanup); + if (devType == PDE_HARD_DISK) { + pret = PrlVmDevHd_SetSerialNumber(sdkdisk, disk->serial); + prlsdkCheckRetGoto(pret, cleanup); + } + return 0; cleanup: PrlHandle_Free(sdkdisk); diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index eaf09f2..81429d2 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -323,9 +323,9 @@ vzCheckDiskUnsupportedParams(virDomainDiskDefPtr disk) return -1; } - if (disk->serial) { - VIR_INFO("%s", _("Setting disk serial number is not " - "supported by vz driver.")); + if (disk->serial && disk->device != VIR_DOMAIN_DISK_DEVICE_DISK) { + VIR_INFO("%s", _("Setting disk serial number is " + "supported only for disk devices.")); } if (disk->wwn) { -- 2.4.11

21-Oct-16 12:50, Maxim Nestratov пишет:
Actually this is a combination of the two previous series https://www.redhat.com/archives/libvir-list/2016-October/msg00890.html and https://www.redhat.com/archives/libvir-list/2016-September/msg01024.html
Maxim Nestratov (1): util: qemu: make qemuSafeSerialParamValue function usable by other drivers
Nikolay Shirokovskiy (2): vz: set something in disk driver name vz: add serial number to disk devices
src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 19 +------------------ src/util/virutil.c | 16 ++++++++++++++++ src/util/virutil.h | 2 ++ src/vz/vz_sdk.c | 24 ++++++++++++++++++++++++ src/vz/vz_utils.c | 6 +++--- 6 files changed, 47 insertions(+), 21 deletions(-)
Disregard this please. I pushed the original series: https://www.redhat.com/archives/libvir-list/2016-September/msg01024.html Maxim
participants (1)
-
Maxim Nestratov