</source>
...</pre>
+ <pre>
+ ...
+ <source>
+ <device path='/dev/mapper/mpatha' part_separator='no'/>
+ <format type='gpt'/>
+ </source>
+ ...</pre>
+
<pre>
...
<source>
(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>),
<empty/>
<ref name='devextents'/>
</choice>
+ <optional>
+ <attribute name="part_separator">
+ <ref name="virYesNo"/>
+ </attribute>
+ </optional>
</element>
</define>
/*
* 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
goto cleanup;
for (i = 0; i < nsource; i++) {
+ char *partsep;
virStoragePoolSourceDevice dev = { .path = NULL };
dev.path = virXMLPropString(nodeset[i], "path");
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);
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");
}
}
}
/*
* 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
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
--- /dev/null
+<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>
--- /dev/null
+<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>
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");