6 years agoDo not print empty multipaths section
Hannes Reinecke [Tue, 12 Aug 2014 08:09:59 +0000 (10:09 +0200)]
Do not print empty multipaths section

The CLI command 'show config' or the 'multipath -t' command
should not print an empty 'multipaths' section.

Signed-off-by: Hannes Reinecke <>
6 years agoImplement 'uxsock_timeout' keyword
Hannes Reinecke [Mon, 11 Aug 2014 10:49:56 +0000 (12:49 +0200)]
Implement 'uxsock_timeout' keyword

On larger systems the default CLI receive timeout of 1 second
might be too small, and the CLI commands might fail before
they can be processed. For these cases I've implemented a new
keywork 'uxsock_timeout' which can be increased to avoid these

Signed-off-by: Hannes Reinecke <>
6 years agoReturn error when receiving CLI packet
Hannes Reinecke [Mon, 11 Aug 2014 10:34:39 +0000 (12:34 +0200)]
Return error when receiving CLI packet

When receiving a packet from the CLI we should be returning
an error code.

Signed-off-by: Hannes Reinecke <>
6 years agomultipath: do not print state 'orphan' for option '-l'
Hannes Reinecke [Mon, 11 Aug 2014 10:05:19 +0000 (12:05 +0200)]
multipath: do not print state 'orphan' for option '-l'

When called with '-l' multipath would mistakenly print a state
of 'orphan' instead off 'running' of 'offline'.
This is a regression introduced by commit 7023d320.

Signed-off-by: Hannes Reinecke <>
6 years agoFixup device-mapper 'cookie' handling
Hannes Reinecke [Tue, 29 Jul 2014 13:44:46 +0000 (15:44 +0200)]
Fixup device-mapper 'cookie' handling

device-mapper has a 'cookie', which is inserted with the ioctl
for modifying device-mapper devices.
It is used as a synchronization point between udev and any other
applications to notify the latter when udev has finished
processing the event.
Originally multipath would only use a single cookie for every
transaction, and wait for that cookie at the end of the program.
Which works well if you only have one transaction, but for several
(like calling 'multipath') it will actually overwrite the cookie
and fail to wait for earlier events.
This causes libdevmapper to create the device nodes on its own,
and the device nodes not being handled by udev.

Signed-off-by: Hannes Reinecke <>
6 years agoRemove last argument from verify_paths()
Hannes Reinecke [Tue, 29 Jul 2014 10:41:06 +0000 (12:41 +0200)]
Remove last argument from verify_paths()

Argument is always NULL, so remove it.

Signed-off-by: Hannes Reinecke <>
6 years agoAdd paths with a size of '0' as 'ghost' paths
Hannes Reinecke [Tue, 29 Jul 2014 09:51:38 +0000 (11:51 +0200)]
Add paths with a size of '0' as 'ghost' paths

SPC-3 does not require that a port in 'standby' has to support
the 'READ CAPACITY' command. As such we should not reject those
paths, but rather add them as 'ghost' paths.

Signed-off-by: Hannes Reinecke <>
6 years agoRemove sysfs_get_dev
Hannes Reinecke [Tue, 29 Jul 2014 09:29:41 +0000 (11:29 +0200)]
Remove sysfs_get_dev

Pointless, and can be replaced by udev_device_get_devnum().

Signed-off-by: Hannes Reinecke <>
6 years agomultipath: Use standard 'major' macro
Hannes Reinecke [Tue, 29 Jul 2014 09:16:33 +0000 (11:16 +0200)]
multipath: Use standard 'major' macro

Instead of carrying our own hand-crafted macros we should be using
the system-provided 'major' macro.

Signed-off-by: Hannes Reinecke <>
6 years agokpartx: use standard 'major' and 'minor' macros
Hannes Reinecke [Tue, 29 Jul 2014 09:14:39 +0000 (11:14 +0200)]
kpartx: use standard 'major' and 'minor' macros

Instead of hand-coding our own versions we should be using the
standard 'major' and 'minor' macros.

Signed-off-by: Hannes Reinecke <>
6 years agompath_persist: cleanup
Hannes Reinecke [Tue, 29 Jul 2014 09:10:02 +0000 (11:10 +0200)]
mpath_persist: cleanup

Cleanup whitespace issues and use the standard 'major' and 'minor'

Signed-off-by: Hannes Reinecke <>
6 years agoUse poll() when receiving uevents
Hannes Reinecke [Thu, 24 Jul 2014 06:51:23 +0000 (08:51 +0200)]
Use poll() when receiving uevents

Currently uevent_listen() will be adding each event individually
to the internal queue. This leads to a lock contention on high
load, as uevent_listen() has to grab the shared lock before
doing so.
This patch batches the uevent reception so that uevents will
only ever be added to the internal queue if there are no more
events pending.

Signed-off-by: Hannes Reinecke <>
6 years agoSeparate out uevent parsing functions
Hannes Reinecke [Thu, 24 Jul 2014 06:22:52 +0000 (08:22 +0200)]
Separate out uevent parsing functions

Move the uevent parsing into separate functions.
No functional change.

Signed-off-by: Hannes Reinecke <>
6 years agoCheck for valid DM_DEVICE_INFO before proceeding
Hannes Reinecke [Wed, 23 Jul 2014 13:13:08 +0000 (15:13 +0200)]
Check for valid DM_DEVICE_INFO before proceeding

Calling 'DM_DEVICE_INFO' might succeed but the returned context
might refer to an invalid device. So one needs to check the 'exists'
field to avoid this.

Signed-off-by: Hannes Reinecke <>
6 years agoDo not treat 'transport-offline' paths as 'offline'
Hannes Reinecke [Wed, 23 Jul 2014 08:54:13 +0000 (10:54 +0200)]
Do not treat 'transport-offline' paths as 'offline'

'transport-offline' status is entered whenever the transport has
detected an offline device, but the SCSI midlayer still has
references to it.
Once the last reference drops the SCSI midlayer will properly
deregister the device and multipath will be updating the status.
But until then we should treat this device as simply 'path down',
and not marking it offline.
After all, some transports like FC will be entering the
'transport-offline' state after fast_io_fail triggered, and
might revert back to 'running' after reconfiguration.

References: bnc#888378

Signed-off-by: Hannes Reinecke <>
6 years agoRevert 'return PATH_DOWN for quiesced paths'
Hannes Reinecke [Wed, 23 Jul 2014 08:51:35 +0000 (10:51 +0200)]
Revert 'return PATH_DOWN for quiesced paths'

Has been superseded by commit 00a2549a42707e5e1ef51ef6f638dc5ceaa15740

Signed-off-by: Hannes Reinecke <>
6 years agomultipath: check for running daemon when called with '-u'
Hannes Reinecke [Wed, 9 Jul 2014 09:43:28 +0000 (11:43 +0200)]
multipath: check for running daemon when called with '-u'

When multipath is called to check for a valid device it really
should check if the daemon is running. Otherwise it'll blindly
assume the device to be eligible for multipathing even though
the daemon isn't running.

Signed-off-by: Hannes Reinecke <>
6 years agoUpdate hwtable for EMC XtremIO
Hannes Reinecke [Wed, 2 Jul 2014 07:10:05 +0000 (09:10 +0200)]
Update hwtable for EMC XtremIO

Signed-off-by: Hannes Reinecke <>
6 years agomultipathd: cleanup foreground operation
Hannes Reinecke [Tue, 24 Jun 2014 06:28:39 +0000 (08:28 +0200)]
multipathd: cleanup foreground operation

When specifying '-d' it actually does two things, namely do not
daemonize the program and prints logging messages to stdout
instead of syslog.
This partially clashes with '-s' which suppresses the timestamp
printing. So separate both use cases and ensure that '-d' doesn't
overwrite '-s' if specified later.

Signed-off-by: Hannes Reinecke <>
6 years agomultipathd: handle DOMAP_RETRY
Hannes Reinecke [Tue, 24 Jun 2014 06:01:27 +0000 (08:01 +0200)]
multipathd: handle DOMAP_RETRY

Calling domap() will first check if all paths are available by
using 'flock' on each path. This might fail if other processes
are holding the lock already. In these cases we should retry
domap() as the processes should terminate eventually.

Signed-off-by: Hannes Reinecke <>
6 years agokpartx.rules: Skip kpartx for multipath events
Hannes Reinecke [Fri, 13 Jun 2014 08:43:08 +0000 (10:43 +0200)]
kpartx.rules: Skip kpartx for multipath events

Whenever multipath signals a PATH_FAILED or PATH_REINSTATED
event we don't have to call 'kpartx'; the contents on the disk
haven't changed.
And we should never call kpartx if all paths are down, irrespective
of the uevent.

Signed-off-by: Hannes Reinecke <>
6 years ago11-dm-mpath.rules: Import blkid values if all paths are down
Hannes Reinecke [Thu, 12 Jun 2014 15:35:55 +0000 (17:35 +0200)]
11-dm-mpath.rules: Import blkid values if all paths are down

When all paths are failed we should not try to run any programs
requiring disk access. However, we still need to create the
symlinks so as not to confuse systemd.
So import the blkid values from the database in these cases.

Signed-off-by: Hannes Reinecke <>
6 years agomultipath.rules: fixup race condition with systemd
Hannes Reinecke [Tue, 20 May 2014 10:34:05 +0000 (12:34 +0200)]
multipath.rules: fixup race condition with systemd

systemd will call 'fsck' on any device, even if no device
type is found. This might cause a race between the mount call
and any fsck call on the device-mapper device.
So for multipath we should arbitrary set the device type to
'none', as then systemd with detect a missing 'fsck.none'
command and skip fsck here.

Signed-off-by: Hannes Reinecke <>
6 years agomultipath.rules: Whitelist devices
Hannes Reinecke [Fri, 16 May 2014 08:29:02 +0000 (10:29 +0200)]
multipath.rules: Whitelist devices

Currently multipath runs only on SCSI and DASD
devices (and cciss, but they are no longer supported).
So we can as well whitelist them and avoid the curious
warning about 'multipath -u /dev/loop failed'.

Signed-off-by: Hannes Reinecke <>
6 years agoInstall multipath rule under '56-multipath.rules'
Hannes Reinecke [Fri, 11 Apr 2014 09:59:43 +0000 (11:59 +0200)]
Install multipath rule under '56-multipath.rules'

The multipath rule needs to be inserted between the
sg3_utils rules for it to be able to intercept
symlink generation.

References: bnc#873151

Signed-off-by: Hannes Reinecke <>
6 years agomultipath: implement option '-u' for uevents
Hannes Reinecke [Fri, 11 Apr 2014 09:23:00 +0000 (11:23 +0200)]
multipath: implement option '-u' for uevents

When calling 'multipath' from an uevent udev will not have
all information for that device, as it's being written into
the database _after_ the event has been processed.
This patch implements an option '-u' which uses the information
from the program environment when checking the device.

Signed-off-by: Hannes Reinecke <>
6 years agoRemove trailing linefeed from sysfs attributes
Hannes Reinecke [Fri, 11 Apr 2014 06:12:33 +0000 (08:12 +0200)]
Remove trailing linefeed from sysfs attributes

When reading from sysfs attributes might have a trailing linefeed,
which will then show up in the log messages as an additional

Signed-off-by: Hannes Reinecke <>
6 years agoMake checker_put() and prio_put() idempotent
Hannes Reinecke [Fri, 11 Apr 2014 06:10:36 +0000 (08:10 +0200)]
Make checker_put() and prio_put() idempotent

checker_put() and prio_put() should check whether an instance
was selected prior to dropping a reference to it.
Otherwise they'll be dropping a reference which they haven't
increased in the first place.

Signed-off-by: Hannes Reinecke <>
6 years agomultipathd: implement 'list path <path>' cli command
Hannes Reinecke [Thu, 10 Apr 2014 11:02:35 +0000 (13:02 +0200)]
multipathd: implement 'list path <path>' cli command

Implement CLI command for printing the status of a single path.

Signed-off-by: Hannes Reinecke <>
6 years agoDisable reassign maps per default
Hannes Reinecke [Fri, 11 Apr 2014 06:03:08 +0000 (08:03 +0200)]
Disable reassign maps per default

lvm has undergone various updates, and should now check for
correct device assignment. So disable the 'reassign_maps'
feature per default.

Signed-off-by: Hannes Reinecke <>
6 years agoAllow for empty path argument when printing information
Hannes Reinecke [Fri, 11 Apr 2014 06:01:38 +0000 (08:01 +0200)]
Allow for empty path argument when printing information

When calling the various print functions we should be
allowing for empty path argument.

Signed-off-by: Hannes Reinecke <>
6 years agoFixup wwid blacklist printing
Hannes Reinecke [Thu, 10 Apr 2014 11:31:14 +0000 (13:31 +0200)]
Fixup wwid blacklist printing

When a wwid is blacklisted the log message looks like
'(null): wwid XXX blacklisted'.
Fix it up by printing either the corresponding device or
avoid printing the '(null)' entry if no corresponding
device is given.

Signed-off-by: Hannes Reinecke <>
6 years agoUse 'SCSI_IDENT_.*' as the default property whitelist
Hannes Reinecke [Thu, 10 Apr 2014 10:21:52 +0000 (12:21 +0200)]
Use 'SCSI_IDENT_.*' as the default property whitelist

59-scsi-sg_utils.rules export the VPD pages as
So whenever we have a SCSI_IDENT_* property we know it
has come from VPD pages and we have a legit device.

Signed-off-by: Hannes Reinecke <>
6 years agokpartx.rules: do not call blkid
Hannes Reinecke [Thu, 10 Apr 2014 08:39:01 +0000 (10:39 +0200)]
kpartx.rules: do not call blkid

blkid is already called by the device-mapper rules, no need
to do it ourselves.

Signed-off-by: Hannes Reinecke <>
6 years agoDo not print empty device strings during discovery
Hannes Reinecke [Wed, 9 Apr 2014 10:03:27 +0000 (12:03 +0200)]
Do not print empty device strings during discovery

If the path provides no information we should not print out
empty strings, but rather an instructive message telling us so.

References: bnc#872712

Signed-off-by: Hannes Reinecke <>
6 years agomultipathd: set correct PID when running in debug mode
Hannes Reinecke [Wed, 9 Apr 2014 07:18:17 +0000 (09:18 +0200)]
multipathd: set correct PID when running in debug mode

When running in debug mode the PID is not set, causing
the PID in the pidfile to always be set to '0'.

Signed-off-by: Hannes Reinecke <>
6 years agoFixup dependencies in multipathd.service
Hannes Reinecke [Wed, 9 Apr 2014 14:39:02 +0000 (16:39 +0200)]
Fixup dependencies in multipathd.service

The multipathd.service should be started after the .socket,
and it requires local-fs-pre to be reached.
Otherwise it won't be able to access /sys etc.

References: bnc#872712

Signed-off-by: Hannes Reinecke <>
6 years agoFixup multipathd.socket to resolve ordering dependeny
Hannes Reinecke [Fri, 21 Mar 2014 11:26:06 +0000 (12:26 +0100)]
Fixup multipathd.socket to resolve ordering dependeny

Per default any socket file is started after /run is available,
as the socket might be placed there.
This results in a dependency cycle as multipathd requires the
socket, but the daemon should be started as early as possible,
and certainly before /run is mounted.

Signed-off-by: Hannes Reinecke <>
6 years agoAdd multipath rules for systemd support
Hannes Reinecke [Wed, 26 Feb 2014 13:36:43 +0000 (14:36 +0100)]
Add multipath rules for systemd support

Systemd and dracut rely on the DM_MULTIPATH_DEVICE_PATH setting
to mark the devices as used by multipathing. So add a ruleset
providing this setting.

Signed-off-by: Hannes Reinecke <>
6 years agoMake systemd installation path configurable
Hannes Reinecke [Tue, 21 Jan 2014 12:46:16 +0000 (13:46 +0100)]
Make systemd installation path configurable

Older systems might have systemd installed in /lib, so make
the path for systemd and udev configurable.

Signed-off-by: Hannes Reinecke <>
6 years agolibmultipath: Skip paths with empty wwid
Hannes Reinecke [Fri, 14 Feb 2014 09:14:09 +0000 (10:14 +0100)]
libmultipath: Skip paths with empty wwid

If the WWID is empty this is pretty much a terminal error, as
we don't have anything to identify the multipath device.
So skip those devices during discovery.

Signed-off-by: Hannes Reinecke <>
6 years agolibmultipath: Prefer deprecated 'getuid' callout
Hannes Reinecke [Fri, 14 Feb 2014 09:11:24 +0000 (10:11 +0100)]
libmultipath: Prefer deprecated 'getuid' callout

We need first to check if the deprecated 'getuid' callout
should be used, otherwise it might never be called.

Signed-off-by: Hannes Reinecke <>
6 years agodiscovery: do not fail discovery on individual devices
Hannes Reinecke [Thu, 30 Jan 2014 10:41:30 +0000 (11:41 +0100)]
discovery: do not fail discovery on individual devices

Any errors returned from individual devices during discovery do
not invalidate the entire discovery. So instead of returning
the pointless accumulated error count we should be returning
the number of devices which which could not be discovered or
the negative error number if the discovery itself failed.

Signed-off-by: Hannes Reinecke <>
6 years agoDouble uevent stacksize yet again
Hannes Reinecke [Mon, 16 Dec 2013 14:15:10 +0000 (15:15 +0100)]
Double uevent stacksize yet again

Another report indicates that the uevent stacksize might still be
too small.

Signed-off-by: Hannes Reinecke <>
6 years agolibmultipath: filter for missing property in get_refwwid()
Hannes Reinecke [Thu, 13 Feb 2014 15:33:27 +0000 (16:33 +0100)]
libmultipath: filter for missing property in get_refwwid()

get_refwwid() needs to filter for missing udev properties,
otherwise it'll accept just about any SCSI device.

Signed-off-by: Hannes Reinecke <>
6 years agompath_persist: Do not call exit() from a shared library
Hannes Reinecke [Tue, 21 Jan 2014 15:13:05 +0000 (16:13 +0100)]
mpath_persist: Do not call exit() from a shared library

mpath_persist is a shared library, and shouldn't call exit().
Just return an error code here.

And cleanup formatting while we're at it.

Signed-off-by: Hannes Reinecke <>
6 years agolibmultipath: remove compilation warning in devmapper.c
Hannes Reinecke [Mon, 16 Mar 2015 10:42:47 +0000 (11:42 +0100)]
libmultipath: remove compilation warning in devmapper.c

When LIBDM_API_DEFERRED is not defined the compiler would warn
about 'dm_cancel_remove_partmaps' being defined but never used.

Signed-off-by: Hannes Reinecke <>
6 years agoAdd find_multipaths to multipath.conf man page
Benjamin Marzinski [Fri, 13 Mar 2015 18:27:27 +0000 (13:27 -0500)]
Add find_multipaths to multipath.conf man page

find_multipaths wasn't listed in the multipath.conf man page. Add it.

Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: only add uninitialized paths in check_path
Benjamin Marzinski [Fri, 13 Mar 2015 18:27:26 +0000 (13:27 -0500)]
libmultipath: only add uninitialized paths in check_path

With find_multipaths enabled, there can be non-blacklisted paths that
are not supposed to be part of any multipath device. To make sure that
check_path doesn't keep checking them, this patch marks paths which are
fully initialized. Only uninitialized paths are checked, if they don't
belong to a multipath device.

Signed-off-by: Benjamin Marzinski <>
6 years agoadd find_multipaths option
Benjamin Marzinski [Fri, 13 Mar 2015 18:27:25 +0000 (13:27 -0500)]
add find_multipaths option

This patch adds a new option (find_multipaths) to the defaults section
of multipath.conf.  This is used to keep multipath from simply creating
multipath devices on top of any non-blacklisted device.  When this is
set to "yes", multipath will only create multipath devices when there
are actually multiple paths to the storage.  This means that in most
setups where find_multipaths is set, users don't need to bother with the
editting the blacklist, because multipath will do the work for them.
The only case where blacklisting is still necessary is if user want to
disable multipathing on LUNs that actually have multiple paths.

One of the issues with only grabbing devices with multiple paths is that
multipath can't know when it first sees a path device whether a second
path device will appear. This could be a problem, because if multipath
doesn't claim the device, something else might. For instance, a
filesystem could be automounted on a path device before the second path
device appeared.

Multipath deals with this by using the /etc/multipaths/wwids file.  If
the device wwid is listed in this file, multipath knows that it is a
path device, and can create a multipath device on it as soon as it
appears.  This means that after multipath has created a multipath device
once, it will automatically create it in the future as soon as the first
path is discovered.

In general, there are three conditions for find_multipaths to allow the
creation of a device. After passing all the checks that multipath
currently does to allow device creation, one of these three conditions
must also be true for device creation, if find_multipaths is enabled.

1. There are at least two non-blacklisted paths with the same wwid
2. The creation was manually forced, by specifying the device with the
   multipath command
3. The path's wwid is in the wwids file, which means that multipath has
   previously created a multipath device with that wwid.

Signed-off-by: Benjamin Marzinski <>
6 years agoAdd DX8700 S3 and DX8900 S3 defaults
Gerhard Wichert [Mon, 9 Mar 2015 21:48:43 +0000 (22:48 +0100)]
Add DX8700 S3 and DX8900 S3 defaults

6 years agolibmultipath: autodetect ALUA CLARiiON configurations
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:46 +0000 (21:31 -0600)]
libmultipath: autodetect ALUA CLARiiON configurations

This patch enables ALUA autodetection on EMC CLARiiON devices. EMC has
tested the change.

Signed-off-by: Benjamin Marzinski <>
6 years agoFix doublee free of alias after map add failure
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:45 +0000 (21:31 -0600)]
Fix doublee free of alias after map add failure

In ev_add_map(), if add_map_without_path() fails, the alias will have
been freed by free_multipath(), so you can't access it anymore. Also,
if the multipath device already exists, but you fail to register it,
there's no point in trying to create the device. It will fail.

Signed-off-by: Benjamin Marzinski <>
6 years agomultipathd: Add delayed path reintegration
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:44 +0000 (21:31 -0600)]
multipathd: Add delayed path reintegration

This patch adds two configuration parameters, "delay_watch_checks" and
"delay_wait_checks". delay_watch_checks sets the number of checks that
a path will be watched for, after coming back from a failure. If the
path fails again within this number of checks, when it comes back up
the next time, it will not be used until it has remained up for
delay_wait_checks checks, assuming that there are other paths to the
device.  If it is the only available path, it will immediately be

This helps setups were a path either won't stay up, or takes some time
to stabilize before it should be used.

Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: cleanup parser code
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:43 +0000 (21:31 -0600)]
libmultipath: cleanup parser code

read_value_block() and alloc_value_block() are completely unused, and can
go away. Also, all of the config file parsing is done it parse.c, so
there's no reason to make "stream" a global variable.

Signed-off-by: Benjamin Marzinski <>
6 years agomultipath: enable configuration directory
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:42 +0000 (21:31 -0600)]
multipath: enable configuration directory

Users who setup multipath on many machines sometimes want a core
configuration file that stays the same on all machines, and also secondary
configuration files that are unique to each machine to set blacklists and
aliases.  This patch enables this by adding a new configuration option,
"config_dir", which defaults to "/etc/multipath/conf.d". If this is set,
multipath will check this directory for files ending in .conf, and apply
them on top of the initial configuration file in alphabetical order.

Signed-off-by: Benjamin Marzinski <>
6 years agomultipath: blacklist virtio-blk devices
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:41 +0000 (21:31 -0600)]
multipath: blacklist virtio-blk devices

virtio-blk devices don't report anything to use as a WWID, so
multipath shouldn't waste it's time checking them.

Signed-off-by: Benjamin Marzinski <>
6 years agomultipathd: read-only bindings
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:40 +0000 (21:31 -0600)]
multipathd: read-only bindings

Multipath already uses -B to run in a mode where it won't write the the
bindings file (which can be useful in the initramfs). Its simple to make
multipathd able to work this way as well.

Signed-off-by: Benjamin Marzinski <>
6 years agolibmutipath: allow blanks in device blacklist
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:39 +0000 (21:31 -0600)]
libmutipath: allow blanks in device blacklist

As Brian De Wolf noticed, multipath crashes if you don't have both
vendor and product specified in a device blacklist entry. This patch
makes device blacklists work when either the vendor or the product is
blank. If both are missing, the entry is ignored.

Signed-off-by: Benjamin Marzinski <>
6 years agomultipathd: don't buffer output with systemd
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:38 +0000 (21:31 -0600)]
multipathd: don't buffer output with systemd

When stdout isn't hooked up to a tty (like it isn't when you start
multipathd through systemd) the stream is buffered, so messages only
come out in big chunks, or when the program quits. Instead, we should
send the messages out to systemd as we generate them, so that users
know what's happening, and in the event of a crash, they get the most
recent messages.

I realize that there is a performance impact to this.  If people are
against this approach, we could change condlog to print messages above a
certain priority to stderr and messages below that priority to stdout.
If we included a configuration option to change the priority level, then
we could always change it up if we needed to do debugging. However, the
standard level messages are very helpful in quickly diagnosing a number
of problems, so you could make a good argument that we always want
priority 2 messages printed immediately.  And if we intentionally bumped
up the debugging level, we would usually want those messages printed
immediately.  This is exactly what we get with just unbuffering stdout.

Signed-off-by: Benjamin Marzinski <>
6 years agomultipathd: add deferred_remove support
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:37 +0000 (21:31 -0600)]
multipathd: add deferred_remove support

This patch adds a new configuration option "deferrer_remove"  If this is
set to "yes", when the last path of a multipath device is removed,
multipathd will do a deferred remove on it.  This means that if the
device cannot immediately be removed, device mapper will automatically
remove it when the last user closes it.  If a path is added to the
device before then, the deferred remove will be cancelled.

Without this enabled, multipath will continue to work like before, where
it will attempt a regular remove when the last path is removed.  If
that fails because the device is in use, then the multipath device will
remain, even after the last user closes it.

Signed-off-by: Benjamin Marzinski <>
6 years agomultipathd: fix memory corruption issue
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:36 +0000 (21:31 -0600)]
multipathd: fix memory corruption issue

setup_multipath already removes the mpp if it fails, so we shouldn't be
accessing the mpp at all if it fails, and especially not freeing it.

Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: refactor partmaps code
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:35 +0000 (21:31 -0600)]
libmultipath: refactor partmaps code

There was a lot of code duplication between dm_remove_partmaps and
dm_rename_partmaps. This patch factors that out into

Signed-off-by: Benjamin Marzinski <>
6 years agoRevert "libmultipath: fixup strlcpy"
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:34 +0000 (21:31 -0600)]
Revert "libmultipath: fixup strlcpy"

This reverts commit 3a64d6491a1e83adcaf5f97edd18b7898dce241d.

strlcpy already had a check to make sure that as long as the size passed in
wasn't zero, it would leave enough space to write the final null. So, the
only check that was necessary was to see if strlcpy was called with
size = 0.

strlcpy returns the number of bytes that it took, or would take, to write
the entire string. There is no reason why bytes would usually end up
equalling size, so this commit caused strlcpy to stop null terminating many

Cc: "Hannes Reinecke <>"
Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: fix sysfs_get_size bug
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:33 +0000 (21:31 -0600)]
libmultipath: fix sysfs_get_size bug

sysfs_get_size wasn't checking for a negative return value from

Signed-off-by: Benjamin Marzinski <>
6 years agocorrectly set partition delimiter on rename
Benjamin Marzinski [Sun, 8 Mar 2015 03:31:32 +0000 (21:31 -0600)]
correctly set partition delimiter on rename

When multipath renames a device and the name switches from ending in a
number to ending in a letter or vice versa, it currently just keeps any
existing delimiter between the device name and partition number.
However the default behaviour in kpartx is to only use the 'p' delimiter
when the name ends in a number. Unfortunately, without adding a
kpartx.conf that kpartx uses to set the delimiter behavior, there's no
way for multipath to know how kpartx was run for certain device names
(ones ending in a number with a 'p' delimiter).

The patch adds a new multipath.conf defaults parameter,
"partition_delimiter". If this value is not set, when multipath renames
a device, it will act just like the kpartx default does, only adding a
'p' to names ending in a number.  If this parameter is set, multipath
will act like kpartx does with the -p option is used, and always add

Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: add overrides section to multipath.conf
Benjamin Marzinski [Wed, 19 Nov 2014 06:17:36 +0000 (00:17 -0600)]
libmultipath: add overrides section to multipath.conf

Sometimes users want to be able to set a configuration value for all their
devices (for instance, they may want all devices to set no_path_retry to
fail). The builtin device configurations make this tricky, since users need
to change each device configuration individually. To avoid that, this patch
adds a new section to multipath.conf, "overrides".  This section has all of
the attributes that are in both the devices and defaults section.
Attributes set in the overrides section have a higher priority that those
in the devices section. With this section added, the multipath
configuration order now goes:

multipaths > overrides > devices > defaults

I also made want_user_friendly_names print out where the configuration came
from, and I made made select_hwhandler and select_selector always strdup
the string, instead of only on the defaults.  Since multipathd will update
the device strings from the kernel anyway, the old way just added
complexity without saving any memory.

To store the overrides configuration, I used a hwentry structure. We may
want to make a new overrides structure, so that we set any of the defaults
values in overrides.  That way, users could skip using defaults and just
use overrides if they wanted. However, this would take some additional
changes to make sure that all the defaults options can undefined, which
they can't currently be.

Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: cleanup propsel.c with macros for common actions
Benjamin Marzinski [Thu, 2 Oct 2014 00:55:58 +0000 (19:55 -0500)]
libmultipath: cleanup propsel.c with macros for common actions

Many of the functions in propsel.c are nearly identical, except for the
names of the variables that they are dealing with.  Also, some variables
that the user configured with a keyword were just printing the variable
as an integer, which isn't very helpful without looking at the code to
see what the number stands for. They were using the variable names
instead of the config file names as well.  This patch tries to simplify
the file by using macros for the repetitive work of the functions, and
standardizes and clarifies the debug messages by using the print functions
from dict.c

Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: rewrite dict.c with function generation macros
Benjamin Marzinski [Thu, 2 Oct 2014 00:55:57 +0000 (19:55 -0500)]
libmultipath: rewrite dict.c with function generation macros

dict.c is full of nearly identical functions for setting and printing the
configuration. Many options use the exact same function with just the
variable name changing.  For options that exist in multiple sections of
multipath.conf, the functions for setting and printing the option are also
nearly identical, except for the config structure that is used.

In order to avoid this massive amount of code duplication, and also to
standardize and avoid copy/paste errors, I've written some standard
functions with the most common setting and printing code, and some macros
that take the setting and printing functions, and add the boilerplate code
that is necessary for the different sections. This means that there is
at most one unique function to set and print an option, regardless of
home many sections is appears in.  Options that just set a string or
integer don't even need their own function. They can use one of the generic

There's one trade-off that I'm not sure I chose the right way on. In
order to keep the number of macros down, I made them transfer the
data using void pointers. This means that the macro works regardless
of whether the data is a signed or unsigned int or a string or whatever.
The downside to this is that there isn't type checking.  This means that
if, for instance, someone called a function that expected a string, but
passed in an integer. The complier wouldn't catch the error.

declare_def_snprint(verbosity, print_str)

as an example, would happily treat &conf->verbosity as a string pointer.
I'm not sure how worried people are about this, but it wouldn't be too
hard to add a bunch more declare_* macros so that each was typed.

Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: Fix memory leak problem in print_multipath_topology
Yingtai Xie [Mon, 29 Dec 2014 06:44:42 +0000 (14:44 +0800)]
libmultipath: Fix memory leak problem in print_multipath_topology

/sys/block/ directory has been opened in snprint_devices, the handler
should be released when returned abnormally. Similar memory leak problem
happens in print_multipath_topology when carried out multipath -ll command.

Signed-off-by: Yingtai Xie <>
6 years agolibmultipath: Add Dell 36xxi/f support to internal hardware table
Jose Castillo [Thu, 23 Oct 2014 14:10:30 +0000 (16:10 +0200)]
libmultipath: Add Dell 36xxi/f support to internal hardware table

This patch adds support for Dell 36xxi and 36xxf arrays.

Signed-off-by: Jose Castillo <>
6 years agoAlways put watchdog in the config structure
Benjamin Marzinski [Fri, 12 Sep 2014 17:44:52 +0000 (12:44 -0500)]
Always put watchdog in the config structure

Only multipathd and libmultipath ever get compiled with USE_SYSTEMD
enabled. If the watchdog variable is only in the config structure when
USE_SYSTEMD is enabled, it means that the multipath and libmultipath
code have different views of the config structure. This causes all sorts
of errors when multipath calls a libmultipath function.

The other alternative would be to leave the preprocessor #ifdef and
make sure to compile all tools with


Removing the #ifdef in the config structure means we don't have to worry
about this mistake happening again in the future, and only takes up 8
extra bytes in the structure.

Signed-off-by: Benjamin Marzinski <>
6 years agoFix missing frees and null terminations
Benjamin Marzinski [Fri, 12 Sep 2014 17:44:50 +0000 (12:44 -0500)]
Fix missing frees and null terminations

There were a number of error code paths where multipath wasn't correctly
freeing memory.  Also, readlink doesn't null terminate strings, so
multipath needs to make sure that they get terminated.

Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: Add additional path wildcards
Benjamin Marzinski [Fri, 12 Sep 2014 17:44:49 +0000 (12:44 -0500)]
libmultipath: Add additional path wildcards

Customers have been asking if multipath can make it easier to see how various
paths in your multipath device are connected.  To help with this I've added
5 new path wildcards

%N  host WWNN
%n  target WWNN
%R  host WWPN
%r  target WWPN
%a  host adapter

Signed-off-by: Benjamin Marzinski <>
6 years agoAdd support for EMC XtremIO
Benjamin Marzinski [Fri, 12 Sep 2014 17:44:48 +0000 (12:44 -0500)]
Add support for EMC XtremIO

This is a built-in configuration I got from EMC for the XtremIO storage

Signed-off-by: Vincent Chen <>
Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: cleanup rlookup_binding
Benjamin Marzinski [Fri, 12 Sep 2014 17:44:47 +0000 (12:44 -0500)]
libmultipath: cleanup rlookup_binding

Before the use_existing_alias() code was added, the scan_device() call in
rlookup_binding always failed, complicated the function and was completely
pointless. Now it has a use, but only when called by use_existing_alias().
Instead of doing this extra work in rlookup_binding() this patch makes
use_existing_alias call scan_device() itself when necessary.

Signed-off-by: Benjamin Marzinski <>
6 years agolibmultipath: Typo in condlog in select_flush_on_last_del
Bernhard Reutner-Fischer [Tue, 2 Sep 2014 10:27:40 +0000 (12:27 +0200)]
libmultipath: Typo in condlog in select_flush_on_last_del


Signed-off-by: Bernhard Reutner-Fischer <>
6 years agoUpdate ETERNUS DX entry
Sebastian Herbszt [Mon, 30 Jun 2014 21:38:58 +0000 (23:38 +0200)]
Update ETERNUS DX entry

Add DX500 S3/DX600 S3.

Signed-off-by: Sebastian Herbszt <>
6 years agolibmultipath: Fix typo in log message of execute_program()
Ferenc Wágner [Tue, 26 Aug 2014 16:17:00 +0000 (18:17 +0200)]
libmultipath: Fix typo in log message of execute_program()

Signed-off-by: Ferenc Wágner <>
7 years agoAlign parser error messages
Christophe Varoqui [Fri, 25 Jul 2014 09:14:22 +0000 (11:14 +0200)]
Align parser error messages

Insert a comma after the line number on "parsing error" messages.

Suggested by Sebastian Herbszt.

7 years agoRevert "libmultipath: Accept "*" as a valid regular expression"
Christophe Varoqui [Fri, 25 Jul 2014 06:17:00 +0000 (08:17 +0200)]
Revert "libmultipath: Accept "*" as a valid regular expression"

This reverts commit 2912935ecf835e23ccf9cd0dfcabc393dba918a8.

It is less confusing to accept only the regular expression format
and fix the documents which reference the "*" glob as a valid

7 years agoAdd multipath.conf force_sync option
Benjamin Marzinski [Mon, 30 Jun 2014 05:14:03 +0000 (00:14 -0500)]
Add multipath.conf force_sync option

Normally multipathd runs the path checkers asynchronously. However if there
are a lot of paths, this can cause large CPU spikes (for instance, in
cases where they are all competing for the Big Kernel Lock). In these
situations, overall machine performance is better if multipath doesn't have
hundreds or even thousands of path checkers running at the same time. This
patch lets users turn off the asynchronous mode of these checks if they
see this problem.

Signed-off-by: Benjamin Marzinski <>
7 years agomake prioritizers use checker_timeout, if set
Benjamin Marzinski [Mon, 30 Jun 2014 05:14:02 +0000 (00:14 -0500)]
make prioritizers use checker_timeout, if set

The multipath prioritizers can get stuck issuing scsi commands that
don't return quickly, just like the checkers. So if checker_timeout
is set, the prioritizers should should it for their cmd timeouts as

Signed-off-by: Benjamin Marzinski <>
7 years agoImprove multipath.conf syntax checking
Benjamin Marzinski [Mon, 30 Jun 2014 05:14:01 +0000 (00:14 -0500)]
Improve multipath.conf syntax checking

multipath's parser for multipath.conf is neither very verbose or forgiving
about errors.  This patch improves both.  multipath will now warn about
obviously missing quotes and curly braces, but will still do the right thing.
It will also give more verbose error messages including a line number when
it can't parse a line.

Signed-off-by: Benjamin Marzinski <>
7 years agoorphan paths on failed add
Benjamin Marzinski [Mon, 30 Jun 2014 05:14:00 +0000 (00:14 -0500)]
orphan paths on failed add

When multipathd tries to add a path but fails doing the table reload, it
wasn't orphaning the path.  This can cause problems later if multipathd
tries to switch the pathgroup of this path which isn't actually part of
the multipath device.

Signed-off-by: Benjamin Marzinski <>
7 years agoMake multipathd orphan paths that were removed externally
Benjamin Marzinski [Mon, 30 Jun 2014 05:13:58 +0000 (00:13 -0500)]
Make multipathd orphan paths that were removed externally

Multipathd was only orphaning paths that it removed, not ones that were
removed by the multipath command.  This could cause problems if a path
was failed but not removed, and "multipath -r" was run.  multipath would
remove the path, and when multipathd updated itself, it would remove
that path from the multipath device's path list, but not orphan it.
When the path became active again, multipathd crashed trying to adjust
the pathgroups of the multipath device it had previously belonged to.

This patch makes sure that whenever multipathd updates the multipath device
table, it first makes sure the mpp->paths is uptodate.  Once it has
finished updating the device table, it orphans any paths in mpp->paths
that are no longer part of the multipath device.

Signed-off-by: Benjamin Marzinski <>
7 years agomultipath: add option '-i' to ignore wwids file
Hannes Reinecke [Fri, 4 Jul 2014 06:20:11 +0000 (08:20 +0200)]
multipath: add option '-i' to ignore wwids file

When called from udev the multipath program is used to check
if a device should be handled by multipath. Any new device,
however, will not be present in /etc/multipath/wwids, and
the check will always fail.
This patch implements the option '-i' to multipath to skip
checking the wwids file for these scenarios.

Signed-off-by: Hannes Reinecke <>
7 years agomultipath: Wrong sysfs attribute used for iSCSI settings.
Merla, ShivaKrishna [Fri, 20 Jun 2014 22:33:39 +0000 (22:33 +0000)]
multipath: Wrong sysfs attribute used for iSCSI settings.

Wrong sysfs parameter used to configure iSCSI settings.

It's always

This is the reason recovery_tmo was not getting set to
fast_io_fail_tmo value for iscsi sessions.

Signed-off-by: Shiva Krishna Merla<>
7 years agolibmultipath: Accept "*" as a valid regular expression
Bart Van Assche [Fri, 18 Jul 2014 12:54:52 +0000 (14:54 +0200)]
libmultipath: Accept "*" as a valid regular expression

Inside libmultipath regcomp() is used to compile regular expressions
specified in /etc/multipath.conf. Many multipath.conf examples contain
'product_type "*"'. However, "*" is not a valid POSIX regular expression.
Hence this patch that changes the regular expression "*" into ".*".

Signed-off-by: Bart Van Assche <>
7 years agolibmultipath: Print line number for which parsing failed
Bart Van Assche [Fri, 18 Jul 2014 12:54:13 +0000 (14:54 +0200)]
libmultipath: Print line number for which parsing failed

Make it easier to figure out which line contains a syntax error
by printing the line number and the offending line itself.

Signed-off-by: Bart Van Assche <>
7 years agolibmultipath: Zero-terminate sysfs_attr_get_value() result
Bart Van Assche [Fri, 18 Jul 2014 12:53:39 +0000 (14:53 +0200)]
libmultipath: Zero-terminate sysfs_attr_get_value() result

The callers of sysfs_attr_get_value() expect a '\0'-terminated string.
Hence terminate the string returned by this function with '\0'. Detected
by Valgrind.

Signed-off-by: Bart Van Assche <>
7 years agolibmultipath: Simplify read_line()
Bart Van Assche [Fri, 18 Jul 2014 12:53:11 +0000 (14:53 +0200)]
libmultipath: Simplify read_line()

Let read_line() zero-terminate the buffer it returns such that its
callers do not have to clear that buffer before calling read_line().

Signed-off-by: Bart Van Assche <>
7 years agoALUA prioritizer: Remove an unused variable
Bart Van Assche [Fri, 18 Jul 2014 12:52:42 +0000 (14:52 +0200)]
ALUA prioritizer: Remove an unused variable

Signed-off-by: Bart Van Assche <>
7 years agomultipath: revert fstack-protector-strong gcc option
Benjamin Marzinski [Mon, 21 Jul 2014 23:10:52 +0000 (18:10 -0500)]
multipath: revert fstack-protector-strong gcc option

In my "enable gcc format-security check" (9b7741c) commit, I changed
fstack-protector to fstack-protector-strong. This new option only exists
in gcc 4.9, which is relatively new.  This patch reverts to the
fstack-protector option for now, until gcc 4.9 has been around for longer.

Signed-off-by: Benjamin Marzinski <>
Tested-by: Sebastian Herbszt <>
7 years agoAdd missing interactive commands to multipathd man page
Benjamin Marzinski [Mon, 30 Jun 2014 05:13:59 +0000 (00:13 -0500)]
Add missing interactive commands to multipathd man page

This patch adds the missing options from the multipathd.8 man page.  It
also fixes a typo in a log message from the alua prioritizer.

Signed-off-by: Benjamin Marzinski <>
7 years agoallow users to add wwids to /etc/multipath/wwids with -a
Benjamin Marzinski [Mon, 30 Jun 2014 05:13:56 +0000 (00:13 -0500)]
allow users to add wwids to /etc/multipath/wwids with -a

The patch adds a "-a" option to multipath, that allows it to add wwids
to the /etc/multipath wwids file.

Signed-off-by: Benjamin Marzinski <>
7 years agochange conf->dry_run to conf->cmd
Benjamin Marzinski [Mon, 30 Jun 2014 05:13:55 +0000 (00:13 -0500)]
change conf->dry_run to conf->cmd

conf->dry_run is getting used for many different things besides running
multipath in dry_run mode, and the name and values were getting
increasingly confusing.  This patch switches the variable from
conf->dry_run to conf->cmd, and folds in conf->list.  It also changes
the value to a enum.

Signed-off-by: Benjamin Marzinski <>
7 years agoenable gcc format-security check
Benjamin Marzinski [Mon, 30 Jun 2014 05:13:54 +0000 (00:13 -0500)]
enable gcc format-security check

-Wformat-security warns about format-strigs that represent possible
security problems.  This is check is now enabled for fedora builds, and it
seems like a reasonable thing to always be checking.

Signed-off-by: Benjamin Marzinski <>
7 years agoReturn the correct size buffer in set_value()
Benjamin Marzinski [Mon, 30 Jun 2014 05:13:53 +0000 (00:13 -0500)]
Return the correct size buffer in set_value()

When multipath was mallocing the buffer in set_value, it was using
sizeof(char *), instead of sizeof(char), so it was allocating a buffer
big enough for an array of pointers instead of characters.

Signed-off-by: Benjamin Marzinski <>
7 years agoFix memory issues in path reordering failure code paths
Benjamin Marzinski [Mon, 30 Jun 2014 05:13:52 +0000 (00:13 -0500)]
Fix memory issues in path reordering failure code paths

There were some possible NULL pointer dereferences and multiple frees
in the failure code paths of the path reordering code.  This patch
cleans them up.

Signed-off-by: Benjamin Marzinski <>