From 61544d310e08a85474b6fbcb8d2dc8fbb355702d Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Fri, 13 Apr 2012 07:34:41 -0400 Subject: [PATCH] storage: lvm: use correct lv* command parameters lvcreate want's the parent pool's name, not the pool path lvchange and lvremove want lv specified as $vgname/$lvname This largely worked before because these commands strip off a starting /dev. But https://bugzilla.redhat.com/show_bug.cgi?id=714986 is from a user using a 'nested VG' that was having problems. I couldn't find any info on nested LVM and the reporter never responded, but I reproduced with XML that specified a valid source name, and set target path to a symlink. --- src/storage/storage_backend_logical.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c index 6a235f6833..9a91dd9a74 100644 --- a/src/storage/storage_backend_logical.c +++ b/src/storage/storage_backend_logical.c @@ -672,7 +672,7 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn, char size[100]; const char *cmdargvnew[] = { LVCREATE, "--name", vol->name, "-L", size, - pool->def->target.path, NULL + pool->def->source.name, NULL }; const char *cmdargvsnap[] = { LVCREATE, "--name", vol->name, "-L", size, @@ -778,23 +778,23 @@ virStorageBackendLogicalDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED, unsigned int flags) { int ret = -1; + char *volpath = NULL; virCommandPtr lvchange_cmd = NULL; virCommandPtr lvremove_cmd = NULL; virCheckFlags(0, -1); + if (virAsprintf(&volpath, "%s/%s", + pool->def->source.name, vol->name) < 0) { + virReportOOMError(); + goto cleanup; + } + virFileWaitForDevices(); - lvchange_cmd = virCommandNewArgList(LVCHANGE, - "-aln", - vol->target.path, - NULL); - - lvremove_cmd = virCommandNewArgList(LVREMOVE, - "-f", - vol->target.path, - NULL); + lvchange_cmd = virCommandNewArgList(LVCHANGE, "-aln", volpath, NULL); + lvremove_cmd = virCommandNewArgList(LVREMOVE, "-f", volpath, NULL); if (virCommandRun(lvremove_cmd, NULL) < 0) { if (virCommandRun(lvchange_cmd, NULL) < 0) { @@ -807,6 +807,7 @@ virStorageBackendLogicalDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED, ret = 0; cleanup: + VIR_FREE(volpath); virCommandFree(lvchange_cmd); virCommandFree(lvremove_cmd); return ret;