4 years agoDrop the multipath.conf.* files
Christophe Varoqui [Tue, 10 May 2016 06:02:19 +0000 (08:02 +0200)]
Drop the multipath.conf.* files

multipath.conf.synthetic is useless.

multipath.conf.defaults can be extracted from a live daemon.

multipath.conf.annotated information is all in the man page.

4 years agolibmultipath: Fixup 'DM_DEVICE_RELOAD' handling
Hannes Reinecke [Mon, 9 May 2016 10:53:05 +0000 (12:53 +0200)]
libmultipath: Fixup 'DM_DEVICE_RELOAD' handling

libdevmapper has the 'quirk' that DM_DEVICE_CREATE is translated
internally into a create/load/resume sequence, and the associated
cookie will wait for the last 'resume' to complete.
However, DM_DEVICE_RELOAD has no such translation, so if there
is a cookie assigned to it the caller _cannot_ wait for it,
as the cookie will only ever be completed upon the next
multipathd already has some provisions for that (but even there
the cookie handling is dodgy), but 'multipath -r' doesn't know
about this.
So to avoid any future irritations this patch updates the
dm_addmad_reload() call to handle the call to DM_DEVICE_RESUME
correctly and removes the special handling from domap().

Signed-off-by: Hannes Reinecke <>
4 years agodevmapper: remove 'udev_sync' argument from dm_simplecmd_noflush()
Hannes Reinecke [Mon, 9 May 2016 10:53:04 +0000 (12:53 +0200)]
devmapper: remove 'udev_sync' argument from dm_simplecmd_noflush()

The 'udev_sync' argument is always '1', so we can remove it.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: wait for udev in cli_resume()
Hannes Reinecke [Mon, 9 May 2016 10:53:03 +0000 (12:53 +0200)]
multipathd: wait for udev in cli_resume()

When calling 'cli_resume()' we should be waiting for udev to
ensure the device really has been resumed.

Signed-off-by: Hannes Reinecke <>
4 years agodevmapper: wait for udev in dm_simplecmd_noflush()
Hannes Reinecke [Mon, 9 May 2016 10:53:02 +0000 (12:53 +0200)]
devmapper: wait for udev in dm_simplecmd_noflush()

When calling dm_simplecmd_noflush() with udev_flags set we
need to set the 'need_sync' flag otherwise the udev flags
will never be set.

Signed-off-by: Hannes Reinecke <>
4 years agoconfigure: Rename ACT_RENAME2 to ACT_FORCERENAME
Hannes Reinecke [Mon, 9 May 2016 10:53:01 +0000 (12:53 +0200)]
configure: Rename ACT_RENAME2 to ACT_FORCERENAME

Use a more descriptive name instead of 'ACT_RENAME2'.

Signed-off-by: Hannes Reinecke <>
4 years agodevmapper: do not call dm_udev_complete if dm_task_set_cookie() failed
Hannes Reinecke [Mon, 9 May 2016 10:53:00 +0000 (12:53 +0200)]
devmapper: do not call dm_udev_complete if dm_task_set_cookie() failed

As per Benjamin Marzinski libdevice-mapper will take care of cleaning
up the cookie for us.
So there's no need to call dm_udev_complete() if dm_task_set_cookie()

Signed-off-by: Hannes Reinecke <>
4 years agodevmapper: do not flush I/O for DM_DEVICE_CREATE
Hannes Reinecke [Mon, 9 May 2016 10:52:59 +0000 (12:52 +0200)]
devmapper: do not flush I/O for DM_DEVICE_CREATE

DM_DEVICE_CREATE loads a new table, so there cannot be any
I/O pending. Hence we should be setting the 'no flush'
and 'skip lockfs' flag to avoid delays during creation.

Signed-off-by: Hannes Reinecke <>
4 years agoRevert 'multipathd: Do not print misleading message "not found in pathvec"'
Hannes Reinecke [Tue, 3 May 2016 09:18:53 +0000 (11:18 +0200)]
Revert 'multipathd: Do not print misleading message "not found in pathvec"'

As discussed on the mailing list the logging messages should remain,
so revert the patch, increase the logging level and update the
message itself to be more instructive.

Signed-off-by: Hannes Reinecke <>
4 years agoAllow specific CLI commands to run unlocked
Hannes Reinecke [Thu, 24 Jul 2014 12:03:56 +0000 (14:03 +0200)]
Allow specific CLI commands to run unlocked

When multipath is busy with checking paths or processing udev
events it'll take the vector lock, causing the CLI
to become unresponsive.
This patch allows certain CLI commands to not wait for the vector
lock, so that those commands will always succeed.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: push down lock in checkerloop()
Hannes Reinecke [Thu, 24 Jul 2014 09:52:26 +0000 (11:52 +0200)]
multipathd: push down lock in checkerloop()

Instead of grabbing the lock at the start of the checkerloop
and releasing it at the end we should be holding it only
during the time when we actually need it.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: asynchronous configuration
Hannes Reinecke [Thu, 21 Aug 2014 09:10:23 +0000 (11:10 +0200)]
multipathd: asynchronous configuration

For initial configuration multipathd waits until it has synchronized
with the existing setup. On larger systems this takes up quite
some time (I've measured 80 seconds on a system with 1024 paths)
causing systemd to stall and the system to fail booting.
This patch makes the initial configuration asynchronous, and
using the same codepath as the existing 'reconfigure' CLI

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: Increase uxclnt timeout
Hannes Reinecke [Fri, 15 Apr 2016 08:45:01 +0000 (10:45 +0200)]
multipathd: Increase uxclnt timeout

When calling uxclnt we need to increase the timeout, otherwise
we will not be able to get a reply if the daemon runs into an
uxlsnr timeout.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: implement 'show map $map format $fmt'
Hannes Reinecke [Mon, 8 Jun 2015 13:59:33 +0000 (15:59 +0200)]
multipathd: implement 'show map $map format $fmt'

Similar to the existing 'show map $map topology', but allowing
formatted content.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: make 'dm_addmap' static
Hannes Reinecke [Tue, 30 Jun 2015 11:55:31 +0000 (13:55 +0200)]
libmultipath: make 'dm_addmap' static

dm_addmap() is only used within devmapper.c, so it can be made

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: Provide standard error description on cli failure
Hannes Reinecke [Thu, 18 Dec 2014 10:52:57 +0000 (11:52 +0100)]
multipathd: Provide standard error description on cli failure

When the cli command fails we should be returning the error
in addition to the standard help text.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: strict loop timings
Hannes Reinecke [Mon, 8 Jun 2015 10:47:07 +0000 (12:47 +0200)]
multipathd: strict loop timings

This patch implements a new configuration value 'strict_timing',
which causes each path checker loop to start at exactly one second
after the last one. Longer path checker loops will be properly
accounted, so that each path is guaranteed to be checked within
'polling_interval' seconds.

Signed-off-by: Hannes Reinecke <>
4 years agodmparser: Use find_path_by_dev()
Hannes Reinecke [Thu, 24 Mar 2016 07:36:10 +0000 (08:36 +0100)]
dmparser: Use find_path_by_dev()

There are two functions for looking up paths, find_path_by_dev() and
find_path_by_devt(). To avoid any inconsistencies we should be
using find_path_by_dev() here and allocate a path with both values.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: sanity check on store_path()
Hannes Reinecke [Mon, 11 Apr 2016 09:22:30 +0000 (11:22 +0200)]
libmultipath: sanity check on store_path()

If a path has neither pp->dev nor pp->dev_t set we cannot
identify the path at all.
So reject any path where this is not the case.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: ensure 'dev_t' is set when store paths
Hannes Reinecke [Wed, 17 Feb 2016 10:03:08 +0000 (11:03 +0100)]
libmultipath: ensure 'dev_t' is set when store paths

We need both, 'pp->dev' and 'pp->dev_t' for correct lookup to
work. So ensure dev_t is always being updated when storing a new path.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: remove 'get_info' argument for adopt_paths()
Hannes Reinecke [Wed, 17 Feb 2016 09:55:36 +0000 (10:55 +0100)]
libmultipath: remove 'get_info' argument for adopt_paths()

The 'get_info' argument was always set to '1', so we can drop it.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: Do not switch paths on empty multipath tables
Hannes Reinecke [Mon, 25 Jan 2016 07:36:07 +0000 (08:36 +0100)]
multipathd: Do not switch paths on empty multipath tables

If all paths are removed from a multipath table there is no
point in trying to switch path groups as we don't have any.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: set uxsock_timeout after reconfiguration
Hannes Reinecke [Thu, 14 Apr 2016 07:39:18 +0000 (09:39 +0200)]
multipathd: set uxsock_timeout after reconfiguration

We should be setting the global variable 'uxsock_timeout' after
reconfiguration, not from within the uxsock_listen() function.

Signed-off-by: Hannes Reinecke <>
4 years agoUse multipath wwid if path wwid is empty
Hannes Reinecke [Wed, 9 Apr 2014 10:01:02 +0000 (12:01 +0200)]
Use multipath wwid if path wwid is empty

During booting udev might not be fully initialized, causing
it to not return any information for a path.
The multipath map, however, would still be present.
In these cases we should use the multipath map as the
path wwid to avoid spurious path failures during boot.
The situation will be corrected anyway as udev will
be sending out the 'real' events very soon after.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: accept zero-size paths in ev_add_path()
Hannes Reinecke [Fri, 19 Jun 2015 13:35:02 +0000 (15:35 +0200)]
multipathd: accept zero-size paths in ev_add_path()

Paths in ALUA 'standby' state are not required to support
READ CAPACITY, and hence might report a size of '0'. However,
they are valid devices and should be added to the existing

Signed-off-by: Hannes Reinecke <>
Hannes Reinecke [Fri, 5 Jun 2015 08:38:13 +0000 (10:38 +0200)]

The 'DM_UDEV_DISABLE_LIBRARY_FALLBACK' should be set always,
as with modern installations udev is responsible for maintaining
the '/dev/mapper' directory.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: remove 'use_uuid' argument from dm_addmap()
Hannes Reinecke [Tue, 30 Jun 2015 11:58:16 +0000 (13:58 +0200)]
libmultipath: remove 'use_uuid' argument from dm_addmap()

'use_uuid' was only ever set for DM_DEVICE_CREATE, so we
can check the task and remove the 'use_uuid' argument.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: remove 'needsync' argument from dm_simplecmd_noflush
Hannes Reinecke [Wed, 13 Apr 2016 09:28:36 +0000 (11:28 +0200)]
libmultipath: remove 'needsync' argument from dm_simplecmd_noflush

Argument is always '1'.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: improve uxlsnr
Hannes Reinecke [Wed, 13 Apr 2016 07:05:30 +0000 (09:05 +0200)]
multipathd: improve uxlsnr

Improve uxlsnr by adding a lock around the poll structure and
not reallocating memory for every poll, thereby significantly
speedup processing.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: skip uninitialized devices during reconfiguration
Hannes Reinecke [Thu, 18 Dec 2014 10:02:08 +0000 (11:02 +0100)]
multipathd: skip uninitialized devices during reconfiguration

libudev has a separate filter setting to skip uninitialized
devices during enumeration.

Signed-off-by: Hannes Reinecke <>
4 years agoOnly filter for udev property if uid_attribute is present
Hannes Reinecke [Tue, 22 Jul 2014 09:37:25 +0000 (11:37 +0200)]
Only filter for udev property if uid_attribute is present

It only makes sense to filter for an existing udev property if the
'uid_attribute' variable is set. Otherwise multipath did not
get the uid from udev and so we might not even have udev information.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: use a shared lock to co-operate with udev
Hannes Reinecke [Tue, 24 Jun 2014 06:49:15 +0000 (08:49 +0200)]
libmultipath: use a shared lock to co-operate with udev

udev since v214 is placing a shared lock on the device node
whenever it's processing the event. This introduces a race
condition with multipathd, as multipathd is processing the
event for the block device at the same time as udev is
processing the events for the partitions.
And a lock on the partitions will also be visible on the
block device itself, hence multipathd won't be able to
lock the device.
When multipath manages to take a lock on the device,
udev will fail, and consequently ignore this entire event.
Which in turn might cause the system to malfunction as it
might have been a crucial event like 'remove' or 'link down'.

So we should better use LOCK_SH here; with that the flock
call in multipathd _and_ udev will succeed and the events
can be processed.

Signed-off-by: Hannes Reinecke <>
4 years agoEnsure multipathd is started before systemd-udev-trigger.service
Hannes Reinecke [Wed, 8 Apr 2015 08:59:36 +0000 (10:59 +0200)]
Ensure multipathd is started before systemd-udev-trigger.service

We should be starting multipathd before systemd-udev-trigger
is started to reduce the load on udev during startup.

Signed-off-by: Hannes Reinecke <>
4 years ago11-dm-mpath.rules: Only import ID_FS_XXX variables if not set
Hannes Reinecke [Wed, 25 Mar 2015 08:47:40 +0000 (09:47 +0100)]
11-dm-mpath.rules: Only import ID_FS_XXX variables if not set

We should only import ID_FS_XXX variables if they are not set,
otherwise we might be overwriting existing results.

Signed-off-by: Hannes Reinecke <>
4 years agoLoad all device handler modules on startup
Hannes Reinecke [Tue, 17 Mar 2015 13:24:18 +0000 (14:24 +0100)]
Load all device handler modules on startup

Upon multipathd startup the device handler modules are not
necessarily loaded, so we need to load them prior to startup.

Signed-off-by: Hannes Reinecke <>
4 years agoAdd dependency on systemd-udevd.service
Hannes Reinecke [Wed, 18 Mar 2015 10:21:37 +0000 (11:21 +0100)]
Add dependency on systemd-udevd.service

During startup libdevmapper checks if udev is running or not.
And if it finds udev is _not_ running it'll create the device-nodes
internally, regardless on any magic ioctl flags.
This results in the occasionally message 'conflicting device node found'
in the syslog.

Signed-off-by: Hannes Reinecke <>
4 years agomultipath: move the warning 'failed to get wwid' to lvl4 verbosity
Christophe Varoqui [Tue, 3 May 2016 06:38:41 +0000 (08:38 +0200)]
multipath: move the warning 'failed to get wwid' to lvl4 verbosity

4 years agolibmultipath: avoid double semicolon in lock.h
Hannes Reinecke [Wed, 13 Apr 2016 07:58:29 +0000 (09:58 +0200)]
libmultipath: avoid double semicolon in lock.h

The definitions for lock() already have a semicolon, resulting
in a double semicolon when using the definitions like a normal

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: Do not print misleading message 'not found in pathvec'
Hannes Reinecke [Mon, 14 Dec 2015 10:25:03 +0000 (11:25 +0100)]
multipathd: Do not print misleading message 'not found in pathvec'

When looking up a path in the existing configuration it is perfectly
possible for the path not to be present.
This should not generate a message as it might be errorneously
interpreted as an error.

Signed-off-by: Hannes Reinecke <>
4 years agolibmpathpersist: Fixup whitespaces in Makefile
Hannes Reinecke [Thu, 14 Apr 2016 12:29:25 +0000 (14:29 +0200)]
libmpathpersist: Fixup whitespaces in Makefile

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: additional logging messages when formatting callout
Hannes Reinecke [Thu, 14 Apr 2016 10:29:32 +0000 (12:29 +0200)]
libmultipath: additional logging messages when formatting callout

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: call get_uid() for all paths
Hannes Reinecke [Mon, 9 Nov 2015 15:44:49 +0000 (16:44 +0100)]
libmultipath: call get_uid() for all paths

When we're reading the device UID off uevents we don't have to
check the path state as we're not actually doing I/O.
So pass in the path_state to get_uid() and evaluate it only
if ->getuid is selected.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: correctly display checker status
Hannes Reinecke [Mon, 3 Aug 2015 09:46:25 +0000 (11:46 +0200)]
libmultipath: correctly display checker status

The '%d chk' message should only be used if there are active paths,
otherwise the path checker most certainly haven't been run.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: correctly initialize pp->sg_id
Hannes Reinecke [Wed, 11 Nov 2015 12:38:57 +0000 (13:38 +0100)]
libmultipath: correctly initialize pp->sg_id

The default SCSI protocol is 'SCSI_PROTOCOL_UNSPEC';

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: print error message for invalid arguments
Hannes Reinecke [Thu, 22 Oct 2015 10:06:16 +0000 (12:06 +0200)]
multipathd: print error message for invalid arguments

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: fixup a crash when invoking CLI commands
Hannes Reinecke [Wed, 15 Jul 2015 12:47:45 +0000 (14:47 +0200)]
multipathd: fixup a crash when invoking CLI commands

The command buffer wasn't cleared, so the CLI might crash on startup.

Signed-off-by: Hannes Reinecke <>
4 years agomultipathd: fixup queueing mode in 'show maps status'
Hannes Reinecke [Mon, 8 Jun 2015 07:35:22 +0000 (09:35 +0200)]
multipathd: fixup queueing mode in 'show maps status'

When manually disabling queueing via 'disablequeueing map $map'
the queueing status in 'show maps status' is not updated.

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: finally fix dev_loss_tmo setting
Hannes Reinecke [Wed, 13 Apr 2016 12:29:06 +0000 (14:29 +0200)]
libmultipath: finally fix dev_loss_tmo setting

We need to take the current value when comparing
'dev_loss_tmo' and 'fast_io_fail', otherwise we still
might be getting an error as we might comparing wrong

Signed-off-by: Hannes Reinecke <>
4 years agolibmultipath: Do not use 'sscanf' for parsing integers
Hannes Reinecke [Wed, 19 Nov 2014 09:20:39 +0000 (10:20 +0100)]
libmultipath: Do not use 'sscanf' for parsing integers

'sscanf' doesn't really have a way of signalling errors,
so strtoul(l) should be used instead.

Signed-off-by: Hannes Reinecke <>
4 years agoAllow for empty SCSI revision
Hannes Reinecke [Mon, 11 Aug 2014 06:35:55 +0000 (08:35 +0200)]
Allow for empty SCSI revision

Some (broken) SCSI devices return an empty SCSI revision, but
this doesn't indicate a broken device. So allow for an empty
revision string when discover devices.

Signed-off-by: Hannes Reinecke <>
4 years agoAdd LIO-ORG/SUSE RBD backend hardware defaults
Hannes Reinecke [Tue, 1 Dec 2015 08:12:05 +0000 (09:12 +0100)]
Add LIO-ORG/SUSE RBD backend hardware defaults

The LIO-ORG RBD backend always supports ALUA, and should be assigned
the correct values for multipathing.

Signed-off-by: Hannes Reinecke <>
4 years agoAdd HP MSA 2040 to the hardware table
Hannes Reinecke [Mon, 2 Mar 2015 11:18:23 +0000 (12:18 +0100)]
Add HP MSA 2040 to the hardware table

Signed-off-by: Hannes Reinecke <>
4 years agokpartx: Install rules file with correct prefix
Hannes Reinecke [Fri, 14 Feb 2014 11:25:21 +0000 (12:25 +0100)]
kpartx: Install rules file with correct prefix

We don't need to swizzle names in the spec file, the Makefile
should be doing it on itself.

Signed-off-by: Hannes Reinecke <>
4 years agokpartx: parse emulated DASD devices
Hannes Reinecke [Wed, 20 May 2015 10:02:13 +0000 (12:02 +0200)]
kpartx: parse emulated DASD devices

Emulated DASD devices do not support the DASDINFO ioctl, so we
need to generate the information by hand. After all, fdasd
does the same.

Signed-off-by: Hannes Reinecke <>
4 years agokpartx: handle more than 256 loop devices
Hannes Reinecke [Mon, 27 Oct 2014 09:37:41 +0000 (10:37 +0100)]
kpartx: handle more than 256 loop devices

Update the loop handling code to support more than 256

Signed-off-by: Hannes Reinecke <>
4 years agokpartx: Fixup persistent name generation
Hannes Reinecke [Wed, 23 Jul 2014 07:41:11 +0000 (09:41 +0200)]
kpartx: Fixup persistent name generation

kpartx_id would overwrite the 'DM_NAME' variable, which were
causing things to break later on. Seeing that kpartx_id is
only ever used to generate persistent device names I've updated
kpartx_id and kpartx.rules to rely on existing variables where
possible, avoiding any accidental overwrite of existing variables.

Signed-off-by: Hannes Reinecke <>
4 years agomultipath-tools: update docs hannes
Xose Vazquez Perez [Tue, 19 Apr 2016 15:35:06 +0000 (17:35 +0200)]
multipath-tools: update docs

removes TODO, adds meaningful information to README
and replaces dead urls in ChangeLog.

Cc: Christophe Varoqui <>
Cc: device-mapper development <>
Signed-off-by: Xose Vazquez Perez <>
4 years agomultipath: fix memory leak and segfault in reconfigure
Germano Percossi [Thu, 11 Feb 2016 19:30:54 +0000 (19:30 +0000)]
multipath: fix memory leak and segfault in reconfigure

Within the reconfigure function, the global pointer conf is
stored in a local variable and then assigned NULL.
If load_config should fail, for any reason, we end up with
a memory leak, as soon as we leave the function, and with
the global pointer conf set to NULL, leading to a segfault
as soon as it is dereferenced.

I tested it by calling a reconfigure and making the first
allocation in load_config fail but any failure in load_config
would do.
From a user perspective the CLI reports "fail".

If something like this should happen there are at least 2 possible

1) If a second immediate reconfigure succeeds, the conf now is fine but
   the leak stays
2) If the previous point does not happen, any command trying to access
   "conf" would fail. On my test box a "show conf" segfaulted.

The fix is simple but in case of failure at least the previous
conf is kept in memory without leaks or segfaluts

Signed-off-by: Germano Percossi <>
4 years agoUpdate version to 0.6.0 0.6.0
Christophe Varoqui [Mon, 18 Apr 2016 09:32:43 +0000 (11:32 +0200)]
Update version to 0.6.0

4 years agomultipath: add wwn keyword to weightedpath prio
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:12 +0000 (18:20 -0500)]
multipath: add wwn keyword to weightedpath prio

multipath's weightedpath prioritizer now supports a "wwn" keyword,
instead of just the "hbtl" and "devname" keywords. If this is used the
regular expression for matching the device is of the form
"host_wwnn:host_wwpn:target_wwnn:target_wwpn". These identifiers can
either be looked up through sysfs, or using the following "multipathd
show paths format" wildcards "%N:%R:%n:%r"

For instance, you could do something like this
        prio weightedpath
        prio_args "wwn 0x200000e08b80aea0:.*:.*:.* 30
0x200100e08ba0aea0:0x210100e08ba0aea0:.*:.* 20
.*:.** 10"

This would map:
- all paths with the FC Host WWNN of 0x200000e08b80aea0 to a priority of
- all paths with the FC Host WWNN of 0x200100e08ba0aea0 and the Host
  WWPN of 0x210100e08ba0aea0 to a priority of 20
- all paths with the iscsi target name of (which multipath has always
  treated as the same as the FC Target WWNN) to a priority of 10
- and all other paths to a priority of 0

Signed-off-by: Benjamin Marzinski <>
4 years agomultipathd: use 64-bit int for command key
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:11 +0000 (18:20 -0500)]
multipathd: use 64-bit int for command key

There are now more than 32 keywords for the multipathd client commands.
Since these are represented by a bit flags, multipathd needs more than
32 bits for the client command keycodes. However, multipath is currently
using unsigned long for these. This makes some client commands work
incorrectly on 32-bit systems. This patch switches all the keys to use
uint64_t instead.

Signed-off-by: Benjamin Marzinski <>
4 years agomultipathd.service: remove blk-availability Requires
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:10 +0000 (18:20 -0500)]
multipathd.service: remove blk-availability Requires

multipathd.service can start up and run just fine without
blk-availability.service. It is only necessary to coordinate shutdown
order in certain multipath setups (over iscsi for instance). Thus,
instead of "Requires", multipathd.service should use "Wants"

Signed-off-by: Benjamin Marzinski <>
4 years agomultipath: check partitions unused before removing
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:09 +0000 (18:20 -0500)]
multipath: check partitions unused before removing

If kpartx partition devices are in-use, multipath will not be able to
perform a non-deferred remove of the multipath device.  So, before
starting the remove, multipath should verify that none of the partition
devices are currently in-use.

Signed-off-by: Benjamin Marzinski <>
4 years agomultipathd: print "fail" when remove fails
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:08 +0000 (18:20 -0500)]
multipathd: print "fail" when remove fails

When multipathd fails to remove a path or a map, it was printing "ok"
instead of "fail", and exitting with a 0 return code.  Now it prints
"fail" and exits with a 1, like it does when other commands fail.

Signed-off-by: Benjamin Marzinski <>
4 years agomultipath: add exclusive_pref_bit for alua prio
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:07 +0000 (18:20 -0500)]
multipath: add exclusive_pref_bit for alua prio

The SCSI spec is pretty vague on exactly what the tpgs pref bit should
guarantee. In the past, the alua prioritizer has put paths with the pref
bit set in their own priority group, and some users complained.
Currently, the alua prioritizer puts paths with the tpgs pref bit set in
the highest priority path group. However, if the path with the pref bit
set is active/optimized, it will be grouped with other active/optimized
paths. Other users complained about this. The only good solution is to
allow users to configure what setting the pref bit does.

This patch allows user to set

prio_args "exclusive_pref_bit"

for the alua prioritizer.  If this is set, a paths with the pref bit set
will never get grouped with paths that don't have it set. If this is
not set, multipath will continue to work as it currently does, where
they may be grouped when all paths are active/optimized.

Signed-off-by: Benjamin Marzinski <>
4 years agokpartx: verify partition devices
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:06 +0000 (18:20 -0500)]
kpartx: verify partition devices

When kpartx is modifies devices (either by removing them, or
reloading them), it doesn't first verify that the device really
is a partition of the expected device.  If a dm device just happens
to have the same name as a kpartx created device would, kpartx can
either delete that device or remap it, causing all sorts of problems.

This patch makes kpartx check the uuid to verify that the device it is
modifying really is a partition device for the correct dm device.

Signed-off-by: Benjamin Marzinski <>
4 years agomultipath: Fix minor text issues
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:05 +0000 (18:20 -0500)]
multipath: Fix minor text issues

The multipath.conf man page gave the incorrect default for
queue_without_daemon. The multipath usage output listed the -p option
twice. And multipath was misspelled in an mpathpersist error message.
This patch fixes these issues.

Signed-off-by: Benjamin Marzinski <>
4 years agomultipathd: delay reloads during creation
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:04 +0000 (18:20 -0500)]
multipathd: delay reloads during creation

lvm needs PV devices to not be suspended while the udev rules are
running, for them to be correctly identified as PVs. However, multipathd
will often be in a situation where it will create a multipath device
upon seeing a path, and then immediately reload the device upon seeing
another path.  If multipath is reloading a device while processing the
udev event from its creation, lvm can fail to identify it as a PV. This
can cause systems to fail to boot. Unfortunately, using udev
synchronization cookies to solve this issue would cause a host of other
issues that could only be avoided by a pretty substantial change in how
multipathd does locking and event processing. The good news is that
multipathd is already listening to udev events itself, and can make sure
that it isn't reloading when it shouldn't be.

This patch makes multipathd delay or refuse any reloads that would
happen between the time when it creates a device, and when it receives
the change uevent from the device creation. The only reloads that it
refuses are from the multipathd interactive commands that make no sense
on a not fully started device.  Otherwise, it processes the event or
command, and sets a flag to either mark that device for an update, or
to signal that multipathd needs a reconfigure. When the udev event for
the creation arrives, multipath will reload the device if necessary. If
a reconfigure has been requested, and no devices are currently being
created, multipathd will also do the reconfigure then.

Also this patch adds a configurable timer "missing_uev_wait_timeout"
defaulting to 30 seconds. If the udev creation event has not arrived
after this timeout has triggered, multipathd will print an warning
message, and re-enable device reloads, as if the event had occured.

Users can also manually re-enable device reloads by running

multipathd add map <map_waiting_on_udev>

Signed-off-by: Benjamin Marzinski <>
4 years agolibmultipath: check correct function for define
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:03 +0000 (18:20 -0500)]
libmultipath: check correct function for define

multipath was setting LIBUDEV_API_RECVBUF in the makefile if
udev_monitor_set_resolve_buffer_size existed. However the correct
fuction name (and the one used in the code) is
udev_monitor_set_receive_buffer_size. As a result, multipath was never
setting the receive buffer size. This patch simply fixes the Makefile

Signed-off-by: Benjamin Marzinski <>
4 years agomultipathd: fail if pidfile can't be created
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:02 +0000 (18:20 -0500)]
multipathd: fail if pidfile can't be created

Right now, multipathd ignores failures from pidfile_create.  This means
that multiple multipathd processes can be running at the same time. If
someone runs "multipathd" and doesn't add a command after it, a new
process will be created, even if one is already running. To avoid this,
multipathd needs to actually fail if the pidfile can't be created or
locked. Since we only really need the pidfile to keep from launching
multiple processes, we can create in earlier in startup. This patch
moves pidfile_create to as soon as we can be sure that we can log an
error message, and fails multipathd if the create fails.

Signed-off-by: Benjamin Marzinski <>
4 years agolibmultipath: Cut down on alua prioritizer ioctls
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:01 +0000 (18:20 -0500)]
libmultipath: Cut down on alua prioritizer ioctls

Currently, running the alua prioritizer on a path causes 5 ioctls on
many devices.  get_target_port_group_support() returns whether alua is
supported. get_target_port_group() gets the TPG id. This often takes two
ioctls because 128 bytes is not a large enough buffer size on many
devices. Finally, get_asymmetric_access_state() also often takes two
ioctls because of the buffer size. This can get to be problematic when
there are thousands of paths.  The goal of this patch to to cut this
down to one call in the usual case.

In order to do this, get_target_port_group_support() is now only called
when get_target_port_group() fails, to provide a more useful error
message. Also, before doing an SGIO ioctl to get the vpd83 data,
multipath first tries to read it from sysfs.

Signed-off-by: Benjamin Marzinski <>
4 years agolibmultipath: fix PAD and PRINT macros
Benjamin Marzinski [Thu, 7 Apr 2016 23:20:00 +0000 (18:20 -0500)]
libmultipath: fix PAD and PRINT macros

The PAD and PRINT macros are multi-line macros that aren't enclosed in
braces. This means that if they are used as single line code blocks
with no braces, they won't work correctly. This is currently happening
with the PAD macro, but should be fixed in both.

Signed-off-by: Benjamin Marzinski <>
4 years agolibmultipath: add ignore_new_boot_devs option
Benjamin Marzinski [Thu, 7 Apr 2016 23:19:59 +0000 (18:19 -0500)]
libmultipath: add ignore_new_boot_devs option

When multipath relies on the wwids file to determine whether a device is
a multipath path (with "multipath -c"), it will fail the first time a
new multipathable device is discovered, since the wwid clearly won't be
in the wwids file.  This is usually fine.  Multipath will still set
itself up on the device, and add the wwid to the wwids file. However,
this causes a race, where multipath won't claim the path immediately,
and something else may.  Later multipath will try, and possibly succeed
at, setting itself up on that device.

I've seen cases where this can cause problems during boot on and
immediately after install, where multipath racing with LVM on an already
labelled device can get the machine into a state where boot fails. This
can be avoided if multipath simply doesn't set itself up on any devices
that it didn't claim (with "multipath -c") in the initramfs.  It can
still safely attempt to set itself up on these devices later in boot,
after the regular filesystem has been set up.

To allow this, this patch adds a new multipahtd commandline option, -n. When
multipathd is run with this set, it will not create multipath devices if
their wwid isn't already in the wwids file. This means that only devices
that are claimed by "multipath -c" will be used by multipathd.

Signed-off-by: Benjamin Marzinski <>
4 years agoAdd libmpathcmd library and use it internally
Benjamin Marzinski [Thu, 7 Apr 2016 23:19:58 +0000 (18:19 -0500)]
Add libmpathcmd library and use it internally

Other programs would like to communicate with multipathd to issue
command or check status.  Instead of having them exec multipathd,
I've pulled the code that sends commands and receives replies from
multipathd into its own library.  I've made the multipath tools use
this library internally as well.

Signed-off-by: Benjamin Marzinski <>
4 years agoFix issues with user_friendly_names initramfs bindings
Benjamin Marzinski [Thu, 7 Apr 2016 23:19:57 +0000 (18:19 -0500)]
Fix issues with user_friendly_names initramfs bindings

Multipath has an issue with user_friendly_names set in the initramfs.
If the bindings are in the initramfs bindings file, it will create them,
and it may use bindings that are different than the ones in the regular
file system.  Once multipathd starts up in the regular file system, it
will try to register the existing bindings, but that may (and in many
cases, is likely to) fail. If it can't reanme it, will pick a new
binding. Since when multipathd starts discovering the existing devices,
it obviously doesn't know all of the existing devices yet, it may very
well pick a binding that's already in use by a device that it hasn't
discovered yet. In this case multipath will be unable to rename the
device to the new binding. Unfortunately, if it fails the rename, it
never resets the alias of the device stored in the mpvec to current
alias of the actual dm device. So multipath will have devices in the
mpvec where the alias and the wwid don't match the actual dm devices
that exist.  This can cause all sorts of problems.

This patch does two things to deal with this.  First, it makes sure that
if the rename fails, the device will reset its alias to the one that it
currently has. Second, it fixes the -B option to actually work
correctly, so that it can be started that way in the initramfs.

Signed-off-by: Benjamin Marzinski <>
4 years agoretrigger uevents to try and get the uid through udev
Benjamin Marzinski [Thu, 7 Apr 2016 23:19:56 +0000 (18:19 -0500)]
retrigger uevents to try and get the uid through udev

Ideally, udev will be able to grab the wwid when a path device is
discovered, but sometimes this isn't possible. In these cases, the
best thing that could happen would be for udev to actually get the
information, and add it to its database. This patch makes multipath
retrigger uevents a limited number of times before giving up and
trying to get the information itself.

There are two configurables that control how it does this,
"retrigger_tries" and "retrigger_delay". The first sets the number of
times it will try to retrigger a uevent to get the wwid, the second
sets the amount of time to wait between retriggers.

This patch currently only tries reinitializing the path on change events
after multipathd has triggered a change event, and it only tries once
per triggered change event.  Now, its possible that other change events
could occur on the device without multipathd tirggering them.  As the
patch stands now, it won't try to initialize the device on those.  It will,
however still try in the checkerloop, but only after it has finished
retriggering the uevents. We could be much more aggressive here, and assume
that devices that simply won't have a WWID should already be taken care of
by the blacklists, so it would be always a good idea to recheck devices on
change events. What would be ideal is if udev would let us know when it had
problems or timed out when processing a uevent, so we would know if
retiggering the uevent would be useful.

Signed-off-by: Benjamin Marzinski <>
4 years agomultipathd: use /run instead of /var/run
Benjamin Marzinski [Thu, 7 Apr 2016 23:19:55 +0000 (18:19 -0500)]
multipathd: use /run instead of /var/run

/var/run is now usually a symlink to /run.  If /var is on a separate
filesytem, when multipathd starts up, it might end up writing to
/var/run before the /var filesytem is mounted and thus not have its
pidfile accessible at /var/run afterwards.  On most distrubutions /run
is now a tmpfs and should always be available before multipathd is
started, so multipath should just write there directly, instead of
through the symlink.

If /var/run is not a symlink, continue using it.

Signed-off-by: Benjamin Marzinski <>
4 years agomultipath-tools: prevent unnecessary reinstate of stand-by paths with implicit tags...
Shiva Krishna [Tue, 8 Mar 2016 16:26:57 +0000 (17:26 +0100)]
multipath-tools: prevent unnecessary reinstate of stand-by paths with implicit tags mode and no active array paths

multipathd treats "stand-by" path as active(ghost) and reinstate path.This
causes I/O hang issues and lots of "change" udev events in cases where only
stand-by paths are present in multipath map and target supports only
implicit tpgs mode(active/passive arrays)

This can happen during system boot where only stand-by paths are discovered
first and continuous retry of I/O's by dm-multipath and change(failed)
events are hogging multipathd and slowing down the entire boot process with
large number of volumes mapped (~100s).

Selecting path checkers other than tur is not a solution as well, as they
will continuously throw messages saying paths are failed for stand-by

This patch will prevent re-instate of stand-by paths in this situation and
thus prevent unnecessary i/o with failed events during boot or when active
array goes down temporarily.

With this, for targets supporting only alua and implicit tpgs mode,
paths are not reinstated by path checker unless there is an active path in
the map.

Detailed steps to hit the I/O hang issue even with no_path_retry:

1. Delete all active paths.

mpathal (2e0176ad6309077166c9ce90033bfa248_1) dm-2 Nimble,Server
size=20G features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 8:0:5:1 sdg 8:96  active ghost running
  `- 8:0:6:1 sdh 8:112 active ghost running

2. Issue I/O on mpath with zero active paths.

dd if=/dev/mapper/mpathal of=/dev/null bs=512 count=1 iflag=direct &

Nov 23 15:10:36 hitdev-rhel67 multipathd: mpathal: sdg - tur checker
reports path is in standby state
Nov 23 15:10:36 hitdev-rhel67 multipathd: 8:96: reinstated
Nov 23 15:10:36 hitdev-rhel67 multipathd: mpathal: queue_if_no_path enabled
Nov 23 15:10:36 hitdev-rhel67 multipathd: mpathal: Recovered to normal mode
Nov 23 15:10:36 hitdev-rhel67 multipathd: mpathal: remaining active paths:1
Nov 23 15:10:36 hitdev-rhel67 kernel: sd 8:0:5:1: alua: port group 02
state S non-preferred supports tolusna
Nov 23 15:10:36 hitdev-rhel67 kernel: device-mapper: multipath: Failing
path 8:96.
Nov 23 15:10:36 hitdev-rhel67 multipathd: 8:96: mark as failed
Nov 23 15:10:36 hitdev-rhel67 multipathd: mpathal: Entering recovery mode:
Nov 23 15:10:36 hitdev-rhel67 multipathd: mpathal: remaining active paths:

3. Monitor udev events every 5 seconds.

# udevadm monitor

KERNEL[1448320131.061837] change   /devices/virtual/block/dm-2 (block)
KERNEL[1448320131.064802] change   /devices/virtual/block/dm-2 (block)
UDEV  [1448320131.082838] change   /devices/virtual/block/dm-2 (block)
UDEV  [1448320131.102134] change   /devices/virtual/block/dm-2 (block)
KERNEL[1448320135.551737] change   /devices/virtual/block/dm-2 (block)
KERNEL[1448320135.552701] change   /devices/virtual/block/dm-2 (block)

Signed-off-by: ShivaKrishna Merla <>
Reviewed-by: Hannes Reinecke <>
Reviewed-by: Benjamin Marzinski <>
4 years agoFix loopback file with kpartx -av
Mathieu Trudel-Lapierre [Wed, 3 Feb 2016 08:24:08 +0000 (09:24 +0100)]
Fix loopback file with kpartx -av

Commit b407050aff25678c8d60cdbb9ac7d3ff44d5a155 apparently breaks the use
of loopback-mounted files if you try to use them directly with kpartx -av.

For instance:
qemu-img create foo.img 20M
sgdisk -n 1 foo.img
kpartx -av foo.img

Fails with the following error:
device-mapper: reload ioctl on loop0p1 failed: No such device
create/reload failed on loop0p1
add map loop0p1 (0:0): 0 4192256 linear 0:0 2048

This can be fixed by stat()'ing the loop device again after picking it

4 years agokpartx: support device names with spaces
Mauricio Faria de Oliveira [Wed, 20 Jan 2016 13:52:45 +0000 (11:52 -0200)]
kpartx: support device names with spaces

Device names with spaces fail to be added to device-mapper tables
because spaces are field separators.  In order to support it, use
device major:minor numbers, instead.  While still there, make the
verbose output of container- and contained-slices consistent.

This is useful on some scenarios with arbitrary loop device names,
and non-user_friendly_names multipath WWIDs with spaces (eg, QEMU
emulated hard drives, and some IBM devices) on some distros.

- V2: Use major()/minor() instead of MAJOR()/MINOR() (build errors).
      Update test-case verification output.
      Thanks: Christophe Varoqui


# img="/tmp/my.img"
# spacename="/dev/my space name"

# truncate --size=1G "$img"
# lodev=$(sudo losetup --find --show "$img")
# ln -sf "$lodev" "$spacename"

# ls -l $lodev "$spacename"
brw-rw----. 1 root disk 7, 0 Jan 20 11:15 /dev/loop0
lrwxrwxrwx. 1 root root   10 Jan 20 11:16 /dev/my space name -> /dev/loop0

# fdisk $lodev

# fdisk -l $lodev
      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            2048      264191      131072   83  Linux
/dev/loop0p2          264192      788479      262144   83  Linux
/dev/loop0p3          788480     2097151      654336    5  Extended
/dev/loop0p5          790528      856063       32768   83  Linux
/dev/loop0p6          858112      989183       65536   83  Linux
/dev/loop0p7          991232     1515519      262144   83  Linux

Without patch:

# ./kpartx/kpartx -av "$spacename"
device-mapper: reload ioctl on my\x20space\x20name1 failed: Invalid argument
create/reload failed on my space name1
add map my space name1 (0:0): 0 262144 linear /dev/my space name 2048

device-mapper: reload ioctl on my\x20space\x20name2 failed: Invalid argument
create/reload failed on my space name2
add map my space name2 (0:0): 0 524288 linear /dev/my space name 264192

device-mapper: reload ioctl on my\x20space\x20name3 failed: Invalid argument
create/reload failed on my space name3
add map my space name3 (0:0): 0 2 linear /dev/my space name 788480

device-mapper: reload ioctl on my\x20space\x20name5 failed: Invalid argument
add map my space name5 : 0 65536 linear /dev/my space name 790528

device-mapper: reload ioctl on my\x20space\x20name6 failed: Invalid argument
add map my space name6 : 0 131072 linear /dev/my space name 858112

device-mapper: reload ioctl on my\x20space\x20name7 failed: Invalid argument
add map my space name7 : 0 524288 linear /dev/my space name 991232

(note: line breaks added for clarity)

With patch:

# ./kpartx/kpartx -av "$spacename"
add map my space name1 (253:3): 0 262144 linear 7:0 2048
add map my space name2 (253:4): 0 524288 linear 7:0 264192
add map my space name3 (253:5): 0 2 linear 7:0 788480
add map my space name5 (253:6): 0 65536 linear 7:0 790528
add map my space name6 (253:7): 0 131072 linear 7:0 858112
add map my space name7 (253:8): 0 524288 linear 7:0 991232

# dmsetup table | sort
my space name1: 0 262144 linear 7:0 2048
my space name2: 0 524288 linear 7:0 264192
my space name3: 0 2 linear 7:0 788480
my space name5: 0 65536 linear 7:0 790528
my space name6: 0 131072 linear 7:0 858112
my space name7: 0 524288 linear 7:0 991232

# ls -l /dev/mapper/
total 0
crw-------. 1 root root 10, 236 Jan 11 16:29 control
lrwxrwxrwx. 1 root root       7 Jan 20 11:19 my\x20space\x20name1 -> ../dm-3
lrwxrwxrwx. 1 root root       7 Jan 20 11:19 my\x20space\x20name2 -> ../dm-4
lrwxrwxrwx. 1 root root       7 Jan 20 11:19 my\x20space\x20name3 -> ../dm-5
lrwxrwxrwx. 1 root root       7 Jan 20 11:19 my\x20space\x20name5 -> ../dm-6
lrwxrwxrwx. 1 root root       7 Jan 20 11:19 my\x20space\x20name6 -> ../dm-7
lrwxrwxrwx. 1 root root       7 Jan 20 11:19 my\x20space\x20name7 -> ../dm-8

Thanks: Scott Moser (pointers to the error and test-case).

Signed-off-by: Mauricio Faria de Oliveira <>
4 years agoAdd hardware defaults for the PURE FlashArray devices
Brian Bunker [Wed, 20 Jan 2016 06:57:19 +0000 (07:57 +0100)]
Add hardware defaults for the PURE FlashArray devices

4 years agofix unmatched params when mpath prout rollback
Xieyingtai [Thu, 15 Oct 2015 12:06:19 +0000 (14:06 +0200)]
fix unmatched params when mpath prout rollback

Mpath prout register may rollback, but the params are not matched in
creating thread for each path.

4 years agolibmpathpersist: Set open fds limit in mpath_lib_init
Xieyingtai [Wed, 14 Oct 2015 06:06:46 +0000 (08:06 +0200)]
libmpathpersist: Set open fds limit in mpath_lib_init

Mpath persistent reserve out may fail due to file open failed when
too many devices were discoveryed but fd numbers not enough.

Set open fds limit just like multipath in that scene.

4 years agoFix sun partition numbering
Benjamin Marzinski [Thu, 8 Oct 2015 19:44:50 +0000 (14:44 -0500)]
Fix sun partition numbering

On Sun labeled devices, the kpartx partition numbers weren't agreeing
with the underlying device partition numbers.  This is because kpartx
doesn't count slices with no sectors, when determining the numbering.
This patch counts these empty slices, so the numbering comes out the

Signed-off-by: Benjamin Marzinski <>
4 years agoadd raw format multipathd commands
Benjamin Marzinski [Thu, 8 Oct 2015 19:44:45 +0000 (14:44 -0500)]
add raw format multipathd commands

This patch adds the following multipathd interactive commands

show paths raw format $fmt
show maps raw format $fmt

These commands work just like the regular "show ... format"
commands, except that they don't print a header, and don't add
any extra padding that isn't in the format string.  This should
make it easier for programs wanting to parse the output from
these commands.

Signed-off-by: Benjamin Marzinski <>
4 years agoMake multipath ignore devices without mpath prefix
Benjamin Marzinski [Thu, 8 Oct 2015 19:44:51 +0000 (14:44 -0500)]
Make multipath ignore devices without mpath prefix

Multpathd currently assumes that it controls all devices of "multipath"
type. In order to allow people to create multipath type devices outside
of the multipath-tools, this patch makes multipathd only modify devices
if they have a uuid that starts with "mpath-". This was a suggestion
from Hannes a couple of months ago.

Signed-off-by: Benjamin Marzinski <>
4 years agoIncrease host buffer size
Benjamin Marzinski [Thu, 8 Oct 2015 19:44:49 +0000 (14:44 -0500)]
Increase host buffer size

Currently the host buffer only has space for 7 characters, this means
on systems with many scsi hosts (1000 or more), multipath will overflow
this buffer. This can happen pretty easily if there are a large number
of iscsi devices.  This patch increases the host buffer to hold 15
characters, which can deal with 100000000000000 scsi hosts.

Signed-off-by: Benjamin Marzinski <>
4 years agolibmpathpersist: uninstall man page correctly
Benjamin Marzinski [Thu, 8 Oct 2015 19:44:48 +0000 (14:44 -0500)]
libmpathpersist: uninstall man page correctly

the libmpathpersist man pages were being installed to
/usr/share/man/man3, but uninstalled from /usr/share/man/man8.

Signed-off-by: Benjamin Marzinski <>
4 years agoRevert "change order of multipath.rules"
Christophe Varoqui [Tue, 13 Oct 2015 07:30:27 +0000 (09:30 +0200)]
Revert "change order of multipath.rules"

This reverts commit 4340aca696857c1077b00ff6bdc0454a07929aad.

NACK by Hannes Reinecke:

56-multipath.rules has been placed bevor persistent storage so that
it can override settings in 60-persistent-storage.rules.

If you need some additional settings to fixup things after that
please add a new rules file.

4 years agoRemove duplicate hwtable entry for XtremIO
Hannes Reinecke [Mon, 30 Mar 2015 06:23:22 +0000 (08:23 +0200)]
Remove duplicate hwtable entry for XtremIO

Commit b47e607408e1edce3a03744b4aefa292723c7fc6 introduced a new
hwtable entry for EMC XtremIO instead of updating the existing

Signed-off-by: Hannes Reinecke <>
4 years agoresize reply buffer for mutipathd help message
Benjamin Marzinski [Fri, 15 May 2015 23:14:13 +0000 (18:14 -0500)]
resize reply buffer for mutipathd help message

Unlike the other reply messages from multipathd, the generic help
message code couldn't resize the buffer, and the reply had grown too big
for the initial buffer size. This was causing memory corruption and
crashing multipathd instead of printing a help message. This patch
increases the size of the initial reply buffer, and makes the help
message code able to resize the buffer so this doesn't happen in the

Signed-off-by: Benjamin Marzinski <>
4 years agoMake multipath deactivate devices before iscsi shutdown
Benjamin Marzinski [Fri, 15 May 2015 23:14:12 +0000 (18:14 -0500)]
Make multipath deactivate devices before iscsi shutdown

The multipath devices need to be deactivated before iscsi is shutdown,
otherwise the multipath devices will generate a lot of error messages
when it loses its iscsi path devices.

Signed-off-by: Benjamin Marzinski <>
4 years agomake kpartx -d remove all partitions
Benjamin Marzinski [Fri, 15 May 2015 23:14:10 +0000 (18:14 -0500)]
make kpartx -d remove all partitions

Currently kpartx -d only removes the partitions that have entries in the
partition table.  If you remove a partition from the device, and then
run kpartx -d, it will not delete that partition (kpartx -u will).  I don't
see any value in leaving partition devices for partitions that don't even
exist anymore, so this patch makes -d delete all partitions.

Signed-off-by: Benjamin Marzinski <>
4 years agochange order of multipath.rules
Benjamin Marzinski [Fri, 15 May 2015 23:14:09 +0000 (18:14 -0500)]
change order of multipath.rules

At least for RedHat, the rule that calls scsi_id is
60-persistent-storage.rules, so the multipath rule needs to come
after this.

Signed-off-by: Benjamin Marzinski <>
4 years agoupdate multipath rules to deal with partition devices
Benjamin Marzinski [Fri, 15 May 2015 23:14:08 +0000 (18:14 -0500)]
update multipath rules to deal with partition devices

Partition devices should inherit the DM_MULTIPATH_DEVICE_PATH
state of their parents, and if they are part of multipath path devices,
they shouldn't have their own ID_FS_TYPE

Signed-off-by: Benjamin Marzinski <>
4 years agoRemove trailing whitespace
Christophe Varoqui [Tue, 6 Oct 2015 07:22:53 +0000 (09:22 +0200)]
Remove trailing whitespace

4 years agofix memory leaks on realloc failures
Benjamin Marzinski [Fri, 15 May 2015 23:14:05 +0000 (18:14 -0500)]
fix memory leaks on realloc failures

When realloc fails, it doesn't free the existing memory.  In many places,
multipath was just forgetting about that that memory. It needs to free
up the existing memory, or to reset back to using it.

Signed-off-by: Benjamin Marzinski <>
4 years agoUse image file device/inode to find the correct loop device in kpartx
Risto Kankkunen [Mon, 29 Jun 2015 15:39:48 +0000 (18:39 +0300)]
Use image file device/inode to find the correct loop device in kpartx

Previously kpartx used the "lo_name" field of struct loop_info to store
and match the image file name. That field is not intended to store path
names (it's not big enough). Therefore kpartx was unable to delete
mappings to file paths longer than 63 characters. It also didn't
properly handle relative file paths: two different files with identical
relative path names could not be mapped. Instead kpartx would modify
the existing mapping when seeing a new file with the same relative path.

The "loopinfo" structure contains the image file device and inode
numbers. Use those to uniquely identify the correct loop device.

4 years agolibmultipath: Fix information not shown when first path is down.
Gabriel Krisman Bertazi [Mon, 5 Oct 2015 20:19:17 +0000 (17:19 -0300)]
libmultipath: Fix information not shown when first path is down.

vendor_id and product_id information are not shown when displaying
multipath topology if the first path is down.

0QEMU_QEMU_HARDDISK_HELLOWORLD dm-0 ,      <--- Missing vendor and product
size=10G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=active
| `- #:#:#:# -   #:#  active undef running
`-+- policy='service-time 0' prio=0 status=enabled
  `- 2:0:1:0 sdd 8:48 active undef running

This happens because we only look at the first_path when printing the
topology.  This patch looks at every slot in the path vector until we
find one with the correct value.

Signed-off-by: Gabriel Krisman Bertazi <>
4 years agomultipathd: Fixing add map functionality
Tejaswini Poluri [Tue, 28 Jul 2015 09:56:56 +0000 (15:26 +0530)]
multipathd: Fixing add map functionality

Add map feature of multipathd tools fails as the device
is also been completely removed along with removing the map
in the remove map code(ev_remove_map()).
So when add map is called we are creating the device again
in cli_add_map() using the coloasce_paths code.

Signed-off-by:Tejaswini Poluri <>