[libvirt] [PATCH v4] Make logical pools independent on target path

Martin Kletzander mkletzan at redhat.com
Mon Jul 15 14:29:54 UTC 2013


When using logical pools, we had to trust the target->path provided.
This parameter, however, can be completely ommited and we can use
'/dev/<source.name>' safely and populate it to target.path.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=952973
Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---

Notes:
    v4:
     - Don't add anything complicated, just rely on /dev/VG_NAME/LV_NAME
    v3:
     - just rebase
    v2:
     - don't drop pool's target.path, but fix it instead to /dev/VG_NAME

 docs/schemas/storagepool.rng                       | 13 ++++++++++++-
 src/conf/storage_conf.c                            | 17 ++++++++++++-----
 src/storage/storage_backend_logical.c              | 22 +++-------------------
 src/storage/storage_driver.c                       |  2 +-
 tests/storagepoolxml2xmlin/pool-logical-create.xml |  2 +-
 tests/storagepoolxml2xmlin/pool-logical-nopath.xml | 19 +++++++++++++++++++
 .../storagepoolxml2xmlout/pool-logical-nopath.xml  | 22 ++++++++++++++++++++++
 tests/storagepoolxml2xmltest.c                     |  1 +
 8 files changed, 71 insertions(+), 27 deletions(-)
 create mode 100644 tests/storagepoolxml2xmlin/pool-logical-nopath.xml
 create mode 100644 tests/storagepoolxml2xmlout/pool-logical-nopath.xml

diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng
index 3c2158a..1b3f4bc 100644
--- a/docs/schemas/storagepool.rng
+++ b/docs/schemas/storagepool.rng
@@ -62,7 +62,7 @@
     <ref name='commonmetadata'/>
     <ref name='sizing'/>
     <ref name='sourcelogical'/>
-    <ref name='target'/>
+    <ref name='targetlogical'/>
   </define>

   <define name='pooldisk'>
@@ -207,6 +207,17 @@
     </element>
   </define>

+  <define name='targetlogical'>
+    <element name='target'>
+      <optional>
+        <element name='path'>
+          <ref name='absFilePath'/>
+        </element>
+      </optional>
+      <ref name='permissions'/>
+    </element>
+  </define>
+
   <define name='sourceinfohost'>
     <oneOrMore>
       <element name='host'>
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 524a4d6..a517cbf 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
@@ -953,10 +953,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 416a042..8998a11 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 a8eb731..43bf6de 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 4c67089..fd551e0 100644
--- a/tests/storagepoolxml2xmlin/pool-logical-create.xml
+++ b/tests/storagepoolxml2xmlin/pool-logical-create.xml
@@ -10,7 +10,7 @@
     <device path="/dev/sdb3"/>
   </source>
   <target>
-    <path>/dev/HostVG</path>
+    <path>/invalid/nonexistent/path</path>
     <permissions>
       <mode>0700</mode>
       <owner>0</owner>
diff --git a/tests/storagepoolxml2xmlin/pool-logical-nopath.xml b/tests/storagepoolxml2xmlin/pool-logical-nopath.xml
new file mode 100644
index 0000000..e1bb4db
--- /dev/null
+++ b/tests/storagepoolxml2xmlin/pool-logical-nopath.xml
@@ -0,0 +1,19 @@
+<pool type='logical'>
+  <name>HostVG</name>
+  <uuid>1c13165a-d0f4-3aee-b447-30fb38789091</uuid>
+  <capacity>99891544064</capacity>
+  <allocation>99220455424</allocation>
+  <available>671088640</available>
+  <source>
+    <device path="/dev/sdb1"/>
+    <device path="/dev/sdb2"/>
+    <device path="/dev/sdb3"/>
+  </source>
+  <target>
+    <permissions>
+      <mode>0700</mode>
+      <owner>0</owner>
+      <group>0</group>
+    </permissions>
+  </target>
+</pool>
diff --git a/tests/storagepoolxml2xmlout/pool-logical-nopath.xml b/tests/storagepoolxml2xmlout/pool-logical-nopath.xml
new file mode 100644
index 0000000..7413f1c
--- /dev/null
+++ b/tests/storagepoolxml2xmlout/pool-logical-nopath.xml
@@ -0,0 +1,22 @@
+<pool type='logical'>
+  <name>HostVG</name>
+  <uuid>1c13165a-d0f4-3aee-b447-30fb38789091</uuid>
+  <capacity unit='bytes'>0</capacity>
+  <allocation unit='bytes'>0</allocation>
+  <available unit='bytes'>0</available>
+  <source>
+    <device path='/dev/sdb1'/>
+    <device path='/dev/sdb2'/>
+    <device path='/dev/sdb3'/>
+    <name>HostVG</name>
+    <format type='lvm2'/>
+  </source>
+  <target>
+    <path>/dev/HostVG</path>
+    <permissions>
+      <mode>0700</mode>
+      <owner>0</owner>
+      <group>0</group>
+    </permissions>
+  </target>
+</pool>
diff --git a/tests/storagepoolxml2xmltest.c b/tests/storagepoolxml2xmltest.c
index 53a7f83..d59cff9 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");
-- 
1.8.3.2




More information about the libvir-list mailing list