mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-10 05:17:59 +03:00
Add virIndexToDiskName and fix mapping gap
esxVMX_IndexToDiskName handles indices up to 701. This limit comes from a mapping gap in virDiskNameToIndex: sdzy -> 700 sdzz -> 701 sdaaa -> 728 sdaab -> 729 This line in virDiskNameToIndex causes this gap: idx = (idx + i) * 26; Fixing it by altering this line to: idx = (idx + (i < 1 ? 0 : 1)) * 26; Also add a new version of virIndexToDiskName that handles the inverse mapping for arbitrary indices. * src/esx/esx_vmx.[ch]: remove esxVMX_IndexToDiskName * src/util/util.[ch]: add virIndexToDiskName and fix mapping gap * tests/esxutilstest.c: update test to verify that the gap is fixed
This commit is contained in:
parent
7a18fbeeb8
commit
63166a4e0c
@ -1211,31 +1211,6 @@ esxVMX_ParseSCSIController(virConnectPtr conn, virConfPtr conf, int controller,
|
||||
|
||||
|
||||
|
||||
char *
|
||||
esxVMX_IndexToDiskName(virConnectPtr conn, int idx, const char *prefix)
|
||||
{
|
||||
char *name = NULL;
|
||||
|
||||
if (idx < 0) {
|
||||
ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
"Disk index %d is negative", idx);
|
||||
} else if (idx < 26) {
|
||||
if (virAsprintf(&name, "%s%c", prefix, 'a' + idx) < 0)
|
||||
virReportOOMError(conn);
|
||||
} else if (idx < 702) {
|
||||
if (virAsprintf(&name, "%s%c%c", prefix, 'a' + idx / 26 - 1,
|
||||
'a' + (idx % 26)) < 0)
|
||||
virReportOOMError(conn);
|
||||
} else {
|
||||
ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
"Disk index %d is too large", idx);
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
struct _virDomainDiskDef {
|
||||
int type; // partly done
|
||||
@ -1337,8 +1312,8 @@ esxVMX_ParseDisk(virConnectPtr conn, esxVI_Context *ctx, virConfPtr conf,
|
||||
}
|
||||
|
||||
(*def)->dst =
|
||||
esxVMX_IndexToDiskName
|
||||
(conn, controller * 15 + (id < 7 ? id : id - 1), "sd");
|
||||
virIndexToDiskName
|
||||
(controller * 15 + (id < 7 ? id : id - 1), "sd");
|
||||
|
||||
if ((*def)->dst == NULL) {
|
||||
goto failure;
|
||||
@ -1371,8 +1346,7 @@ esxVMX_ParseDisk(virConnectPtr conn, esxVI_Context *ctx, virConfPtr conf,
|
||||
goto failure;
|
||||
}
|
||||
|
||||
(*def)->dst = esxVMX_IndexToDiskName(conn, controller * 2 + id,
|
||||
"hd");
|
||||
(*def)->dst = virIndexToDiskName(controller * 2 + id, "hd");
|
||||
|
||||
if ((*def)->dst == NULL) {
|
||||
goto failure;
|
||||
@ -1398,7 +1372,7 @@ esxVMX_ParseDisk(virConnectPtr conn, esxVI_Context *ctx, virConfPtr conf,
|
||||
goto failure;
|
||||
}
|
||||
|
||||
(*def)->dst = esxVMX_IndexToDiskName(conn, controller, "fd");
|
||||
(*def)->dst = virIndexToDiskName(controller, "fd");
|
||||
|
||||
if ((*def)->dst == NULL) {
|
||||
goto failure;
|
||||
|
@ -28,9 +28,6 @@
|
||||
#include "domain_conf.h"
|
||||
#include "esx_vi.h"
|
||||
|
||||
char *
|
||||
esxVMX_IndexToDiskName(virConnectPtr conn, int idx, const char *prefix);
|
||||
|
||||
int
|
||||
esxVMX_SCSIDiskNameToControllerAndID(virConnectPtr conn, const char *name,
|
||||
int *controller, int *id);
|
||||
@ -53,6 +50,7 @@ esxVMX_AbsolutePathToDatastoreRelatedPath(virConnectPtr conn,
|
||||
const char *absolutePath);
|
||||
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* VMX -> Domain XML
|
||||
*/
|
||||
|
@ -1789,7 +1789,7 @@ int virDiskNameToIndex(const char *name) {
|
||||
return -1;
|
||||
|
||||
for (i = 0; *ptr; i++) {
|
||||
idx = (idx + i) * 26;
|
||||
idx = (idx + (i < 1 ? 0 : 1)) * 26;
|
||||
|
||||
if (!c_islower(*ptr))
|
||||
return -1;
|
||||
@ -1801,6 +1801,36 @@ int virDiskNameToIndex(const char *name) {
|
||||
return idx;
|
||||
}
|
||||
|
||||
char *virIndexToDiskName(int idx, const char *prefix)
|
||||
{
|
||||
char *name = NULL;
|
||||
int i, k, offset;
|
||||
|
||||
if (idx < 0) {
|
||||
ReportError(NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
_("Disk index %d is negative"), idx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0, k = idx; k >= 0; ++i, k = k / 26 - 1) { }
|
||||
|
||||
offset = strlen(prefix);
|
||||
|
||||
if (VIR_ALLOC_N(name, offset + i + 1)) {
|
||||
virReportOOMError(NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
strcpy(name, prefix);
|
||||
name[offset + i] = '\0';
|
||||
|
||||
for (i = i - 1, k = idx; k >= 0; --i, k = k / 26 - 1) {
|
||||
name[offset + i] = 'a' + (k % 26);
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
#ifndef AI_CANONIDN
|
||||
#define AI_CANONIDN 0
|
||||
#endif
|
||||
|
@ -186,7 +186,7 @@ void virGenerateMacAddr(const unsigned char *prefix,
|
||||
unsigned char *addr);
|
||||
|
||||
int virDiskNameToIndex(const char* str);
|
||||
|
||||
char *virIndexToDiskName(int idx, const char *prefix);
|
||||
|
||||
int virEnumFromString(const char *const*types,
|
||||
unsigned int ntypes,
|
||||
|
@ -9,8 +9,8 @@
|
||||
#include "internal.h"
|
||||
#include "memory.h"
|
||||
#include "testutils.h"
|
||||
#include "util.h"
|
||||
#include "esx/esx_util.h"
|
||||
#include "esx/esx_vmx.h"
|
||||
|
||||
static char *progname;
|
||||
|
||||
@ -47,7 +47,7 @@ testIndexToDiskName(const void *data ATTRIBUTE_UNUSED)
|
||||
for (i = 0; i < ARRAY_CARDINALITY(names); ++i) {
|
||||
VIR_FREE(name);
|
||||
|
||||
name = esxVMX_IndexToDiskName(NULL, i, "sd");
|
||||
name = virIndexToDiskName(i, "sd");
|
||||
|
||||
if (STRNEQ(names[i], name)) {
|
||||
virtTestDifference(stderr, names[i], name);
|
||||
@ -55,8 +55,31 @@ testIndexToDiskName(const void *data ATTRIBUTE_UNUSED)
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
VIR_FREE(name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
testDiskNameToIndex(const void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
int i, k;
|
||||
char *name = NULL;
|
||||
|
||||
for (i = 0; i < 100000; ++i) {
|
||||
VIR_FREE(name);
|
||||
|
||||
name = virIndexToDiskName(i, "sd");
|
||||
k = virDiskNameToIndex(name);
|
||||
|
||||
if (k != i) {
|
||||
if (virtTestGetDebug() > 0) {
|
||||
fprintf(stderr, "\nExpect [%d]\n", i);
|
||||
fprintf(stderr, "Actual [%d]\n", k);
|
||||
}
|
||||
|
||||
if (virDiskNameToIndex(name) != i) {
|
||||
VIR_FREE(name);
|
||||
|
||||
return -1;
|
||||
@ -170,6 +193,7 @@ mymain(int argc, char **argv)
|
||||
} while (0)
|
||||
|
||||
DO_TEST(IndexToDiskName);
|
||||
DO_TEST(DiskNameToIndex);
|
||||
DO_TEST(ParseDatastoreRelatedPath);
|
||||
|
||||
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
|
Loading…
Reference in New Issue
Block a user