[libvirt] [PATCH 1/2] conf: Add storage pool device attribute part_separator

John Ferlan jferlan at redhat.com
Fri Jan 8 17:09:44 UTC 2016


Add a new storage pool source device attribute 'part_separator=[yes|no]'
in order to allow a 'disk' storage pool using a device mapper multipath
device to not add the "p" partition separator to the generated device
name when libvirt_parthelper is run.

This will allow libvirt to find device mapper multipath devices which were
configured in /etc/multipath.conf to use 'user_friendly_names' or custom
'alias' names for the LUN.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 docs/formatstorage.html.in                         | 30 ++++++++++++++++++++--
 docs/schemas/storagepool.rng                       |  5 ++++
 src/conf/storage_conf.c                            | 26 +++++++++++++++++--
 src/conf/storage_conf.h                            |  3 ++-
 .../pool-disk-device-nopartsep.xml                 | 14 ++++++++++
 .../pool-disk-device-nopartsep.xml                 | 14 ++++++++++
 tests/storagepoolxml2xmltest.c                     |  1 +
 7 files changed, 88 insertions(+), 5 deletions(-)
 create mode 100644 tests/storagepoolxml2xmlin/pool-disk-device-nopartsep.xml
 create mode 100644 tests/storagepoolxml2xmlout/pool-disk-device-nopartsep.xml

diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in
index a60e05e..4965a4c 100644
--- a/docs/formatstorage.html.in
+++ b/docs/formatstorage.html.in
@@ -90,6 +90,14 @@
     <pre>
         ...
         <source>
+          <device path='/dev/mapper/mpatha' part_separator='no'/>
+          <format type='gpt'/>
+        </source>
+        ...</pre>
+
+    <pre>
+        ...
+        <source>
           <adapter type='scsi_host' name='scsi_host1'/>
         </source>
         ...</pre>
@@ -118,10 +126,28 @@
         (pool types <code>fs</code>, <code>logical</code>, <code>disk</code>,
         <code>iscsi</code>, <code>zfs</code>).
         May be repeated multiple times depending on backend driver. Contains
-        a single attribute <code>path</code> which is either the fully
+        a required attribute <code>path</code> which is either the fully
         qualified path to the block device node or for <code>iscsi</code>
         the iSCSI Qualified Name (IQN).
-        <span class="since">Since 0.4.1</span></dd>
+        <span class="since">Since 0.4.1</span>
+        <p>An optional attribute <code>part_separator</code> for each
+        <code>path</code> may be supplied. Valid values for the attribute
+        may be either "yes" or "no". This attribute is to be used for a
+        <code>disk</code> pool type using a <code>path</code> to a
+        device mapper multipath device configured to utilize either
+        'user_friendly_names' or a custom 'alias' name in the
+        /etc/multipath.conf. The attribute directs libvirt to not
+        generate device volume names with the partition character "p".
+        By default, when libvirt generates the partition names for
+        device mapper multipath devices it will add a "p" path separator
+        to the device name before adding the partition number. For example,
+        a <code>device path</code> of '/dev/mapper/mpatha' libvirt would
+        generate partition names of '/dev/mapper/mpathap1',
+        '/dev/mapper/mpathap2', etc. for each partition found. With
+        this attribute set to "no", libvirt will not append the "p" to
+        the name unless it ends with a number thus generating names
+        of '/dev/mapper/mpatha1', '/dev/mapper/mpatha2', etc.
+        <span class="since">Since 1.3.1</span></p></dd>
       <dt><code>dir</code></dt>
       <dd>Provides the source for pools backed by directories (pool
         types <code>dir</code>, <code>netfs</code>, <code>gluster</code>),
diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng
index 3a61f04..49d212f 100644
--- a/docs/schemas/storagepool.rng
+++ b/docs/schemas/storagepool.rng
@@ -278,6 +278,11 @@
         <empty/>
         <ref name='devextents'/>
       </choice>
+      <optional>
+        <attribute name="part_separator">
+          <ref name="virYesNo"/>
+        </attribute>
+      </optional>
     </element>
   </define>
 
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 7c81bab..3657dfd 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-2014 Red Hat, Inc.
+ * Copyright (C) 2006-2016 Red Hat, Inc.
  * Copyright (C) 2006-2008 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -528,6 +528,7 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
         goto cleanup;
 
     for (i = 0; i < nsource; i++) {
+        char *partsep;
         virStoragePoolSourceDevice dev = { .path = NULL };
         dev.path = virXMLPropString(nodeset[i], "path");
 
@@ -537,10 +538,25 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
             goto cleanup;
         }
 
+        partsep = virXMLPropString(nodeset[i], "part_separator");
+        if (partsep) {
+            dev.part_separator = virTristateBoolTypeFromString(partsep);
+            if (dev.part_separator <= 0) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               _("invalid part_separator setting '%s'"),
+                               partsep);
+                virStoragePoolSourceDeviceClear(&dev);
+                VIR_FREE(partsep);
+                goto cleanup;
+            }
+            VIR_FREE(partsep);
+        }
+
         if (VIR_APPEND_ELEMENT(source->devices, source->ndevice, dev) < 0) {
             virStoragePoolSourceDeviceClear(&dev);
             goto cleanup;
         }
+
     }
 
     source->dir = virXPathString("string(./dir/@path)", ctxt);
@@ -1051,8 +1067,14 @@ virStoragePoolSourceFormat(virBufferPtr buf,
                 virBufferAdjustIndent(buf, -2);
                 virBufferAddLit(buf, "</device>\n");
             } else {
-                virBufferEscapeString(buf, "<device path='%s'/>\n",
+                virBufferEscapeString(buf, "<device path='%s'",
                                       src->devices[i].path);
+                if (src->devices[i].part_separator !=
+                    VIR_TRISTATE_SWITCH_ABSENT) {
+                    virBufferAsprintf(buf, " part_separator='%s'",
+                                      virTristateBoolTypeToString(src->devices[i].part_separator));
+                }
+                virBufferAddLit(buf, "/>\n");
             }
         }
     }
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index ec59c17..f1dc62b 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -1,7 +1,7 @@
 /*
  * storage_conf.h: config handling for storage driver
  *
- * Copyright (C) 2006-2008, 2010-2014 Red Hat, Inc.
+ * Copyright (C) 2006-2008, 2010-2016 Red Hat, Inc.
  * Copyright (C) 2006-2008 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -157,6 +157,7 @@ struct _virStoragePoolSourceDevice {
     virStoragePoolSourceDeviceExtentPtr freeExtents;
     char *path;
     int format; /* Pool specific source format */
+    int part_separator;  /* enum virTristateSwitch */
 
     /* When the source device is a physical disk,
      * the geometry data is needed
diff --git a/tests/storagepoolxml2xmlin/pool-disk-device-nopartsep.xml b/tests/storagepoolxml2xmlin/pool-disk-device-nopartsep.xml
new file mode 100644
index 0000000..71b381e
--- /dev/null
+++ b/tests/storagepoolxml2xmlin/pool-disk-device-nopartsep.xml
@@ -0,0 +1,14 @@
+<pool type='disk'>
+  <name>multipath</name>
+  <uuid>70a7eb15-6c34-ee9c-bf57-69e8e5ff3fb2</uuid>
+  <capacity unit='bytes'>0</capacity>
+  <allocation unit='bytes'>0</allocation>
+  <available unit='bytes'>0</available>
+  <source>
+    <device path='/dev/mapper/mpatha' part_separator='no'/>
+    <format type='gpt'/>
+  </source>
+  <target>
+    <path>/dev</path>
+  </target>
+</pool>
diff --git a/tests/storagepoolxml2xmlout/pool-disk-device-nopartsep.xml b/tests/storagepoolxml2xmlout/pool-disk-device-nopartsep.xml
new file mode 100644
index 0000000..71b381e
--- /dev/null
+++ b/tests/storagepoolxml2xmlout/pool-disk-device-nopartsep.xml
@@ -0,0 +1,14 @@
+<pool type='disk'>
+  <name>multipath</name>
+  <uuid>70a7eb15-6c34-ee9c-bf57-69e8e5ff3fb2</uuid>
+  <capacity unit='bytes'>0</capacity>
+  <allocation unit='bytes'>0</allocation>
+  <available unit='bytes'>0</available>
+  <source>
+    <device path='/dev/mapper/mpatha' part_separator='no'/>
+    <format type='gpt'/>
+  </source>
+  <target>
+    <path>/dev</path>
+  </target>
+</pool>
diff --git a/tests/storagepoolxml2xmltest.c b/tests/storagepoolxml2xmltest.c
index b03c4b0..41d6987 100644
--- a/tests/storagepoolxml2xmltest.c
+++ b/tests/storagepoolxml2xmltest.c
@@ -80,6 +80,7 @@ mymain(void)
     DO_TEST("pool-logical-nopath");
     DO_TEST("pool-logical-create");
     DO_TEST("pool-disk");
+    DO_TEST("pool-disk-device-nopartsep");
     DO_TEST("pool-iscsi");
     DO_TEST("pool-iscsi-auth");
     DO_TEST("pool-netfs");
-- 
2.5.0




More information about the libvir-list mailing list