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 <>
5 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 <>

5 years agolibmultipath: make vpd page 0x80 optional
Hannes Reinecke [Mon, 16 Feb 2015 10:10:47 +0000 (11:10 +0100)]
libmultipath: make vpd page 0x80 optional

VPD page 0x80 is optional, so we shouldn't return an error if
the page is not present.

Signed-off-by: Hannes Reinecke <>
5 years agoDo not automatically fall back to vpd uid generation
Hannes Reinecke [Tue, 16 Dec 2014 10:51:12 +0000 (11:51 +0100)]
Do not automatically fall back to vpd uid generation

When a wwid via uid_attribute cannot be generated we should
not fall back to using sysfs vpd attributes automatically.
The uid_attribute can be set to virtually anything and an
automatic fallback will then generated a different wwid,
leading to an incorrect setup.
A fallback is only valid if the uid_attribute value
is the default setting of 'ID_SERIAL', for which the
format is fixed.

Signed-off-by: Hannes Reinecke <>
5 years agomultipathd: use SG_IO as fallback to generate uid
Hannes Reinecke [Mon, 15 Dec 2014 10:11:15 +0000 (11:11 +0100)]
multipathd: use SG_IO as fallback to generate uid

If both udev attribute and sysfs vpd fails to generate a valid
WWID fallback to use SG_IO directly.

Signed-off-by: Hannes Reinecke <>
5 years agoSeparate out vpd parsing functions
Hannes Reinecke [Mon, 15 Dec 2014 09:42:13 +0000 (10:42 +0100)]
Separate out vpd parsing functions

Signed-off-by: Hannes Reinecke <>
5 years agolibmultipath: unset 'uid_attribute' on failure
Hannes Reinecke [Thu, 11 Dec 2014 15:15:41 +0000 (16:15 +0100)]
libmultipath: unset 'uid_attribute' on failure

Due to a race condition within udev the 'uid_attribute'
might not always be set. So we should be zeroing the
'uid_attribute' when retrieving the uid by other means,
otherwise the discovery process will blacklist the device.

Signed-off-by: Hannes Reinecke <>
5 years agolibmultipath: Fall back to SG_IO if no UID could be assigned
Hannes Reinecke [Wed, 10 Dec 2014 08:35:20 +0000 (09:35 +0100)]
libmultipath: Fall back to SG_IO if no UID could be assigned

Relying on udev attributes or sysfs vpd pages might fail,
in which case we're unable to assign an UID and multipath
will fail to start up.
Implement a fallback to read VPD page 0x83 directly in
these cases.

Signed-off-by: Hannes Reinecke <>
5 years agoUpdate multipath.conf.5 to clarify wwid generation
Hannes Reinecke [Tue, 22 Jul 2014 10:07:26 +0000 (12:07 +0200)]
Update multipath.conf.5 to clarify wwid generation

Add a new section in multipath.conf.5 to clarify wwid generation
and update wrong defaults for the property whitelist.

Signed-off-by: Hannes Reinecke <>
5 years agoUse sysfs attribute vpd_pg80 to read serial number
Hannes Reinecke [Wed, 3 Sep 2014 12:14:45 +0000 (14:14 +0200)]
Use sysfs attribute vpd_pg80 to read serial number

There is no need to issue an ioctl to read the serial number
as it's already present in sysfs. And we should not print
out the serial number unconditionally but rather check
the discovery mask.

Signed-off-by: Hannes Reinecke <>
5 years agoAssign local priority for NAA VPD descriptor
Hannes Reinecke [Wed, 10 Dec 2014 08:13:10 +0000 (09:13 +0100)]
Assign local priority for NAA VPD descriptor

Some devices assign several NAA VPD descriptors. So implement
an internal priority to select the 'best' NAA descriptor.

Signed-off-by: Hannes Reinecke <>
5 years agoRead wwid from sysfs vpg_pg83 attribute
Hannes Reinecke [Tue, 22 Jul 2014 09:39:15 +0000 (11:39 +0200)]
Read wwid from sysfs vpg_pg83 attribute

Using 'uid_attribute' per default has the problem that udev
might not be able to retrieve the device ID in time as the
device might be (temporarily) blocked.
It also has the problem that the 'ID_SERIAL' attribute is
not well defined and might have been overridden by other udev

As recent kernels have a 'vpd_pg83' sysfs attribute multipath
should be reading this one directly and extract the uid from there.
With that multipath does not need to do any I/O to generate the
device wwid, eliminating one common error cause during failover.

Signed-off-by: Hannes Reinecke <>
5 years agoSkip USB devices during discovery
Hannes Reinecke [Wed, 3 Sep 2014 12:31:14 +0000 (14:31 +0200)]
Skip USB devices during discovery

Some USB devices even present VPD pages, but they still remain
USB devices, and we shouldn't run multipath on those.
So detect USB devices properly and skip them during discovery.

Signed-off-by: Hannes Reinecke <>
5 years agoIgnore devices when sysfs_get_tgt_nodename fails
Hannes Reinecke [Wed, 3 Sep 2014 12:16:43 +0000 (14:16 +0200)]
Ignore devices when sysfs_get_tgt_nodename fails

If sysfs_get_tgt_nodename fails we should not try to use this

Signed-off-by: Hannes Reinecke <>
5 years agomultipathd: use local variable for watchdog configuration
Hannes Reinecke [Wed, 3 Sep 2014 06:21:15 +0000 (08:21 +0200)]
multipathd: use local variable for watchdog configuration

The 'watchdog' setting in struct config needs to be a local
variable in multipathd/main.c, as the config will be freed
during reconfiguration and the checkerloop might then
access an invalid structure.

Signed-off-by: Hannes Reinecke <>
5 years agoRevert to ACT_RELOAD in domap if the map exists
Hannes Reinecke [Thu, 21 Aug 2014 09:57:55 +0000 (11:57 +0200)]
Revert to ACT_RELOAD in domap if the map exists

ACT_CREATE checks for an existing map already, so we might as
well revert to ACT_RELOAD in these cases and avoid an error
during configuration.

Signed-off-by: Hannes Reinecke <>
5 years agoRemove dm_udev_XXX wrapper functions
Hannes Reinecke [Wed, 20 Aug 2014 12:56:09 +0000 (14:56 +0200)]
Remove dm_udev_XXX wrapper functions

As the definitions are encapsulated with the correct definitions
anyway there is no need to have private wrappers here.

Signed-off-by: Hannes Reinecke <>
5 years agomultipath: enable sync support
Hannes Reinecke [Fri, 16 May 2014 08:20:33 +0000 (10:20 +0200)]
multipath: enable sync support

multipath didn't enable 'sync support' for device-mapper,
causing device-mapper to create the device nodes internally
rather than relying on udev here.

Signed-off-by: Hannes Reinecke <>
5 years agomultipathd: lock cli client list
Hannes Reinecke [Wed, 20 Aug 2014 08:57:22 +0000 (10:57 +0200)]
multipathd: lock cli client list

Signed-off-by: Hannes Reinecke <>
5 years agouxlsnr: use typedef for trigger function
Hannes Reinecke [Wed, 20 Aug 2014 09:19:05 +0000 (11:19 +0200)]
uxlsnr: use typedef for trigger function

Signed-off-by: Hannes Reinecke <>
5 years agomultipathd: Use standard lists for CLI handling
Hannes Reinecke [Tue, 19 Aug 2014 11:46:48 +0000 (13:46 +0200)]
multipathd: Use standard lists for CLI handling

We already have standard list handling macros in list.h, so
we should be using them for CLI, too.

Signed-off-by: Hannes Reinecke <>
5 years agoUse strlen() when checking for valid wwid
Hannes Reinecke [Tue, 19 Aug 2014 10:31:10 +0000 (12:31 +0200)]
Use strlen() when checking for valid wwid

The wwid is required to be a string, so we should be using
strlen() when checking for a valid WWID.

Signed-off-by: Hannes Reinecke <>
5 years agomultipathd: Issue warning on CLI command timeout
Hannes Reinecke [Mon, 18 Aug 2014 10:22:22 +0000 (12:22 +0200)]
multipathd: Issue warning on CLI command timeout

Some CLI commands like 'reconfigure' could take longer than the
socket timeout, causing the CLI to report 'timeout receiving packet'.
In these cases the multipath daemon should issue a warning with
the actual time spent in the CLI call to give the administator
some hints on the best socket timeout.

Signed-off-by: Hannes Reinecke <>
5 years agoRework uev_add_path()
Hannes Reinecke [Mon, 9 Mar 2015 11:06:35 +0000 (07:06 -0400)]
Rework uev_add_path()

Rework uev_add_path() to handle failed and blacklisted
paths properly.

Signed-off-by: Hannes Reinecke <>
5 years agoAllow zero-sized devices during configuration
Hannes Reinecke [Mon, 18 Aug 2014 11:22:47 +0000 (13:22 +0200)]
Allow zero-sized devices during configuration

A size of '0' doesn't indicate an invalid device; other paths might
end up with a correct size.

Signed-off-by: Hannes Reinecke <>
5 years agomultipathd: do not remove paths without uevents
Hannes Reinecke [Wed, 13 Aug 2014 17:56:52 +0000 (19:56 +0200)]
multipathd: do not remove paths without uevents

multipathd should not remove any paths without the corresponding
uevent. Otherwise the daemon will never be able to reinstate that
path as it wouldn't get any uevents.

Signed-off-by: Hannes Reinecke <>
5 years agomultipathd: reload map if reinstate failed
Hannes Reinecke [Tue, 12 Aug 2014 09:56:21 +0000 (11:56 +0200)]
multipathd: reload map if reinstate failed

The kernel might fail the 'reinstate' device-mapper message
if the path is disabled. In these cases we need to reload the
map to give device-mapper a chance to add the correct devices
to the table.

Signed-off-by: Hannes Reinecke <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>
5 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 <>