]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: Add storage pool device attribute part_separator
authorJohn Ferlan <jferlan@redhat.com>
Thu, 7 Jan 2016 11:57:28 +0000 (06:57 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Tue, 19 Jan 2016 18:02:59 +0000 (13:02 -0500)
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.

docs/formatstorage.html.in
docs/schemas/storagepool.rng
src/conf/storage_conf.c
src/conf/storage_conf.h
tests/storagepoolxml2xmlin/pool-disk-device-nopartsep.xml [new file with mode: 0644]
tests/storagepoolxml2xmlout/pool-disk-device-nopartsep.xml [new file with mode: 0644]
tests/storagepoolxml2xmltest.c

index a60e05e65072d5b518fec202aa80998b66659d20..4965a4c7e1768145d0dd07cd92acec58e7098d13 100644 (file)
         &lt;/source&gt;
         ...</pre>
 
+    <pre>
+        ...
+        &lt;source&gt;
+          &lt;device path='/dev/mapper/mpatha' part_separator='no'/&gt;
+          &lt;format type='gpt'/&gt;
+        &lt;/source&gt;
+        ...</pre>
+
     <pre>
         ...
         &lt;source&gt;
         (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>),
index 3a61f04db4343a374934eb64b93a3bab7de112bd..49d212f7c72b6628dcbaf4581790741f9cfdc4a7 100644 (file)
         <empty/>
         <ref name='devextents'/>
       </choice>
+      <optional>
+        <attribute name="part_separator">
+          <ref name="virYesNo"/>
+        </attribute>
+      </optional>
     </element>
   </define>
 
index 7c81babd0438070051b48abfe089a0f9ed79ba9c..3657dfd54c53f33125645ab5e382a227571606b6 100644 (file)
@@ -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");
             }
         }
     }
index ec59c178cffe0ed3dcdc2ed4da65cd465cdc6cd2..f1dc62b11548f4352d9ebea7bbc56b74679cd967 100644 (file)
@@ -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 (file)
index 0000000..71b381e
--- /dev/null
@@ -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 (file)
index 0000000..71b381e
--- /dev/null
@@ -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>
index b03c4b01766f32d7c24edc961a2a4a3dbeea5b0b..41d69878cd297c0e2c5a8ed4a5f30c553b289e81 100644 (file)
@@ -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");