As a preparation to get statistics without domain lock. Without
this lock we can't use disk definition.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy(a)virtuozzo.com>
---
src/vz/vz_driver.c | 15 +++++++++++++--
src/vz/vz_sdk.c | 21 ++++++++++++++++-----
src/vz/vz_sdk.h | 3 ++-
3 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 177a57a..725076f 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -1274,6 +1274,7 @@ vzDomainBlockStats(virDomainPtr domain, const char *path,
int ret = -1;
size_t i;
int idx;
+ char *disk = NULL;
if (!(dom = vzDomObjFromDomainRef(domain)))
return -1;
@@ -1283,7 +1284,11 @@ vzDomainBlockStats(virDomainPtr domain, const char *path,
virReportError(VIR_ERR_INVALID_ARG, _("invalid path: %s"), path);
goto cleanup;
}
- if (prlsdkGetBlockStats(dom, dom->def->disks[idx], stats) < 0)
+
+ if (!(disk = prlsdkGetDiskStatName(dom->def->disks[idx])))
+ goto cleanup;
+
+ if (prlsdkGetBlockStats(dom, disk, stats) < 0)
goto cleanup;
} else {
virDomainBlockStatsStruct s;
@@ -1296,7 +1301,10 @@ vzDomainBlockStats(virDomainPtr domain, const char *path,
#undef PARALLELS_ZERO_STATS
for (i = 0; i < dom->def->ndisks; i++) {
- if (prlsdkGetBlockStats(dom, dom->def->disks[i], &s) < 0)
+ if (!(disk = prlsdkGetDiskStatName(dom->def->disks[i])))
+ goto cleanup;
+
+ if (prlsdkGetBlockStats(dom, disk, &s) < 0)
goto cleanup;
#define PARALLELS_SUM_STATS(VAR, TYPE, NAME) \
@@ -1306,6 +1314,8 @@ vzDomainBlockStats(virDomainPtr domain, const char *path,
PARALLELS_BLOCK_STATS_FOREACH(PARALLELS_SUM_STATS)
#undef PARALLELS_SUM_STATS
+
+ VIR_FREE(disk);
}
}
stats->errs = -1;
@@ -1314,6 +1324,7 @@ vzDomainBlockStats(virDomainPtr domain, const char *path,
cleanup:
if (dom)
virDomainObjEndAPI(&dom);
+ VIR_FREE(disk);
return ret;
}
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 6c05698..b7627e7 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -4075,13 +4075,11 @@ prlsdkGetStatsParam(virDomainObjPtr dom, const char *name, long
long *val)
return -1;
}
-int
-prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr
stats)
+char* prlsdkGetDiskStatName(virDomainDiskDefPtr disk)
{
virDomainDeviceDriveAddressPtr address;
int idx;
const char *prefix;
- int ret = -1;
char *name = NULL;
address = &disk->info.addr.drive;
@@ -4101,12 +4099,25 @@ prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk,
virDomainBloc
default:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unknown disk bus: %X"), disk->bus);
- goto cleanup;
+ return NULL;
}
+ if (virAsprintf(&name, "%s%d", prefix, idx) < 0)
+ return NULL;
+
+ return name;
+}
+
+int
+prlsdkGetBlockStats(virDomainObjPtr dom,
+ const char *disk,
+ virDomainBlockStatsPtr stats)
+{
+ int ret = -1;
+ char *name = NULL;
#define PRLSDK_GET_STAT_PARAM(VAL, TYPE, NAME) \
- if (virAsprintf(&name, "devices.%s%d.%s", prefix, idx, NAME) < 0)
\
+ if (virAsprintf(&name, "devices.%s.%s", disk, NAME) < 0)
\
goto cleanup; \
if (prlsdkGetStatsParam(dom, name, &stats->VAL) < 0) \
goto cleanup; \
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
index f570560..033a3fe 100644
--- a/src/vz/vz_sdk.h
+++ b/src/vz/vz_sdk.h
@@ -66,8 +66,9 @@ int
prlsdkAttachVolume(vzDriverPtr driver, virDomainObjPtr dom, virDomainDiskDefPtr disk);
int
prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
+char* prlsdkGetDiskStatName(virDomainDiskDefPtr disk);
int
-prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr
stats);
+prlsdkGetBlockStats(virDomainObjPtr dom, const char *disk, virDomainBlockStatsPtr
stats);
int
prlsdkAttachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net);
int
--
1.8.3.1