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

The first patch is a preparation moving qemuSafeSerialParamValue to util, the second implements disk serial number setting in vz driver. Maxim Nestratov (2): util: qemu: make qemuSafeSerialParamValue function usable by other drivers vz: support setting disk serial number 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 | 19 +++++++++++++++++++ src/vz/vz_utils.c | 5 ----- 6 files changed, 39 insertions(+), 23 deletions(-) -- 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 55b6a24..ec9fe1c 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

On 20.10.2016 14:09, Maxim Nestratov wrote:
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 55b6a24..ec9fe1c 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)
ACK

Signed-off-by: Maxim Nestratov <mnestratov@virtuozzo.com> --- src/vz/vz_sdk.c | 19 +++++++++++++++++++ src/vz/vz_utils.c | 5 ----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index b5b0197..f27441d 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,18 @@ prlsdkGetDiskInfo(vzDriverPtr driver, if (*buf != '\0' && virDomainDiskSetSource(disk, buf) < 0) goto cleanup; + 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; @@ -643,6 +656,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver, cleanup: VIR_FREE(buf); + VIR_FREE(serial); return ret; } @@ -3489,6 +3503,11 @@ static int prlsdkConfigureDisk(vzDriverPtr driver, pret = PrlVmDev_SetIfaceType(sdkdisk, sdkbus); prlsdkCheckRetGoto(pret, cleanup); + if (disk->serial) { + pret = PrlVmDevHd_SetSerialNumber(sdkdisk, disk->serial); + prlsdkCheckRetGoto(pret, cleanup); + } + pret = PrlVmDev_SetStackIndex(sdkdisk, idx); prlsdkCheckRetGoto(pret, cleanup); diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index eaf09f2..f68b3a1 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -323,11 +323,6 @@ vzCheckDiskUnsupportedParams(virDomainDiskDefPtr disk) return -1; } - if (disk->serial) { - VIR_INFO("%s", _("Setting disk serial number is not " - "supported by vz driver.")); - } - if (disk->wwn) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Setting disk wwn id is not " -- 2.4.11

On 20.10.2016 14:09, Maxim Nestratov wrote:
Signed-off-by: Maxim Nestratov <mnestratov@virtuozzo.com> --- src/vz/vz_sdk.c | 19 +++++++++++++++++++ src/vz/vz_utils.c | 5 ----- 2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index b5b0197..f27441d 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,18 @@ prlsdkGetDiskInfo(vzDriverPtr driver, if (*buf != '\0' && virDomainDiskSetSource(disk, buf) < 0) goto cleanup;
+ 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;
@@ -643,6 +656,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver,
cleanup: VIR_FREE(buf); + VIR_FREE(serial); return ret; }
@@ -3489,6 +3503,11 @@ static int prlsdkConfigureDisk(vzDriverPtr driver, pret = PrlVmDev_SetIfaceType(sdkdisk, sdkbus); prlsdkCheckRetGoto(pret, cleanup);
+ if (disk->serial) { + pret = PrlVmDevHd_SetSerialNumber(sdkdisk, disk->serial); + prlsdkCheckRetGoto(pret, cleanup); + } + pret = PrlVmDev_SetStackIndex(sdkdisk, idx); prlsdkCheckRetGoto(pret, cleanup);
diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index eaf09f2..f68b3a1 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -323,11 +323,6 @@ vzCheckDiskUnsupportedParams(virDomainDiskDefPtr disk) return -1; }
- if (disk->serial) { - VIR_INFO("%s", _("Setting disk serial number is not " - "supported by vz driver.")); - } - if (disk->wwn) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Setting disk wwn id is not "
ACK
participants (2)
-
Maxim Nestratov
-
Mikhail Feoktistov