Devel
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- 32 participants
- 40376 discussions
11 Jul '12
From: "Daniel P. Berrange" <berrange(a)redhat.com>
To make it easier to dynamically change the command line ARGV,
switch all storage code over to use virCommandPtr APIs for
running programs
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
src/storage/storage_backend.c | 15 +--
src/storage/storage_backend.h | 5 +-
src/storage/storage_backend_disk.c | 93 +++++++--------
src/storage/storage_backend_fs.c | 134 +++++++++-----------
src/storage/storage_backend_iscsi.c | 107 +++++++++-------
src/storage/storage_backend_logical.c | 225 ++++++++++++++++++---------------
6 files changed, 294 insertions(+), 285 deletions(-)
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index e2e9b51..e0ff717 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -57,7 +57,6 @@
#include "storage_backend.h"
#include "logging.h"
#include "virfile.h"
-#include "command.h"
#if WITH_STORAGE_LVM
# include "storage_backend_logical.h"
@@ -1418,7 +1417,7 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool,
*/
int
virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
- const char *const*prog,
+ virCommandPtr cmd,
int nregex,
const char **regex,
int *nvars,
@@ -1433,7 +1432,6 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
int maxReg = 0, i, j;
int totgroups = 0, ngroup = 0, maxvars = 0;
char **groups;
- virCommandPtr cmd = NULL;
/* Compile all regular expressions */
if (VIR_ALLOC_N(reg, nregex) < 0) {
@@ -1470,7 +1468,6 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
goto cleanup;
}
- cmd = virCommandNewArgs(prog);
virCommandSetOutputFD(cmd, &fd);
if (virCommandRunAsync(cmd, NULL) < 0) {
goto cleanup;
@@ -1541,7 +1538,6 @@ cleanup:
regfree(®[i]);
VIR_FREE(reg);
- virCommandFree(cmd);
VIR_FORCE_FCLOSE(list);
VIR_FORCE_CLOSE(fd);
@@ -1562,7 +1558,7 @@ cleanup:
*/
int
virStorageBackendRunProgNul(virStoragePoolObjPtr pool,
- const char **prog,
+ virCommandPtr cmd,
size_t n_columns,
virStorageBackendListVolNulFunc func,
void *data)
@@ -1573,7 +1569,6 @@ virStorageBackendRunProgNul(virStoragePoolObjPtr pool,
char **v;
int ret = -1;
int i;
- virCommandPtr cmd = NULL;
if (n_columns == 0)
return -1;
@@ -1585,7 +1580,6 @@ virStorageBackendRunProgNul(virStoragePoolObjPtr pool,
for (i = 0; i < n_columns; i++)
v[i] = NULL;
- cmd = virCommandNewArgs(prog);
virCommandSetOutputFD(cmd, &fd);
if (virCommandRunAsync(cmd, NULL) < 0) {
goto cleanup;
@@ -1623,8 +1617,8 @@ virStorageBackendRunProgNul(virStoragePoolObjPtr pool,
}
if (feof (fp) < 0) {
- virReportSystemError(errno,
- _("read error on pipe to '%s'"), prog[0]);
+ virReportSystemError(errno, "%s",
+ _("read error on pipe"));
goto cleanup;
}
@@ -1633,7 +1627,6 @@ virStorageBackendRunProgNul(virStoragePoolObjPtr pool,
for (i = 0; i < n_columns; i++)
VIR_FREE(v[i]);
VIR_FREE(v);
- virCommandFree(cmd);
VIR_FORCE_FCLOSE(fp);
VIR_FORCE_CLOSE(fd);
diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h
index a37bf7c..4c371fb 100644
--- a/src/storage/storage_backend.h
+++ b/src/storage/storage_backend.h
@@ -27,6 +27,7 @@
# include <stdint.h>
# include "internal.h"
# include "storage_conf.h"
+# include "command.h"
typedef char * (*virStorageBackendFindPoolSources)(virConnectPtr conn, const char *srcSpec, unsigned int flags);
typedef int (*virStorageBackendCheckPool)(virConnectPtr conn, virStoragePoolObjPtr pool, bool *active);
@@ -141,7 +142,7 @@ typedef int (*virStorageBackendListVolNulFunc)(virStoragePoolObjPtr pool,
void *data);
int virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
- const char *const*prog,
+ virCommandPtr cmd,
int nregex,
const char **regex,
int *nvars,
@@ -149,7 +150,7 @@ int virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
void *data, const char *cmd_to_ignore);
int virStorageBackendRunProgNul(virStoragePoolObjPtr pool,
- const char **prog,
+ virCommandPtr cmd,
size_t n_columns,
virStorageBackendListVolNulFunc func,
void *data);
diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c
index 995ad2f..ecc51fd 100644
--- a/src/storage/storage_backend_disk.c
+++ b/src/storage/storage_backend_disk.c
@@ -269,17 +269,20 @@ virStorageBackendDiskReadPartitions(virStoragePoolObjPtr pool,
* - normal metadata 100027630080 100030242304 2612736
*
*/
- const char *prog[] = {
- PARTHELPER, pool->def->source.devices[0].path, NULL,
- };
+ virCommandPtr cmd = virCommandNewArgList(PARTHELPER,
+ pool->def->source.devices[0].path,
+ NULL);
+ int ret;
pool->def->allocation = pool->def->capacity = pool->def->available = 0;
- return virStorageBackendRunProgNul(pool,
- prog,
- 6,
- virStorageBackendDiskMakeVol,
- vol);
+ ret = virStorageBackendRunProgNul(pool,
+ cmd,
+ 6,
+ virStorageBackendDiskMakeVol,
+ vol);
+ virCommandFree(cmd);
+ return ret;
}
static int
@@ -299,15 +302,19 @@ virStorageBackendDiskMakePoolGeometry(virStoragePoolObjPtr pool,
static int
virStorageBackendDiskReadGeometry(virStoragePoolObjPtr pool)
{
- const char *prog[] = {
- PARTHELPER, pool->def->source.devices[0].path, "-g", NULL,
- };
-
- return virStorageBackendRunProgNul(pool,
- prog,
- 3,
- virStorageBackendDiskMakePoolGeometry,
- NULL);
+ virCommandPtr cmd = virCommandNewArgList(PARTHELPER,
+ pool->def->source.devices[0].path,
+ "-g",
+ NULL);
+ int ret;
+
+ ret = virStorageBackendRunProgNul(pool,
+ cmd,
+ 3,
+ virStorageBackendDiskMakePoolGeometry,
+ NULL);
+ virCommandFree(cmd);
+ return ret;
}
static int
@@ -379,15 +386,13 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
bool ok_to_mklabel = false;
int ret = -1;
/* eg parted /dev/sda mklabel msdos */
- const char *prog[] = {
- PARTED,
- pool->def->source.devices[0].path,
- "mklabel",
- "--script",
- ((pool->def->source.format == VIR_STORAGE_POOL_DISK_DOS) ? "msdos" :
- virStoragePoolFormatDiskTypeToString(pool->def->source.format)),
- NULL,
- };
+ virCommandPtr cmd = virCommandNewArgList(PARTED,
+ pool->def->source.devices[0].path,
+ "mklabel",
+ "--script",
+ ((pool->def->source.format == VIR_STORAGE_POOL_DISK_DOS) ? "msdos" :
+ virStoragePoolFormatDiskTypeToString(pool->def->source.format)),
+ NULL);
virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE |
VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret);
@@ -419,9 +424,10 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
}
if (ok_to_mklabel)
- ret = virRun(prog, NULL);
+ ret = virCommandRun(cmd, NULL);
error:
+ virCommandFree(cmd);
return ret;
}
@@ -628,20 +634,13 @@ virStorageBackendDiskCreateVol(virConnectPtr conn ATTRIBUTE_UNUSED,
virStorageVolDefPtr vol)
{
int res = -1;
- char *start = NULL;
- char *end = NULL;
char *partFormat;
unsigned long long startOffset = 0, endOffset = 0;
- const char *cmdargv[] = {
- PARTED,
- pool->def->source.devices[0].path,
- "mkpart",
- "--script",
- NULL /*partFormat*/,
- NULL /*start*/,
- NULL /*end*/,
- NULL
- };
+ virCommandPtr cmd = virCommandNewArgList(PARTED,
+ pool->def->source.devices[0].path,
+ "mkpart",
+ "--script",
+ NULL);
if (vol->target.encryption != NULL) {
virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -653,7 +652,7 @@ virStorageBackendDiskCreateVol(virConnectPtr conn ATTRIBUTE_UNUSED,
if (virStorageBackendDiskPartFormat(pool, vol, &partFormat) != 0) {
return -1;
}
- cmdargv[4] = partFormat;
+ virCommandAddArg(cmd, partFormat);
if (virStorageBackendDiskPartBoundries(pool, &startOffset,
&endOffset,
@@ -661,15 +660,10 @@ virStorageBackendDiskCreateVol(virConnectPtr conn ATTRIBUTE_UNUSED,
goto cleanup;
}
- if (virAsprintf(&start, "%lluB", startOffset) < 0 ||
- virAsprintf(&end, "%lluB", endOffset) < 0) {
- virReportOOMError();
- goto cleanup;
- }
- cmdargv[5] = start;
- cmdargv[6] = end;
+ virCommandAddArgFormat(cmd, "%lluB", startOffset);
+ virCommandAddArgFormat(cmd, "%lluB", endOffset);
- if (virRun(cmdargv, NULL) < 0)
+ if (virCommandRun(cmd, NULL) < 0)
goto cleanup;
/* wait for device node to show up */
@@ -690,8 +684,7 @@ virStorageBackendDiskCreateVol(virConnectPtr conn ATTRIBUTE_UNUSED,
cleanup:
VIR_FREE(partFormat);
- VIR_FREE(start);
- VIR_FREE(end);
+ virCommandFree(cmd);
return res;
}
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 4894994..b6ca858 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -251,10 +251,10 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSE
.sources = NULL
}
};
- const char *prog[] = { SHOWMOUNT, "--no-headers", "--exports", NULL, NULL };
virStoragePoolSourcePtr source = NULL;
char *retval = NULL;
unsigned int i;
+ virCommandPtr cmd = NULL;
virCheckFlags(0, NULL);
@@ -270,9 +270,14 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSE
}
state.host = source->hosts[0].name;
- prog[3] = source->hosts[0].name;
- if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars,
+ cmd = virCommandNewArgList(SHOWMOUNT,
+ "--no-headers",
+ "--exports",
+ source->hosts[0].name,
+ NULL);
+
+ if (virStorageBackendRunProgRegex(NULL, cmd, 1, regexes, vars,
virStorageBackendFileSystemNetFindPoolSourcesFunc,
&state, NULL) < 0)
goto cleanup;
@@ -289,7 +294,7 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSE
VIR_FREE(state.list.sources);
virStoragePoolSourceFree(source);
-
+ virCommandFree(cmd);
return retval;
}
@@ -337,63 +342,16 @@ virStorageBackendFileSystemIsMounted(virStoragePoolObjPtr pool) {
*/
static int
virStorageBackendFileSystemMount(virStoragePoolObjPtr pool) {
- char *src;
- const char **mntargv;
-
+ char *src = NULL;
/* 'mount -t auto' doesn't seem to auto determine nfs (or cifs),
* while plain 'mount' does. We have to craft separate argvs to
* accommodate this */
- int netauto = (pool->def->type == VIR_STORAGE_POOL_NETFS &&
- pool->def->source.format == VIR_STORAGE_POOL_NETFS_AUTO);
- int glusterfs = (pool->def->type == VIR_STORAGE_POOL_NETFS &&
- pool->def->source.format == VIR_STORAGE_POOL_NETFS_GLUSTERFS);
-
- int source_index;
-
- const char *netfs_auto_argv[] = {
- MOUNT,
- NULL, /* source path */
- pool->def->target.path,
- NULL,
- };
-
- const char *fs_argv[] = {
- MOUNT,
- "-t",
- pool->def->type == VIR_STORAGE_POOL_FS ?
- virStoragePoolFormatFileSystemTypeToString(pool->def->source.format) :
- virStoragePoolFormatFileSystemNetTypeToString(pool->def->source.format),
- NULL, /* Fill in shortly - careful not to add extra fields
- before this */
- pool->def->target.path,
- NULL,
- };
-
- const char *glusterfs_argv[] = {
- MOUNT,
- "-t",
- pool->def->type == VIR_STORAGE_POOL_FS ?
- virStoragePoolFormatFileSystemTypeToString(pool->def->source.format) :
- virStoragePoolFormatFileSystemNetTypeToString(pool->def->source.format),
- NULL,
- "-o",
- "direct-io-mode=1",
- pool->def->target.path,
- NULL,
- };
-
- if (netauto) {
- mntargv = netfs_auto_argv;
- source_index = 1;
- } else if (glusterfs) {
- mntargv = glusterfs_argv;
- source_index = 3;
- } else {
- mntargv = fs_argv;
- source_index = 3;
- }
-
- int ret;
+ bool netauto = (pool->def->type == VIR_STORAGE_POOL_NETFS &&
+ pool->def->source.format == VIR_STORAGE_POOL_NETFS_AUTO);
+ bool glusterfs = (pool->def->type == VIR_STORAGE_POOL_NETFS &&
+ pool->def->source.format == VIR_STORAGE_POOL_NETFS_GLUSTERFS);
+ virCommandPtr cmd = NULL;
+ int ret = -1;
if (pool->def->type == VIR_STORAGE_POOL_NETFS) {
if (pool->def->source.nhost != 1) {
@@ -441,14 +399,41 @@ virStorageBackendFileSystemMount(virStoragePoolObjPtr pool) {
return -1;
}
}
- mntargv[source_index] = src;
- if (virRun(mntargv, NULL) < 0) {
- VIR_FREE(src);
- return -1;
- }
+ if (netauto)
+ cmd = virCommandNewArgList(MOUNT,
+ src,
+ pool->def->target.path,
+ NULL);
+ else if (glusterfs)
+ cmd = virCommandNewArgList( MOUNT,
+ "-t",
+ (pool->def->type == VIR_STORAGE_POOL_FS ?
+ virStoragePoolFormatFileSystemTypeToString(pool->def->source.format) :
+ virStoragePoolFormatFileSystemNetTypeToString(pool->def->source.format)),
+ src,
+ "-o",
+ "direct-io-mode=1",
+ pool->def->target.path,
+ NULL);
+ else
+ cmd = virCommandNewArgList(MOUNT,
+ "-t",
+ (pool->def->type == VIR_STORAGE_POOL_FS ?
+ virStoragePoolFormatFileSystemTypeToString(pool->def->source.format) :
+ virStoragePoolFormatFileSystemNetTypeToString(pool->def->source.format)),
+ src,
+ pool->def->target.path,
+ NULL);
+
+ if (virCommandRun(cmd, NULL) < 0)
+ goto cleanup;
+
+ ret = 0;
+cleanup:
+ virCommandFree(cmd);
VIR_FREE(src);
- return 0;
+ return ret;
}
/**
@@ -462,8 +447,8 @@ virStorageBackendFileSystemMount(virStoragePoolObjPtr pool) {
*/
static int
virStorageBackendFileSystemUnmount(virStoragePoolObjPtr pool) {
- const char *mntargv[3];
- int ret;
+ virCommandPtr cmd = NULL;
+ int ret = -1;
if (pool->def->type == VIR_STORAGE_POOL_NETFS) {
if (pool->def->source.nhost != 1) {
@@ -497,14 +482,17 @@ virStorageBackendFileSystemUnmount(virStoragePoolObjPtr pool) {
return 0;
}
- mntargv[0] = UMOUNT;
- mntargv[1] = pool->def->target.path;
- mntargv[2] = NULL;
+ cmd = virCommandNewArgList(UMOUNT,
+ pool->def->target.path,
+ NULL);
- if (virRun(mntargv, NULL) < 0) {
- return -1;
- }
- return 0;
+ if (virCommandRun(cmd, NULL) < 0)
+ goto cleanup;
+
+ ret = 0;
+cleanup:
+ virCommandFree(cmd);
+ return ret;
}
#endif /* WITH_STORAGE_FS */
diff --git a/src/storage/storage_backend_iscsi.c b/src/storage/storage_backend_iscsi.c
index e286c84..88de9fd 100644
--- a/src/storage/storage_backend_iscsi.c
+++ b/src/storage/storage_backend_iscsi.c
@@ -151,31 +151,32 @@ virStorageBackendISCSISession(virStoragePoolObjPtr pool,
int vars[] = {
2,
};
- const char *const prog[] = {
- ISCSIADM, "--mode", "session", NULL
- };
char *session = NULL;
+ virCommandPtr cmd = virCommandNewArgList(ISCSIADM, "--mode", "session", NULL);
+
/* Note that we ignore the exitstatus. Older versions of iscsiadm tools
* returned an exit status of > 0, even if they succeeded. We will just
* rely on whether session got filled in properly.
*/
if (virStorageBackendRunProgRegex(pool,
- prog,
+ cmd,
1,
regexes,
vars,
virStorageBackendISCSIExtractSession,
&session, NULL) < 0)
- return NULL;
+ goto cleanup;
if (session == NULL &&
!probe) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("cannot find session"));
- return NULL;
+ goto cleanup;
}
+cleanup:
+ virCommandFree(cmd);
return session;
}
@@ -279,42 +280,52 @@ virStorageBackendCreateIfaceIQN(const char *initiatoriqn,
char **ifacename)
{
int ret = -1, exitstatus = -1;
- char temp_ifacename[32];
- const char *const cmdargv1[] = {
- ISCSIADM, "--mode", "iface", "--interface",
- temp_ifacename, "--op", "new", NULL
- };
- const char *const cmdargv2[] = {
- ISCSIADM, "--mode", "iface", "--interface", temp_ifacename,
- "--op", "update", "--name", "iface.initiatorname", "--value",
- initiatoriqn, NULL
- };
+ char *temp_ifacename;
+ virCommandPtr cmd = NULL;
- snprintf(temp_ifacename, sizeof(temp_ifacename), "libvirt-iface-%08llx",
- (unsigned long long)virRandomBits(30));
+ if (virAsprintf(&temp_ifacename,
+ "libvirt-iface-%08llx",
+ (unsigned long long)virRandomBits(30)) < 0) {
+ virReportOOMError();
+ return -1;
+ }
VIR_DEBUG("Attempting to create interface '%s' with IQN '%s'",
- &temp_ifacename[0], initiatoriqn);
+ temp_ifacename, initiatoriqn);
+ cmd = virCommandNewArgList(ISCSIADM,
+ "--mode", "iface",
+ "--interface", temp_ifacename,
+ "--op", "new",
+ NULL);
/* Note that we ignore the exitstatus. Older versions of iscsiadm
* tools returned an exit status of > 0, even if they succeeded.
* We will just rely on whether the interface got created
* properly. */
- if (virRun(cmdargv1, &exitstatus) < 0) {
+ if (virCommandRun(cmd, &exitstatus) < 0) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to run command '%s' to create new iscsi interface"),
- cmdargv1[0]);
- goto out;
+ ISCSIADM);
+ goto cleanup;
}
+ virCommandFree(cmd);
+ cmd = virCommandNewArgList(ISCSIADM,
+ "--mode", "iface",
+ "--interface", temp_ifacename,
+ "--op", "update",
+ "--name", "iface.initiatorname",
+ "--value",
+ initiatoriqn,
+ NULL);
/* Note that we ignore the exitstatus. Older versions of iscsiadm tools
* returned an exit status of > 0, even if they succeeded. We will just
* rely on whether iface file got updated properly. */
- if (virRun(cmdargv2, &exitstatus) < 0) {
+ if (virCommandRun(cmd, &exitstatus) < 0) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to run command '%s' to update iscsi interface with IQN '%s'"),
- cmdargv2[0], initiatoriqn);
- goto out;
+ ISCSIADM, initiatoriqn);
+ goto cleanup;
}
/* Check again to make sure the interface was created. */
@@ -322,7 +333,7 @@ virStorageBackendCreateIfaceIQN(const char *initiatoriqn,
VIR_DEBUG("Failed to find interface '%s' with IQN '%s' "
"after attempting to create it",
&temp_ifacename[0], initiatoriqn);
- goto out;
+ goto cleanup;
} else {
VIR_DEBUG("Interface '%s' with IQN '%s' was created successfully",
*ifacename, initiatoriqn);
@@ -330,7 +341,9 @@ virStorageBackendCreateIfaceIQN(const char *initiatoriqn,
ret = 0;
-out:
+cleanup:
+ virCommandFree(cmd);
+ VIR_FREE(temp_ifacename);
if (ret != 0)
VIR_FREE(*ifacename);
return ret;
@@ -426,14 +439,14 @@ static int
virStorageBackendISCSIRescanLUNs(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
const char *session)
{
- const char *const cmdargv[] = {
- ISCSIADM, "--mode", "session", "-r", session, "-R", NULL,
- };
-
- if (virRun(cmdargv, NULL) < 0)
- return -1;
-
- return 0;
+ virCommandPtr cmd = virCommandNewArgList(ISCSIADM,
+ "--mode", "session",
+ "-r", session,
+ "-R",
+ NULL);
+ int ret = virCommandRun(cmd, NULL);
+ virCommandFree(cmd);
+ return ret;
}
struct virStorageBackendISCSITargetList {
@@ -501,24 +514,25 @@ virStorageBackendISCSIScanTargets(const char *portal,
"^\\s*(\\S+)\\s+(\\S+)\\s*$"
};
int vars[] = { 2 };
- const char *const cmdsendtarget[] = {
- ISCSIADM, "--mode", "discovery", "--type", "sendtargets",
- "--portal", portal, NULL
- };
struct virStorageBackendISCSITargetList list;
- int i;
+ size_t i;
+ int ret = -1;
+ virCommandPtr cmd = virCommandNewArgList(ISCSIADM,
+ "--mode", "discovery",
+ "--type", "sendtargets",
+ "--portal", portal,
+ NULL);
memset(&list, 0, sizeof(list));
if (virStorageBackendRunProgRegex(NULL, /* No pool for callback */
- cmdsendtarget,
+ cmd,
1,
regexes,
vars,
virStorageBackendISCSIGetTargets,
- &list, NULL) < 0) {
- return -1;
- }
+ &list, NULL) < 0)
+ goto cleanup;
for (i = 0 ; i < list.ntargets ; i++) {
/* We have to ignore failure, because we can't undo
@@ -542,7 +556,10 @@ virStorageBackendISCSIScanTargets(const char *portal,
VIR_FREE(list.targets);
}
- return 0;
+ ret = 0;
+cleanup:
+ virCommandFree(cmd);
+ return ret;
}
diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
index 9a91dd9..9fe769b 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -48,17 +48,16 @@ static int
virStorageBackendLogicalSetActive(virStoragePoolObjPtr pool,
int on)
{
- const char *cmdargv[4];
-
- cmdargv[0] = VGCHANGE;
- cmdargv[1] = on ? "-aly" : "-aln";
- cmdargv[2] = pool->def->source.name;
- cmdargv[3] = NULL;
-
- if (virRun(cmdargv, NULL) < 0)
- return -1;
-
- return 0;
+ int ret;
+ virCommandPtr cmd =
+ virCommandNewArgList(VGCHANGE,
+ on ? "-aly" : "-aln",
+ pool->def->source.name,
+ NULL);
+
+ ret = virCommandRun(cmd, NULL);
+ virCommandFree(cmd);
+ return ret;
}
@@ -296,24 +295,31 @@ virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
int vars[] = {
8
};
- const char *prog[] = {
- LVS, "--separator", "#", "--noheadings", "--units", "b",
- "--unbuffered", "--nosuffix", "--options",
- "lv_name,origin,uuid,devices,segtype,stripes,seg_size,vg_extent_size",
- pool->def->source.name, NULL
- };
-
+ int ret = -1;
+ virCommandPtr cmd;
+
+ cmd = virCommandNewArgList(LVS,
+ "--separator", "#",
+ "--noheadings",
+ "--units", "b",
+ "--unbuffered",
+ "--nosuffix",
+ "--options", "lv_name,origin,uuid,devices,segtype,stripes,seg_size,vg_extent_size",
+ pool->def->source.name,
+ NULL);
if (virStorageBackendRunProgRegex(pool,
- prog,
+ cmd,
1,
regexes,
vars,
virStorageBackendLogicalMakeVol,
- vol, "lvs") < 0) {
- return -1;
- }
+ vol, "lvs") < 0)
+ goto cleanup;
- return 0;
+ ret = 0;
+cleanup:
+ virCommandFree(cmd);
+ return ret;
}
static int
@@ -405,8 +411,7 @@ virStorageBackendLogicalFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED,
int vars[] = {
2
};
- const char *const prog[] = { PVS, "--noheadings", "-o", "pv_name,vg_name", NULL };
- const char *const scanprog[] = { VGSCAN, NULL };
+ virCommandPtr cmd;
char *retval = NULL;
virStoragePoolSourceList sourceList;
int i;
@@ -418,17 +423,25 @@ virStorageBackendLogicalFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED,
* that might be hanging around, so if this fails for some reason, the
* worst that happens is that scanning doesn't pick everything up
*/
- if (virRun(scanprog, NULL) < 0) {
+ cmd = virCommandNew(VGSCAN);
+ if (virCommandRun(cmd, NULL) < 0)
VIR_WARN("Failure when running vgscan to refresh physical volumes");
- }
+ virCommandFree(cmd);
memset(&sourceList, 0, sizeof(sourceList));
sourceList.type = VIR_STORAGE_POOL_LOGICAL;
- if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars,
- virStorageBackendLogicalFindPoolSourcesFunc,
- &sourceList, "pvs") < 0)
+ cmd = virCommandNewArgList(PVS,
+ "--noheadings",
+ "-o", "pv_name,vg_name",
+ NULL);
+ if (virStorageBackendRunProgRegex(NULL, cmd, 1, regexes, vars,
+ virStorageBackendLogicalFindPoolSourcesFunc,
+ &sourceList, "pvs") < 0) {
+ virCommandFree(cmd);
return NULL;
+ }
+ virCommandFree(cmd);
retval = virStoragePoolSourceListFormat(&sourceList);
if (retval == NULL) {
@@ -483,26 +496,20 @@ virStorageBackendLogicalBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool,
unsigned int flags)
{
- const char **vgargv;
- const char *pvargv[3];
- int n = 0, i, fd;
+ virCommandPtr vgcmd;
+ int fd;
char zeros[PV_BLANK_SECTOR_SIZE];
+ int ret = -1;
+ size_t i;
virCheckFlags(0, -1);
memset(zeros, 0, sizeof(zeros));
- if (VIR_ALLOC_N(vgargv, 3 + pool->def->source.ndevice) < 0) {
- virReportOOMError();
- return -1;
- }
+ vgcmd = virCommandNewArgList(VGCREATE, pool->def->source.name, NULL);
- vgargv[n++] = VGCREATE;
- vgargv[n++] = pool->def->source.name;
-
- pvargv[0] = PVCREATE;
- pvargv[2] = NULL;
for (i = 0 ; i < pool->def->source.ndevice ; i++) {
+ virCommandPtr pvcmd;
/*
* LVM requires that the first sector is blanked if using
* a whole disk as a PV. So we just blank them out regardless
@@ -539,25 +546,27 @@ virStorageBackendLogicalBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
* Initialize the physical volume because vgcreate is not
* clever enough todo this for us :-(
*/
- vgargv[n++] = pool->def->source.devices[i].path;
- pvargv[1] = pool->def->source.devices[i].path;
- if (virRun(pvargv, NULL) < 0)
+ pvcmd = virCommandNewArgList(PVCREATE,
+ pool->def->source.devices[i].path,
+ NULL);
+ if (virCommandRun(pvcmd, NULL) < 0) {
+ virCommandFree(pvcmd);
goto cleanup;
- }
+ }
+ virCommandFree(pvcmd);
- vgargv[n] = NULL;
+ virCommandAddArg(vgcmd, pool->def->source.devices[i].path);
+ }
/* Now create the volume group itself */
- if (virRun(vgargv, NULL) < 0)
+ if (virCommandRun(vgcmd, NULL) < 0)
goto cleanup;
- VIR_FREE(vgargv);
-
- return 0;
+ ret = 0;
- cleanup:
- VIR_FREE(vgargv);
- return -1;
+cleanup:
+ virCommandFree(vgcmd);
+ return ret;
}
@@ -579,33 +588,42 @@ virStorageBackendLogicalRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
int vars[] = {
2
};
- const char *prog[] = {
- VGS, "--separator", ":", "--noheadings", "--units", "b", "--unbuffered",
- "--nosuffix", "--options", "vg_size,vg_free",
- pool->def->source.name, NULL
- };
+ virCommandPtr cmd = NULL;
+ int ret = -1;
virFileWaitForDevices();
/* Get list of all logical volumes */
- if (virStorageBackendLogicalFindLVs(pool, NULL) < 0) {
- virStoragePoolObjClearVols(pool);
- return -1;
- }
+ if (virStorageBackendLogicalFindLVs(pool, NULL) < 0)
+ goto cleanup;
+
+ cmd = virCommandNewArgList(VGS,
+ "--separator", ":",
+ "--noheadings",
+ "--units", "b",
+ "--unbuffered",
+ "--nosuffix",
+ "--options", "vg_size,vg_free",
+ pool->def->source.name,
+ NULL);
/* Now get basic volgrp metadata */
if (virStorageBackendRunProgRegex(pool,
- prog,
+ cmd,
1,
regexes,
vars,
virStorageBackendLogicalRefreshPoolFunc,
- NULL, "vgs") < 0) {
- virStoragePoolObjClearVols(pool);
- return -1;
- }
+ NULL, "vgs") < 0)
+ goto cleanup;
- return 0;
+ ret = 0;
+
+cleanup:
+ virCommandFree(cmd);
+ if (ret < 0)
+ virStoragePoolObjClearVols(pool);
+ return ret;
}
/*
@@ -628,31 +646,37 @@ virStorageBackendLogicalDeletePool(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool,
unsigned int flags)
{
- const char *cmdargv[] = {
- VGREMOVE, "-f", pool->def->source.name, NULL
- };
- const char *pvargv[3];
- int i, error;
+ virCommandPtr cmd = NULL;
+ size_t i;
+ int ret = -1;
virCheckFlags(0, -1);
/* first remove the volume group */
- if (virRun(cmdargv, NULL) < 0)
- return -1;
+ cmd = virCommandNewArgList(VGREMOVE,
+ "-f", pool->def->source.name,
+ NULL);
+ if (virCommandRun(cmd, NULL) < 0)
+ goto cleanup;
+ virCommandFree(cmd);
/* now remove the pv devices and clear them out */
- error = 0;
- pvargv[0] = PVREMOVE;
- pvargv[2] = NULL;
+ ret = 0;
for (i = 0 ; i < pool->def->source.ndevice ; i++) {
- pvargv[1] = pool->def->source.devices[i].path;
- if (virRun(pvargv, NULL) < 0) {
- error = -1;
+ cmd = virCommandNewArgList(PVREMOVE,
+ pool->def->source.devices[i].path,
+ NULL);
+ if (virCommandRun(cmd, NULL) < 0) {
+ ret = -1;
break;
}
+ virCommandFree(cmd);
+ cmd = NULL;
}
- return error;
+cleanup:
+ virCommandFree(cmd);
+ return ret;
}
@@ -669,16 +693,7 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
virStorageVolDefPtr vol)
{
int fdret, fd = -1;
- char size[100];
- const char *cmdargvnew[] = {
- LVCREATE, "--name", vol->name, "-L", size,
- pool->def->source.name, NULL
- };
- const char *cmdargvsnap[] = {
- LVCREATE, "--name", vol->name, "-L", size,
- "-s", vol->backingStore.path, NULL
- };
- const char **cmdargv = cmdargvnew;
+ virCommandPtr cmd = NULL;
if (vol->target.encryption != NULL) {
virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -687,15 +702,6 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
return -1;
}
- if (vol->backingStore.path) {
- cmdargv = cmdargvsnap;
- }
-
- snprintf(size, sizeof(size)-1, "%lluK", VIR_DIV_UP(vol->capacity, 1024));
- size[sizeof(size)-1] = '\0';
-
- vol->type = VIR_STORAGE_VOL_BLOCK;
-
if (vol->target.path != NULL) {
/* A target path passed to CreateVol has no meaning */
VIR_FREE(vol->target.path);
@@ -708,8 +714,18 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
return -1;
}
- if (virRun(cmdargv, NULL) < 0)
- return -1;
+ cmd = virCommandNewArgList(LVCREATE,
+ "--name", vol->name,
+ NULL);
+ virCommandAddArg(cmd, "-L");
+ virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(vol->capacity, 1024));
+ if (vol->backingStore.path)
+ virCommandAddArgPair(cmd, "-s", vol->backingStore.path);
+ else
+ virCommandAddArg(cmd, pool->def->source.name);
+
+ if (virCommandRun(cmd, NULL) < 0)
+ goto cleanup;
if ((fdret = virStorageBackendVolOpen(vol->target.path)) < 0)
goto cleanup;
@@ -752,6 +768,7 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
cleanup:
VIR_FORCE_CLOSE(fd);
virStorageBackendLogicalDeleteVol(conn, pool, vol, 0);
+ virCommandFree(cmd);
return -1;
}
--
1.7.7.6
2
1
[libvirt] [glib PATCH] Add gvir_connection_domain_restore() and gvir_connection_domain_restore_async()
by Jovanka Gulicoska 11 Jul '12
by Jovanka Gulicoska 11 Jul '12
11 Jul '12
---
libvirt-gobject/libvirt-gobject-connection.c | 136 ++++++++++++++++++++++++++
libvirt-gobject/libvirt-gobject-connection.h | 19 ++++
libvirt-gobject/libvirt-gobject.sym | 3 +
3 files changed, 158 insertions(+)
diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c
index 3a99034..2302328 100644
--- a/libvirt-gobject/libvirt-gobject-connection.c
+++ b/libvirt-gobject/libvirt-gobject-connection.c
@@ -57,6 +57,7 @@ enum {
VIR_CONNECTION_CLOSED,
VIR_DOMAIN_ADDED,
VIR_DOMAIN_REMOVED,
+ VIR_DOMAIN_RESTORED,
LAST_SIGNAL
};
@@ -228,6 +229,15 @@ static void gvir_connection_class_init(GVirConnectionClass *klass)
1,
GVIR_TYPE_DOMAIN);
+ signals[VIR_DOMAIN_RESTORED] = g_signal_new("domain-restored",
+ G_OBJECT_CLASS_TYPE(object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET(GVirConnectionClass, domain_restored),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 0);
+
g_type_class_add_private(klass, sizeof(GVirConnectionPrivate));
}
@@ -1605,3 +1615,129 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
return g_object_ref(caps);
}
+
+/*
+ * gvir_connection_domain_restore
+ */
+gboolean gvir_connection_domain_restore(GVirConnection *conn,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GError **err)
+{
+ GVirConnectionPrivate *priv;
+ gchar *custom_xml;
+ int ret;
+
+ g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
+ g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN (conf), FALSE);
+ g_return_val_if_fail((err == NULL) || (*err == NULL), FALSE);
+
+ priv = conn->priv;
+ custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
+
+ g_return_val_if_fail(custom_xml != NULL, FALSE);
+
+ if(flags || custom_xml) {
+ ret = virDomainRestoreFlags(priv->conn, filename, custom_xml, flags);
+ g_free (custom_xml);
+ }
+ else {
+ ret = virDomainRestore(priv->conn, filename);
+ g_free (custom_xml);
+ }
+
+ if(ret < 0) {
+ gvir_set_error_literal(err, GVIR_CONNECTION_ERROR,
+ 0,
+ "Unable to restore domain");
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+typedef struct {
+ gchar *filename;
+ gchar *custom_xml;
+ guint flags;
+} DomainRestoreFromFileData;
+
+static void domain_restore_from_file_data_free(DomainRestoreFromFileData *data)
+{
+ g_slice_free(DomainRestoreFromFileData, data);
+}
+
+static void
+gvir_connection_domain_restore_helper(GSimpleAsyncResult *res,
+ GObject *object,
+ GCancellable *cancellable G_GNUC_UNUSED)
+{
+ GVirConnection *conn = GVIR_CONNECTION(object);
+ DomainRestoreFromFileData *data;
+ GVirConfigDomain *conf;
+ GError *err = NULL;
+
+ data = g_simple_async_result_get_op_res_gpointer(res);
+ conf = gvir_config_domain_new_from_xml(data->custom_xml, &err);
+
+ if(!gvir_connection_domain_restore(conn, data->filename, conf, data->flags, &err))
+ g_simple_async_result_take_error(res, err);
+}
+
+/*
+ * Async function of gvir_connection_domain_restore
+ */
+void gvir_connection_domain_restore_async(GVirConnection *conn,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *res;
+ DomainRestoreFromFileData *data;
+ gchar *custom_xml;
+
+ g_return_if_fail(GVIR_IS_CONNECTION(conn));
+ g_return_if_fail(GVIR_CONFIG_IS_DOMAIN (conf));
+ g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable));
+
+ custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
+
+ data = g_slice_new0(DomainRestoreFromFileData);
+ data->filename = filename;
+ data->custom_xml = custom_xml;
+ data->flags = flags;
+
+ res = g_simple_async_result_new(G_OBJECT(conn),
+ callback,
+ user_data,
+ gvir_connection_domain_restore_async);
+ g_simple_async_result_set_op_res_gpointer(res, data,
+ (GDestroyNotify)domain_restore_from_file_data_free);
+
+ g_simple_async_result_run_in_thread(res,
+ gvir_connection_domain_restore_helper,
+ G_PRIORITY_DEFAULT,
+ cancellable);
+
+ g_object_unref(res);
+}
+
+gboolean gvir_connection_domain_restore_finish(GVirConnection *conn,
+ GAsyncResult *result,
+ GError **err)
+{
+ g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
+ g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(conn),
+ gvir_connection_domain_restore_async),
+ FALSE);
+
+ if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), err))
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/libvirt-gobject/libvirt-gobject-connection.h b/libvirt-gobject/libvirt-gobject-connection.h
index c80eecf..01d5d0b 100644
--- a/libvirt-gobject/libvirt-gobject-connection.h
+++ b/libvirt-gobject/libvirt-gobject-connection.h
@@ -75,6 +75,8 @@ struct _GVirConnectionClass
void (*domain_added)(GVirConnection *conn, GVirDomain *dom);
void (*domain_removed)(GVirConnection *conn, GVirDomain *dom);
+ void (*domain_restored)(GVirConnection *conn);
+
GVirStream *(*stream_new)(GVirConnection *conn, gpointer handle);
gpointer padding[20];
@@ -202,6 +204,23 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
GAsyncResult *result,
GError **err);
+gboolean gvir_connection_domain_restore(GVirConnection *conn,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GError **err);
+
+void gvir_connection_domain_restore_async(GVirConnection *conn,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean gvir_connection_domain_restore_finish(GVirConnection *conn,
+ GAsyncResult *result,
+ GError **err);
G_END_DECLS
#endif /* __LIBVIRT_GOBJECT_CONNECTION_H__ */
diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym
index 8ff9e24..0aaefa2 100644
--- a/libvirt-gobject/libvirt-gobject.sym
+++ b/libvirt-gobject/libvirt-gobject.sym
@@ -31,6 +31,9 @@ LIBVIRT_GOBJECT_0.0.8 {
gvir_connection_create_storage_pool;
gvir_connection_start_domain;
gvir_connection_get_node_info;
+ gvir_connection_domain_restore;
+ gvir_connection_domain_restore_async;
+ gvir_connection_domain_restore_finish;
gvir_domain_device_get_type;
gvir_domain_device_get_domain;
--
1.7.10.4
2
2
[libvirt] [glib PATCH] Add bindings for virDomainSnapshotCreateXML()
by Jovanka Gulicoska 11 Jul '12
by Jovanka Gulicoska 11 Jul '12
11 Jul '12
---
libvirt-gobject/libvirt-gobject-domain.c | 39 ++++++++++++++++++++++++++++++
libvirt-gobject/libvirt-gobject-domain.h | 4 +++
2 files changed, 43 insertions(+)
diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c
index eda2427..ea621ff 100644
--- a/libvirt-gobject/libvirt-gobject-domain.c
+++ b/libvirt-gobject/libvirt-gobject-domain.c
@@ -1270,3 +1270,42 @@ GList *gvir_domain_get_devices(GVirDomain *domain,
return g_list_reverse (ret);
}
+
+/**
+ * gvir_domain_snapshot_create_xml:
+ * @dom: the domain
+ * @conf: configuration of domain
+ * @flags: the flags
+ * @err: (allow-none):Place-holder for error or NULL
+ *
+ * Returns: snapshot of existing domain
+ */
+GVirConfigDomainSnapshot *gvir_domain_snapshot_create_xml(GVirDomain *dom,
+ GVirConfigDomain *conf,
+ guint flags,
+ GError **err)
+{
+ GVirDomainPrivate *priv;
+ virDomainSnapshot *snapshot;
+ gchar *xml_desc;
+
+ g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE);
+ g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN (conf), FALSE);
+ g_return_val_if_fail(err == NULL || *err == NULL, NULL);
+
+ priv = dom->priv;
+ xml_desc = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
+
+ if(!(snapshot = virDomainSnapshotCreateXML(priv->handle, xml_desc, flags))) {
+ gvir_set_error_literal(err, GVIR_DOMAIN_ERROR,
+ 0,
+ "Unable to create snapshot of domain");
+ return NULL;
+
+ }
+
+ GVirConfigDomainSnapshot *conf_snapshot = gvir_config_domain_snapshot_new_from_xml(xml_desc, err);
+
+ g_free(xml_desc);
+ return conf_snapshot;
+}
diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h
index 49516a7..6540f64 100644
--- a/libvirt-gobject/libvirt-gobject-domain.h
+++ b/libvirt-gobject/libvirt-gobject-domain.h
@@ -220,6 +220,10 @@ gboolean gvir_domain_get_saved(GVirDomain *dom);
GList *gvir_domain_get_devices(GVirDomain *domain,
GError **err);
+GVirConfigDomainSnapshot *gvir_domain_snapshot_create_xml(GVirDomain *dom,
+ GVirConfigDomain *conf,
+ guint flags,
+ GError **err);
G_END_DECLS
#endif /* __LIBVIRT_GOBJECT_DOMAIN_H__ */
--
1.7.10.4
2
1
[libvirt] [glib PATCH V2] Add bindings for virStorageVolDownload() and virStorageVolUpload()
by Jovanka Gulicoska 11 Jul '12
by Jovanka Gulicoska 11 Jul '12
11 Jul '12
---
libvirt-gobject/libvirt-gobject-storage-vol.c | 75 +++++++++++++++++++++++++
libvirt-gobject/libvirt-gobject-storage-vol.h | 14 +++++
libvirt-gobject/libvirt-gobject.h | 1 +
libvirt-gobject/libvirt-gobject.sym | 2 +
4 files changed, 92 insertions(+)
diff --git a/libvirt-gobject/libvirt-gobject-storage-vol.c b/libvirt-gobject/libvirt-gobject-storage-vol.c
index 6f60fcd..7f9aeb7 100644
--- a/libvirt-gobject/libvirt-gobject-storage-vol.c
+++ b/libvirt-gobject/libvirt-gobject-storage-vol.c
@@ -349,3 +349,78 @@ gboolean gvir_storage_vol_resize(GVirStorageVol *vol,
return TRUE;
}
+
+/**
+ * gvir_storage_vol_download:
+ * @vol: the storage volume to download from
+ * @stream: stream to use as output
+ * @offset: position in @vol to start reading from
+ * @length: limit on amount of data to download
+ * @flags: extra flags, not used yet, pass 0
+ *
+ * Returns: #TRUE of success, #FALSE otherwise
+ */
+gboolean gvir_storage_vol_download(GVirStorageVol *vol,
+ GVirStream *stream,
+ unsigned long long offset,
+ unsigned long long length,
+ guint flags,
+ GError **err)
+{
+ virStreamPtr st = NULL;
+
+ g_object_get(stream, "handle", &st, NULL);
+
+ g_return_val_if_fail(GVIR_IS_STORAGE_VOL(vol), FALSE);
+ g_return_val_if_fail(GVIR_IS_STREAM(stream), FALSE);
+ g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
+
+ if(virStorageVolDownload(vol->priv->handle, st, offset, length, 0) < 0) {
+ gvir_set_error_literal(err,
+ GVIR_STORAGE_VOL_ERROR,
+ 0,
+ "Unable to downlaod volume storage");
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gvir_storage_vol_upload:
+ * @vol: the storage volume to upload
+ * @stream: stream to use as input
+ * @offset: position in @vol to start to write to
+ * @length: limit on amount of data to upload
+ * @flags: the flags, not set yet, pass 0
+ *
+ * Returns: #TRUE of success, #FALSE otherwise
+ */
+gboolean gvir_storage_vol_upload(GVirStorageVol *vol,
+ GVirStream *stream,
+ unsigned long long offset,
+ unsigned long long length,
+ guint flags,
+ GError **err)
+{
+ virStreamPtr st = NULL;
+
+ g_object_get(stream, "handle", &st, NULL);
+
+ g_return_val_if_fail(GVIR_IS_STORAGE_VOL(vol), FALSE);
+ g_return_val_if_fail(GVIR_IS_STREAM(stream), FALSE);
+ g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
+
+ if(virStorageVolUpload(vol->priv->handle, st, offset, length, 0) < 0) {
+ gvir_set_error_literal(err,
+ GVIR_STORAGE_VOL_ERROR,
+ 0,
+ "Unable to upload to stream");
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
diff --git a/libvirt-gobject/libvirt-gobject-storage-vol.h b/libvirt-gobject/libvirt-gobject-storage-vol.h
index b425f0a..e156792 100644
--- a/libvirt-gobject/libvirt-gobject-storage-vol.h
+++ b/libvirt-gobject/libvirt-gobject-storage-vol.h
@@ -110,6 +110,20 @@ gboolean gvir_storage_vol_resize(GVirStorageVol *vol,
guint flags,
GError **err);
+gboolean gvir_storage_vol_download(GVirStorageVol *vol,
+ GVirStream *stream,
+ unsigned long long offset,
+ unsigned long long length,
+ guint flags,
+ GError **err);
+
+gboolean gvir_storage_vol_upload(GVirStorageVol *vol,
+ GVirStream *stream,
+ unsigned long long offset,
+ unsigned long long length,
+ guint flags,
+ GError **err);
+
G_END_DECLS
#endif /* __LIBVIRT_GOBJECT_STORAGE_VOL_H__ */
diff --git a/libvirt-gobject/libvirt-gobject.h b/libvirt-gobject/libvirt-gobject.h
index f52cc00..b1158f7 100644
--- a/libvirt-gobject/libvirt-gobject.h
+++ b/libvirt-gobject/libvirt-gobject.h
@@ -44,5 +44,6 @@
#include <libvirt-gobject/libvirt-gobject-storage-pool.h>
#include <libvirt-gobject/libvirt-gobject-connection.h>
#include <libvirt-gobject/libvirt-gobject-manager.h>
+#include <libvirt-gobject/libvirt-gobject-stream.h>
#endif /* __LIBVIRT_GOBJECT_H__ */
diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym
index db32c7f..478881b 100644
--- a/libvirt-gobject/libvirt-gobject.sym
+++ b/libvirt-gobject/libvirt-gobject.sym
@@ -143,6 +143,8 @@ LIBVIRT_GOBJECT_0.0.8 {
gvir_storage_vol_get_info;
gvir_storage_vol_delete;
gvir_storage_vol_resize;
+ gvir_storage_vol_download;
+ gvir_storage_vol_upload;
gvir_connection_handle_get_type;
--
1.7.10.4
2
1
11 Jul '12
---
libvirt-gobject/libvirt-gobject-connection.c | 153 ++++++++++++++++++++++++++
libvirt-gobject/libvirt-gobject-connection.h | 19 ++++
libvirt-gobject/libvirt-gobject.sym | 3 +
3 files changed, 175 insertions(+)
diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c
index 3a99034..6fbf86b 100644
--- a/libvirt-gobject/libvirt-gobject-connection.c
+++ b/libvirt-gobject/libvirt-gobject-connection.c
@@ -1605,3 +1605,156 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
return g_object_ref(caps);
}
+
+/**
+ * gvir_connection_domain_restore:
+ * @conn: a #GVirConnection
+ * @filename: path to input file
+ * @conf: configuration for domain
+ * @flags: the flags
+ *
+ * Returns: TRUE on success, FALSe otherwise
+ */
+gboolean gvir_connection_domain_restore(GVirConnection *conn,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GError **err)
+{
+ GVirConnectionPrivate *priv;
+ gchar *custom_xml;
+ int ret;
+
+ g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
+ g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN (conf), FALSE);
+ g_return_val_if_fail((err == NULL) || (*err == NULL), FALSE);
+
+ priv = conn->priv;
+ custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
+
+ g_return_val_if_fail(custom_xml != NULL, FALSE);
+
+ if(flags || (custom_xml != NULL)) {
+ ret = virDomainRestoreFlags(priv->conn, filename, custom_xml, flags);
+ g_free (custom_xml);
+ }
+ else {
+ ret = virDomainRestore(priv->conn, filename);
+ g_free (custom_xml);
+ }
+
+ if(ret < 0) {
+ gvir_set_error_literal(err, GVIR_CONNECTION_ERROR,
+ 0,
+ "Unable to restore domain");
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+typedef struct {
+ gchar *filename;
+ gchar *custom_xml;
+ guint flags;
+} DomainRestoreFromFileData;
+
+static void domain_restore_from_file_data_free(DomainRestoreFromFileData *data)
+{
+ g_free(data->filename);
+ g_free(data->custom_xml);
+ g_slice_free(DomainRestoreFromFileData, data);
+}
+
+static void
+gvir_connection_domain_restore_helper(GSimpleAsyncResult *res,
+ GObject *object,
+ GCancellable *cancellable G_GNUC_UNUSED)
+{
+ GVirConnection *conn = GVIR_CONNECTION(object);
+ DomainRestoreFromFileData *data;
+ GVirConfigDomain *conf;
+ GError *err = NULL;
+
+ data = g_simple_async_result_get_op_res_gpointer(res);
+ conf = gvir_config_domain_new_from_xml(data->custom_xml, &err);
+
+ if(!gvir_connection_domain_restore(conn, data->filename, conf, data->flags, &err))
+ g_simple_async_result_take_error(res, err);
+}
+
+/**
+ * gvir_connection_domain_restore_async:
+ * @conn: a #GVirConnection
+ * @filename: path to input file
+ * @conf: configuration for domain
+ * @flags: the flags
+ * @cancellable: cancallation object
+ * @callback: (scope async): completion callback
+ * @user_data: (closure): opaque data for callback
+ *
+ * Asynchronous variant of #gvir_connection_domain_restore
+ */
+void gvir_connection_domain_restore_async(GVirConnection *conn,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *res;
+ DomainRestoreFromFileData *data;
+ gchar *custom_xml;
+
+ g_return_if_fail(GVIR_IS_CONNECTION(conn));
+ g_return_if_fail(GVIR_CONFIG_IS_DOMAIN (conf));
+ g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable));
+
+ custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
+
+ data = g_slice_new0(DomainRestoreFromFileData);
+ data->filename = g_strdup(filename);
+ data->custom_xml = g_strdup(custom_xml);
+ data->flags = flags;
+
+ res = g_simple_async_result_new(G_OBJECT(conn),
+ callback,
+ user_data,
+ gvir_connection_domain_restore_async);
+ g_simple_async_result_set_op_res_gpointer(res, data,
+ (GDestroyNotify)domain_restore_from_file_data_free);
+
+ g_simple_async_result_run_in_thread(res,
+ gvir_connection_domain_restore_helper,
+ G_PRIORITY_DEFAULT,
+ cancellable);
+
+ g_object_unref(res);
+}
+
+/**
+ * gvir_connection_domain_finish:
+ * @conn: a #GVirConnection
+ * @result: (transfer none): async method result
+ * @err: Place-holder for possible errors
+ *
+ * Finishes the operation started by #gvir_domain_restore_async.
+ *
+ * Returns: TRUE if domain was restored successfully, FALSE otherwise.
+ */
+gboolean gvir_connection_domain_restore_finish(GVirConnection *conn,
+ GAsyncResult *result,
+ GError **err)
+{
+ g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
+ g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(conn),
+ gvir_connection_domain_restore_async),
+ FALSE);
+
+ if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), err))
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/libvirt-gobject/libvirt-gobject-connection.h b/libvirt-gobject/libvirt-gobject-connection.h
index c80eecf..01d5d0b 100644
--- a/libvirt-gobject/libvirt-gobject-connection.h
+++ b/libvirt-gobject/libvirt-gobject-connection.h
@@ -75,6 +75,8 @@ struct _GVirConnectionClass
void (*domain_added)(GVirConnection *conn, GVirDomain *dom);
void (*domain_removed)(GVirConnection *conn, GVirDomain *dom);
+ void (*domain_restored)(GVirConnection *conn);
+
GVirStream *(*stream_new)(GVirConnection *conn, gpointer handle);
gpointer padding[20];
@@ -202,6 +204,23 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
GAsyncResult *result,
GError **err);
+gboolean gvir_connection_domain_restore(GVirConnection *conn,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GError **err);
+
+void gvir_connection_domain_restore_async(GVirConnection *conn,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean gvir_connection_domain_restore_finish(GVirConnection *conn,
+ GAsyncResult *result,
+ GError **err);
G_END_DECLS
#endif /* __LIBVIRT_GOBJECT_CONNECTION_H__ */
diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym
index 54a093a..db32c7f 100644
--- a/libvirt-gobject/libvirt-gobject.sym
+++ b/libvirt-gobject/libvirt-gobject.sym
@@ -31,6 +31,9 @@ LIBVIRT_GOBJECT_0.0.8 {
gvir_connection_create_storage_pool;
gvir_connection_start_domain;
gvir_connection_get_node_info;
+ gvir_connection_domain_restore;
+ gvir_connection_domain_restore_async;
+ gvir_connection_domain_restore_finish;
gvir_domain_device_get_type;
gvir_domain_device_get_domain;
--
1.7.10.4
2
1
11 Jul '12
---
libvirt-gobject/libvirt-gobject-domain.c | 149 +++++++++++++++++++++++++++++-
libvirt-gobject/libvirt-gobject-domain.h | 20 +++-
libvirt-gobject/libvirt-gobject.sym | 3 +
3 files changed, 170 insertions(+), 2 deletions(-)
diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c
index 088cd33..eda2427 100644
--- a/libvirt-gobject/libvirt-gobject-domain.c
+++ b/libvirt-gobject/libvirt-gobject-domain.c
@@ -54,7 +54,7 @@ enum {
VIR_SUSPENDED,
VIR_RESUMED,
VIR_STOPPED,
- VIR_UPDATED,
+ VIR_UPDATED,
LAST_SIGNAL
};
@@ -557,6 +557,153 @@ gboolean gvir_domain_reboot(GVirDomain *dom,
}
/**
+ * gvir_domain_save_to_file:
+ * @dom: the domain
+ * @filename: path to the output file
+ * @conf: configuration for domain
+ * @flags: the flags
+ *
+ * Returns: TRUE on success, FALSE otherwise
+ */
+gboolean gvir_domain_save_to_file(GVirDomain *dom,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GError **err)
+{
+ GVirDomainPrivate *priv;
+ gchar *custom_xml;
+ int ret;
+
+ g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE);
+ g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN (conf), FALSE);
+ g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
+
+ priv = dom->priv;
+ custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
+
+ if (flags || (custom_xml != NULL)) {
+ ret = virDomainSaveFlags(priv->handle, filename, custom_xml, flags);
+ g_free (custom_xml);
+ }
+ else {
+ ret = virDomainSave(priv->handle, filename);
+ g_free (custom_xml);
+ }
+ if (ret < 0) {
+ gvir_set_error_literal(err, GVIR_DOMAIN_ERROR,
+ 0,
+ "Unable to save domain to file");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+typedef struct {
+ gchar *filename;
+ gchar *custom_xml;
+ guint flags;
+} DomainSaveToFileData;
+
+static void domain_save_to_file_data_free(DomainSaveToFileData *data)
+{
+ g_free(data->filename);
+ g_free(data->custom_xml);
+ g_slice_free(DomainSaveToFileData, data);
+}
+
+static void
+gvir_domain_save_to_file_helper(GSimpleAsyncResult *res,
+ GObject *object,
+ GCancellable *cancellable G_GNUC_UNUSED)
+{
+ GVirDomain *dom = GVIR_DOMAIN(object);
+ DomainSaveToFileData *data;
+ GVirConfigDomain *conf;
+ GError *err = NULL;
+
+ data = g_simple_async_result_get_op_res_gpointer(res);
+ conf = gvir_domain_get_config(dom, data->flags, &err);
+
+ if (!gvir_domain_save_to_file(dom, data->filename, conf, data->flags, &err))
+ g_simple_async_result_take_error(res, err);
+ }
+
+/**
+ * gvir_domain_save_to_file_async:
+ * @dom: the domain
+ * @filename: path to output file
+ * @conf: configuration for domain
+ * @flags: the flags
+ * @cancellable: cancallation object
+ * @callback: (scope async): completion callback
+ * @user_data: (closure): opaque data for callback
+ *
+ * Asynchronous variant of #gvir_domain_save_to_file
+ */
+void gvir_domain_save_to_file_async (GVirDomain *dom,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *res;
+ DomainSaveToFileData *data;
+ gchar *xml;
+
+ g_return_if_fail(GVIR_IS_DOMAIN(dom));
+ g_return_if_fail(GVIR_CONFIG_IS_DOMAIN (conf));
+ g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable));
+
+ xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
+
+ data = g_slice_new0(DomainSaveToFileData);
+ data->filename = g_strdup(filename);
+ data->custom_xml = g_strdup(xml);
+ data->flags = flags;
+
+ res = g_simple_async_result_new(G_OBJECT(dom),
+ callback,
+ user_data,
+ gvir_domain_save_to_file_async);
+ g_simple_async_result_set_op_res_gpointer(res, data, (GDestroyNotify)domain_save_to_file_data_free);
+
+ g_simple_async_result_run_in_thread(res,
+ gvir_domain_save_to_file_helper,
+ G_PRIORITY_DEFAULT,
+ cancellable);
+
+ g_object_unref(res);
+}
+
+/**
+ * gvir_domain_save_to_file_finish:
+ * @dom: the domain to save
+ * @result: (transfer none): async method result
+ * @err: Place-holder for possible errors
+ *
+ * Finishes the operation started by #gvir_domain_save_to_file_async.
+ *
+ * Returns: TRUE if domain was saved successfully, FALSE otherwise.
+ */
+gboolean gvir_domain_save_to_file_finish(GVirDomain *dom,
+ GAsyncResult *result,
+ GError **err)
+{
+ g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE);
+ g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(dom), gvir_domain_save_to_file_async), FALSE);
+ g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
+
+ if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result), err))
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
* gvir_domain_get_config:
* @dom: the domain
* @flags: the flags
diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h
index 87b94f4..49516a7 100644
--- a/libvirt-gobject/libvirt-gobject-domain.h
+++ b/libvirt-gobject/libvirt-gobject-domain.h
@@ -65,7 +65,7 @@ struct _GVirDomainClass
void (*resumed)(GVirDomain *dom);
void (*updated)(GVirDomain *dom);
void (*suspended)(GVirDomain *dom);
-
+
gpointer padding[20];
};
@@ -148,6 +148,24 @@ gboolean gvir_domain_reboot(GVirDomain *dom,
guint flags,
GError **err);
+void gvir_domain_save_to_file_async (GVirDomain *dom,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean gvir_domain_save_to_file_finish(GVirDomain *dom,
+ GAsyncResult *result,
+ GError **err);
+
+gboolean gvir_domain_save_to_file(GVirDomain *dom,
+ gchar *filename,
+ GVirConfigDomain *conf,
+ guint flags,
+ GError **err);
+
GVirDomainInfo *gvir_domain_get_info(GVirDomain *dom,
GError **err);
void gvir_domain_get_info_async(GVirDomain *dom,
diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym
index 94e441a..54a093a 100644
--- a/libvirt-gobject/libvirt-gobject.sym
+++ b/libvirt-gobject/libvirt-gobject.sym
@@ -75,6 +75,9 @@ LIBVIRT_GOBJECT_0.0.8 {
gvir_domain_get_persistent;
gvir_domain_get_saved;
gvir_domain_screenshot;
+ gvir_domain_save_to_file;
+ gvir_domain_save_to_file_async;
+ gvir_domain_save_to_file_finish;
gvir_domain_snapshot_get_type;
gvir_domain_snapshot_handle_get_type;
--
1.7.10.4
2
1
[libvirt] [PATCH]POWER Hypervisor: Fix the segment fault issue for the "list" command
by Dennis Chen 11 Jul '12
by Dennis Chen 11 Jul '12
11 Jul '12
When connect to the remote IBM HMC/IVM server, the remoteNetworkOpen() called
after the phypOpen() in do_open function will re-assign a NULL pointer to the
virConnectPtr conn->networkPrivateData which is allocated in phypOpen(), this
will result in a segment fault issue when execute the following commands,
eg, "virsh# list --all"
Signed-off-by: Dennis Chen<dennis.chen(a)tnsoft.com.cn>
---
src/remote/remote_driver.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index eac50e6..22ef129 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -2504,7 +2504,8 @@ static virDrvOpenStatus ATTRIBUTE_NONNULL (1)
remoteGenericOpen(virConnectPtr conn, virConnectAuthPtr auth,
unsigned int flags, void **genericPrivateData)
{
- if (inside_daemon)
+ if (inside_daemon ||
+ STREQ (conn->driver->name, "PHYP"))
return VIR_DRV_OPEN_DECLINED;
if (conn->driver&&
BRs,
Dennis
2
2
Per the typical use of libvirt is to fork the qemu process with
qemu:qemu. Setting the pool permission mode as 0700 by default
will prevent the guest start with permission reason.
Define macro for the default pool and vol permission modes
incidentally.
---
src/conf/storage_conf.c | 11 ++++++++---
1 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index bf4567f..6d4987b 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -47,6 +47,8 @@
#define VIR_FROM_THIS VIR_FROM_STORAGE
+#define DEFAULT_POOL_PERM_MODE 0711
+#define DEFAULT_VOL_PERM_MODE 0600
VIR_ENUM_IMPL(virStoragePool,
VIR_STORAGE_POOL_LAST,
@@ -812,7 +814,8 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt) {
goto cleanup;
if (virStorageDefParsePerms(ctxt, &ret->target.perms,
- "./target/permissions", 0700) < 0)
+ "./target/permissions",
+ DEFAULT_POOL_PERM_MODE) < 0)
goto cleanup;
}
@@ -1137,7 +1140,8 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
}
if (virStorageDefParsePerms(ctxt, &ret->target.perms,
- "./target/permissions", 0600) < 0)
+ "./target/permissions",
+ DEFAULT_VOL_PERM_MODE) < 0)
goto cleanup;
node = virXPathNode("./target/encryption", ctxt);
@@ -1168,7 +1172,8 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
}
if (virStorageDefParsePerms(ctxt, &ret->backingStore.perms,
- "./backingStore/permissions", 0600) < 0)
+ "./backingStore/permissions",
+ DEFAULT_VOL_PERM_MODE) < 0)
goto cleanup;
return ret;
--
1.7.7.3
3
5
[libvirt] [PATCHv3 0/4] Fix filling of nodeinfo structure and add test cases
by Peter Krempa 11 Jul '12
by Peter Krempa 11 Jul '12
11 Jul '12
For explanation why this is needed see 2/4. Patch 1/4 are test data split
out from 1/3 of the previous version to ease reviewing of 2/4.
Peter Krempa (4):
nodeinfo_test: Enhance test data before changing nodeinfo gathering
nodeinfo: Fix gathering of nodeinfo data structure
test: Add new test case for nodeinfotest
test: Add test case for nodeinfotest if host machine doesn't have
NUMA
src/nodeinfo.c | 311 +++++++++-------
.../linux-nodeinfo-sysfs-test-2/node/node0/cpu0 | 1 +
.../linux-nodeinfo-sysfs-test-2/node/node0/cpu1 | 1 +
.../linux-nodeinfo-sysfs-test-3-cpu-x86-output.txt | 2 +-
.../linux-nodeinfo-sysfs-test-3/node/node0/cpu0 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node0/cpu12 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node0/cpu16 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node0/cpu20 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node0/cpu4 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node0/cpu8 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node1/cpu24 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node1/cpu28 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node1/cpu32 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node1/cpu36 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node1/cpu40 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node1/cpu44 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node2/cpu11 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node2/cpu15 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node2/cpu19 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node2/cpu23 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node2/cpu3 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node2/cpu7 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node3/cpu27 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node3/cpu31 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node3/cpu35 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node3/cpu39 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node3/cpu43 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node3/cpu47 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node4/cpu10 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node4/cpu14 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node4/cpu18 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node4/cpu2 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node4/cpu22 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node4/cpu6 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node5/cpu26 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node5/cpu30 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node5/cpu34 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node5/cpu38 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node5/cpu42 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node5/cpu46 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node6/cpu1 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node6/cpu13 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node6/cpu17 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node6/cpu21 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node6/cpu5 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node6/cpu9 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node7/cpu25 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node7/cpu29 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node7/cpu33 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node7/cpu37 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node7/cpu41 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/node7/cpu45 | 1 +
.../linux-nodeinfo-sysfs-test-3/node/possible | Bin 4 -> 5 bytes
.../linux-nodeinfo-sysfs-test-4-cpu-x86-output.txt | 1 +
.../linux-nodeinfo-sysfs-test-4-x86.cpuinfo | 400 ++++++++++++++++++++
.../cpu/cpu0/topology/core_id | 1 +
.../cpu/cpu0/topology/physical_package_id | 1 +
.../cpu/cpu0/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu1/online | 1 +
.../cpu/cpu1/topology/core_id | 1 +
.../cpu/cpu1/topology/physical_package_id | 1 +
.../cpu/cpu1/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu10/online | 1 +
.../cpu/cpu10/topology/core_id | 1 +
.../cpu/cpu10/topology/physical_package_id | 1 +
.../cpu/cpu10/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu11/online | 1 +
.../cpu/cpu11/topology/core_id | 1 +
.../cpu/cpu11/topology/physical_package_id | 1 +
.../cpu/cpu11/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu12/online | 1 +
.../cpu/cpu12/topology/core_id | 1 +
.../cpu/cpu12/topology/physical_package_id | 1 +
.../cpu/cpu12/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu13/online | 1 +
.../cpu/cpu13/topology/core_id | 1 +
.../cpu/cpu13/topology/physical_package_id | 1 +
.../cpu/cpu13/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu14/online | 1 +
.../cpu/cpu14/topology/core_id | 1 +
.../cpu/cpu14/topology/physical_package_id | 1 +
.../cpu/cpu14/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu15/online | 1 +
.../cpu/cpu15/topology/core_id | 1 +
.../cpu/cpu15/topology/physical_package_id | 1 +
.../cpu/cpu15/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu2/online | 1 +
.../cpu/cpu2/topology/core_id | 1 +
.../cpu/cpu2/topology/physical_package_id | 1 +
.../cpu/cpu2/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu3/online | 1 +
.../cpu/cpu3/topology/core_id | 1 +
.../cpu/cpu3/topology/physical_package_id | 1 +
.../cpu/cpu3/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu4/online | 1 +
.../cpu/cpu4/topology/core_id | 1 +
.../cpu/cpu4/topology/physical_package_id | 1 +
.../cpu/cpu4/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu5/online | 1 +
.../cpu/cpu5/topology/core_id | 1 +
.../cpu/cpu5/topology/physical_package_id | 1 +
.../cpu/cpu5/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu6/online | 1 +
.../cpu/cpu6/topology/core_id | 1 +
.../cpu/cpu6/topology/physical_package_id | 1 +
.../cpu/cpu6/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu7/online | 1 +
.../cpu/cpu7/topology/core_id | 1 +
.../cpu/cpu7/topology/physical_package_id | 1 +
.../cpu/cpu7/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu8/online | 1 +
.../cpu/cpu8/topology/core_id | 1 +
.../cpu/cpu8/topology/physical_package_id | 1 +
.../cpu/cpu8/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/cpu/cpu9/online | 1 +
.../cpu/cpu9/topology/core_id | 1 +
.../cpu/cpu9/topology/physical_package_id | 1 +
.../cpu/cpu9/topology/thread_siblings | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node0/cpu0 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node0/cpu1 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node0/cpu2 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node0/cpu3 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node0/cpu4 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node0/cpu5 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node0/cpu6 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node0/cpu7 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node0/meminfo | 29 ++
.../linux-nodeinfo-sysfs-test-4/node/node1/cpu10 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node1/cpu11 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node1/cpu12 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node1/cpu13 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node1/cpu14 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node1/cpu15 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node1/cpu8 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node1/cpu9 | 1 +
.../linux-nodeinfo-sysfs-test-4/node/node1/meminfo | 29 ++
.../linux-nodeinfo-sysfs-test-4/node/possible | Bin 0 -> 5 bytes
.../linux-nodeinfo-sysfs-test-5-cpu-x86-output.txt | 1 +
.../linux-nodeinfo-sysfs-test-5-x86.cpuinfo | 100 +++++
.../cpu/cpu0/topology/core_id | 1 +
.../cpu/cpu0/topology/core_siblings | 1 +
.../cpu/cpu0/topology/core_siblings_list | 1 +
.../cpu/cpu0/topology/physical_package_id | 1 +
.../cpu/cpu0/topology/thread_siblings | 1 +
.../cpu/cpu0/topology/thread_siblings_list | 1 +
.../linux-nodeinfo-sysfs-test-5/cpu/cpu1/online | 1 +
.../cpu/cpu1/topology/core_id | 1 +
.../cpu/cpu1/topology/core_siblings | 1 +
.../cpu/cpu1/topology/core_siblings_list | 1 +
.../cpu/cpu1/topology/physical_package_id | 1 +
.../cpu/cpu1/topology/thread_siblings | 1 +
.../cpu/cpu1/topology/thread_siblings_list | 1 +
.../linux-nodeinfo-sysfs-test-5/cpu/cpu2/online | 1 +
.../cpu/cpu2/topology/core_id | 1 +
.../cpu/cpu2/topology/core_siblings | 1 +
.../cpu/cpu2/topology/core_siblings_list | 1 +
.../cpu/cpu2/topology/physical_package_id | 1 +
.../cpu/cpu2/topology/thread_siblings | 1 +
.../cpu/cpu2/topology/thread_siblings_list | 1 +
.../linux-nodeinfo-sysfs-test-5/cpu/cpu3/online | 1 +
.../cpu/cpu3/topology/core_id | 1 +
.../cpu/cpu3/topology/core_siblings | 1 +
.../cpu/cpu3/topology/core_siblings_list | 1 +
.../cpu/cpu3/topology/physical_package_id | 1 +
.../cpu/cpu3/topology/thread_siblings | 1 +
.../cpu/cpu3/topology/thread_siblings_list | 1 +
tests/nodeinfotest.c | 2 +
167 files changed, 903 insertions(+), 128 deletions(-)
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu0
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu1
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu0
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu12
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu16
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu20
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu4
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu8
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu24
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu28
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu32
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu36
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu40
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu44
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu11
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu15
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu19
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu23
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu3
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu7
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu27
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu31
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu35
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu39
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu43
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu47
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu10
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu14
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu18
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu2
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu22
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu6
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu26
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu30
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu34
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu38
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu42
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu46
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu1
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu13
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu17
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu21
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu5
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu9
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu25
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu29
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu33
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu37
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu41
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu45
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4-cpu-x86-output.txt
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4-x86.cpuinfo
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu0/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu0/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu0/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu1/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu1/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu1/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu1/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu10/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu10/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu10/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu10/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu11/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu11/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu11/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu11/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu12/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu12/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu12/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu12/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu13/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu13/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu13/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu13/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu14/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu14/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu14/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu14/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu15/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu15/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu15/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu15/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu2/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu2/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu2/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu2/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu3/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu3/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu3/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu3/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu4/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu4/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu4/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu4/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu5/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu5/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu5/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu5/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu6/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu6/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu6/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu6/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu7/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu7/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu7/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu7/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu8/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu8/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu8/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu8/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu9/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu9/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu9/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/cpu/cpu9/topology/thread_siblings
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node0/cpu0
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node0/cpu1
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node0/cpu2
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node0/cpu3
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node0/cpu4
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node0/cpu5
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node0/cpu6
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node0/cpu7
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node0/meminfo
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node1/cpu10
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node1/cpu11
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node1/cpu12
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node1/cpu13
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node1/cpu14
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node1/cpu15
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node1/cpu8
create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node1/cpu9
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/node1/meminfo
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-4/node/possible
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5-cpu-x86-output.txt
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5-x86.cpuinfo
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu0/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu0/topology/core_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu0/topology/core_siblings_list
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu0/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu0/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu0/topology/thread_siblings_list
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu1/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu1/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu1/topology/core_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu1/topology/core_siblings_list
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu1/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu1/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu1/topology/thread_siblings_list
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu2/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu2/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu2/topology/core_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu2/topology/core_siblings_list
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu2/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu2/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu2/topology/thread_siblings_list
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu3/online
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu3/topology/core_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu3/topology/core_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu3/topology/core_siblings_list
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu3/topology/physical_package_id
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu3/topology/thread_siblings
create mode 100644 tests/nodeinfodata/linux-nodeinfo-sysfs-test-5/cpu/cpu3/topology/thread_siblings_list
--
1.7.8.6
3
14
[libvirt] [PATCH] docs: added description of the vendor_id attribute
by Hendrik Schwartke 11 Jul '12
by Hendrik Schwartke 11 Jul '12
11 Jul '12
---
docs/formatdomain.html.in | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 94c555f..b6e0d5d 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -779,7 +779,11 @@
in which case an attempt to start a domain requesting an unsupported
CPU model will fail. Supported values for <code>fallback</code>
attribute are: <code>allow</code> (this is the default), and
- <code>forbid</code>.</dd>
+ <code>forbid</code>. The optional <code>vendor_id</code> attribute
+ (<span class="since">Since 0.9.14</span>) can be used to set the
+ vendor id seen by the guest. It must be exactly 12 characters long.
+ If not set the vendor id of the host is used. Typical possible
+ values are "AuthenticAMD" and "GenuineIntel".</dd>
<dt><code>vendor</code></dt>
<dd><span class="since">Since 0.8.3</span> the content of the
--
1.7.9.5
4
6