diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng
index 6da3c11ac1d1d6a171d5d3dbf1303bda48f12ed8..a4ef5aff0c6962ca4067bf1577b5239031b0a28f 100644
--- a/docs/schemas/storagepool.rng
+++ b/docs/schemas/storagepool.rng
@@ -62,7 +62,7 @@
-
+
@@ -207,6 +207,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index d6df1ed71f48ca54a3566f39535656cc457800dc..002663f1e4e3f92aecbec8b5099e2d8ec81dc4d8 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -1,7 +1,7 @@
/*
* storage_conf.c: config handling for storage driver
*
- * Copyright (C) 2006-2012 Red Hat, Inc.
+ * Copyright (C) 2006-2013 Red Hat, Inc.
* Copyright (C) 2006-2008 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@@ -956,10 +956,17 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
/* When we are working with a virtual disk we can skip the target
* path and permissions */
if (!(options->flags & VIR_STORAGE_POOL_SOURCE_NETWORK)) {
- if (!(target_path = virXPathString("string(./target/path)", ctxt))) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("missing storage pool target path"));
- goto error;
+ if (ret->type == VIR_STORAGE_POOL_LOGICAL) {
+ if (virAsprintf(&target_path, "/dev/%s", ret->source.name) < 0) {
+ goto error;
+ }
+ } else {
+ target_path = virXPathString("string(./target/path)", ctxt);
+ if (!target_path) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("missing storage pool target path"));
+ goto error;
+ }
}
ret->target.path = virFileSanitizePath(target_path);
if (!ret->target.path)
diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
index 416a0424fe2536dba8596f90d77476ed7ddfc007..8998a11b92158c93de7853c49dce4b69842a0773 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -454,17 +454,7 @@ virStorageBackendLogicalCheckPool(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool,
bool *isActive)
{
- char *path;
-
- *isActive = false;
- if (virAsprintf(&path, "/dev/%s", pool->def->source.name) < 0)
- return -1;
-
- if (access(path, F_OK) == 0)
- *isActive = true;
-
- VIR_FREE(path);
-
+ *isActive = (access(pool->def->target.path, F_OK) == 0);
return 0;
}
@@ -794,21 +784,16 @@ 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)
- goto cleanup;
-
virFileWaitForDevices();
- lvchange_cmd = virCommandNewArgList(LVCHANGE, "-aln", volpath, NULL);
- lvremove_cmd = virCommandNewArgList(LVREMOVE, "-f", volpath, NULL);
+ lvchange_cmd = virCommandNewArgList(LVCHANGE, "-aln", vol->target.path, NULL);
+ lvremove_cmd = virCommandNewArgList(LVREMOVE, "-f", vol->target.path, NULL);
if (virCommandRun(lvremove_cmd, NULL) < 0) {
if (virCommandRun(lvchange_cmd, NULL) < 0) {
@@ -821,7 +806,6 @@ virStorageBackendLogicalDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED,
ret = 0;
cleanup:
- VIR_FREE(volpath);
virCommandFree(lvchange_cmd);
virCommandFree(lvremove_cmd);
return ret;
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index a8eb731aec2eec30f421fbbbb66e0b6f972dd80f..43bf6dece5f19b48be6a128f0c9d563202424303 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -1,7 +1,7 @@
/*
* storage_driver.c: core driver for storage APIs
*
- * Copyright (C) 2006-2012 Red Hat, Inc.
+ * Copyright (C) 2006-2013 Red Hat, Inc.
* Copyright (C) 2006-2008 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
diff --git a/tests/storagepoolxml2xmlin/pool-logical-create.xml b/tests/storagepoolxml2xmlin/pool-logical-create.xml
index 4c670899da5e0f61ce573c2c43f372dcd64a90e1..fd551e016b25f8bcfbacac6a8fee5cfed7fc74f8 100644
--- a/tests/storagepoolxml2xmlin/pool-logical-create.xml
+++ b/tests/storagepoolxml2xmlin/pool-logical-create.xml
@@ -10,7 +10,7 @@
- /dev/HostVG
+ /invalid/nonexistent/path
0700
0
diff --git a/tests/storagepoolxml2xmlin/pool-logical-nopath.xml b/tests/storagepoolxml2xmlin/pool-logical-nopath.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e1bb4db48c164b30bae1a59dace4bee2efb141d2
--- /dev/null
+++ b/tests/storagepoolxml2xmlin/pool-logical-nopath.xml
@@ -0,0 +1,19 @@
+
+ HostVG
+ 1c13165a-d0f4-3aee-b447-30fb38789091
+ 99891544064
+ 99220455424
+ 671088640
+
+
+
+ 0700
+ 0
+ 0
+
+
+
diff --git a/tests/storagepoolxml2xmlout/pool-logical-nopath.xml b/tests/storagepoolxml2xmlout/pool-logical-nopath.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7413f1cfe46198d6073dd36536af94bfce963cb8
--- /dev/null
+++ b/tests/storagepoolxml2xmlout/pool-logical-nopath.xml
@@ -0,0 +1,22 @@
+
+ HostVG
+ 1c13165a-d0f4-3aee-b447-30fb38789091
+ 0
+ 0
+ 0
+
+
+ /dev/HostVG
+
+ 0700
+ 0
+ 0
+
+
+
diff --git a/tests/storagepoolxml2xmltest.c b/tests/storagepoolxml2xmltest.c
index 53a7f83ca177dfda56d2877fa906f773e87e6ed3..d59cff9746ab610a7ac2602c3f3f38d9ea0140ab 100644
--- a/tests/storagepoolxml2xmltest.c
+++ b/tests/storagepoolxml2xmltest.c
@@ -87,6 +87,7 @@ mymain(void)
DO_TEST("pool-dir");
DO_TEST("pool-fs");
DO_TEST("pool-logical");
+ DO_TEST("pool-logical-nopath");
DO_TEST("pool-logical-create");
DO_TEST("pool-disk");
DO_TEST("pool-iscsi");