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@xxxxxxxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list