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

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

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

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

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

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

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

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

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

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

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

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

References: bnc#872712

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

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

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

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

References: bnc#872712

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

And cleanup formatting while we're at it.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

This reverts commit 3a64d6491a1e83adcaf5f97edd18b7898dce241d.

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

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

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

sysfs_get_size wasn't checking for a negative return value from

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

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

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

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

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

multipaths > overrides > devices > defaults

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

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

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

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

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

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

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

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

declare_def_snprint(verbosity, print_str)

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

Add DX500 S3/DX600 S3.

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

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

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

Suggested by Sebastian Herbszt.

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

This reverts commit 2912935ecf835e23ccf9cd0dfcabc393dba918a8.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Wrong sysfs parameter used to configure iSCSI settings.

It's always

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Signed-off-by: Benjamin Marzinski <>
7 years agoDon't forget to reload table when both reload and rename is required
Vaughan Cao [Wed, 25 Jun 2014 08:57:33 +0000 (16:57 +0800)]
Don't forget to reload table when both reload and rename is required

We encounter the following case:

@ After adding a multipaths section into /etc/multipath.conf to specify 'alias'
@ and other attributes for a particular multipath device and
@ reloading/restarting the multipathd service, only renaming of the multipath
@ device is done, other attribute changes are ignored.
@ It is more evident if you directly run 'multipath -r' to reload devmap after
@ adding the 'multipaths' section with alias into /etc/multipath.conf.
@ When reload/restart multipathd service or 'multipath -r' again, new settings
@ can be applied right.

It's because that in select_action() when force_reload is set, if we also need
rename the mpp device, reload action won't be taken any more.

I did this patch by introducing a new action ACT_RENAME2 to group these two
action. Test passed. However, it seems to be a rough patch and I am not
certain if this bind is fine refering to dm_reassign. Please comment, Thanks.

Signed-off-by: Vaughan Cao <>
7 years agocheck info.exists to get valid value
Vaughan Cao [Wed, 25 Jun 2014 08:08:28 +0000 (16:08 +0800)]
check info.exists to get valid value

dm_task_get_info will still return 1 if device doesn't exist.
Check info.exists to ensure major and minor values are valid.

There is no reason to assign info.open_count to @r here.

Signed-off-by: Vaughan Cao <>
7 years agomultipath-tools: mismatch between CDB allocation length and SG_IO dxfer_len
Sebastian Herbszt [Sat, 5 Apr 2014 11:13:23 +0000 (13:13 +0200)]
multipath-tools: mismatch between CDB allocation length and SG_IO dxfer_len


while playing with multipath-tools and scst I got the following warning:

[ 6382.467569] [3806]: scst: scst_parse_cmd:826:Warning: expected
transfer length 256 for opcode 0x12 (handler vdisk_blockio, target
scst_local) doesn't match decoded value 128
[ 6382.467574] [3806]: scst_parse_cmd:828:Suspicious CDB:
[ 6382.467579]  (h)___0__1__2__3__4__5__6__7__8__9__A__B__C__D__E__F
[ 6382.467581]    0: 12 01 c0 00 80 00   ......

This happened when my scst target pretended to be a CLARiiON.
I noticed a mismatch in emc_clariion_prio (libmultipath/prioritizers/emc.c)
between the allocation length and dxfer_len:

int emc_clariion_prio(const char *dev, int fd)
        unsigned char sense_buffer[256];
        unsigned char sb[128];
        unsigned char inqCmdBlk[INQUIRY_CMDLEN] = {INQUIRY_CMD, 1, 0xC0, 0,
                                                sizeof(sb), 0};


        memset(&sense_buffer, 0, 256);
        io_hdr.interface_id = 'S';
        io_hdr.cmd_len = sizeof (inqCmdBlk);
        io_hdr.mx_sb_len = sizeof (sb);
        io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
        io_hdr.dxfer_len = sizeof (sense_buffer);
        io_hdr.dxferp = sense_buffer;
        io_hdr.cmdp = inqCmdBlk;
        io_hdr.sbp = sb;
        io_hdr.timeout = 60000;
        io_hdr.pack_id = 0;

The following change shrinks the size of sense_buffer to 128.


7 years agomultipath-tools: Mismatch between allocation length and transfer length in rdac prio
Merla, ShivaKrishna [Mon, 19 May 2014 14:49:03 +0000 (14:49 +0000)]
multipath-tools: Mismatch between allocation length and transfer length in rdac prio

Fix mismatch between allocation length and dxfer len in rdac prio.

Signed-off-by: shiva krishna merla <>
7 years agokpartx: fix extended partition size for >512b sectors
Phillip Susi [Mon, 9 Jun 2014 15:24:58 +0000 (11:24 -0400)]
kpartx: fix extended partition size for >512b sectors

Extended partitions only get 2 sectors for 512 byte sector size,
to allow LILO the 1024 bytes of room it needs.  Larger sector size
disks already have room and so only use 1 sector.

Signed-off-by: Phillip Susi <>
7 years agoRemove trailing whitespaces from previous patch
Christophe Varoqui [Tue, 10 Jun 2014 05:55:23 +0000 (07:55 +0200)]
Remove trailing whitespaces from previous patch

7 years agolibmultipath: Use existing user friendly name if possible
Stewart, Sean [Fri, 28 Mar 2014 21:01:14 +0000 (21:01 +0000)]
libmultipath: Use existing user friendly name if possible

When a system is booted to the SAN, a condition can occur where one
user friendly name is given to a disk during boot, but multipathd tries
to allocate a different one after boot. If the second alias is already
used by another device, multipathd can't rename it. Multipathd then has
incorrect information about the alias/wwid relationships, which can
result in paths being added to the wrong map.

This patch works around this problem by first trying to use the alias
already bound to a device during boot.  If the bindings file has that
alias bound to a different device, it'll auto generate a new alias to
rename it to.

The alias prioritization is:
1. multipath.conf per-device alias
2. Currently bound alias
3. New auto-generated alias
4. wwid

Signed-off-by: Sean Stewart <>
Reviewed-by: Shiva Krishna Merla <>
7 years agomultipath: Fix some minor issues in path reordering code
Benjamin Marzinski [Wed, 21 May 2014 19:02:47 +0000 (14:02 -0500)]
multipath: Fix some minor issues in path reordering code

There were a couple of small issues with the path reordering code.

Since you may fail to get the adapter name at any time while looping
through the paths, you need to clean up when this fails, instead of
just exitting group_by_host_adapter().

I've looked at a couple kernels, and I don't see any sysfs file named:
It's always:

Also /sys/class/iscsi_host/host<n>/ipaddress could be an IPv6 address,
in which case we need 40 bytes to hold is, so SLOT_NAME_SIZE needs to
be 40 bytes large.

Signed-off-by: Benjamin Marzinski <>
7 years agoFix segfault when fast_io_fail_tmo is empty in config file.
Jose Castillo [Wed, 30 Apr 2014 08:20:13 +0000 (10:20 +0200)]
Fix segfault when fast_io_fail_tmo is empty in config file.

If the option "fast_io_fail_tmo" is specified in multipath.conf, without a value, the command 'multipathd reconfigure' segfaults.
With the patch included here, multipathd returns "error parsing config file" and does not segfaults.

Signed-off-by: Jose Castillo <>
7 years agoCrafted ordering of child paths for round robin path selector
ShivaKrishna Merla [Wed, 12 Mar 2014 20:13:13 +0000 (15:13 -0500)]
Crafted ordering of child paths for round robin path selector

The default Linux bus scanning order is depth first. Due to this default
ordering of paths in priority group is by host. With round robin path selector
this will lead to i/o clumping on each host controller and starvation on other
host controller for certain duration before routing i/o to alternate one.
Even with multiple LUNs sharing same host controllers, it will not yield flat
evenly distributed i/o pattern. This will impact performance when more than
eight active paths are available per LUN. This will be even more worse when
repeat count is more than one.

This patch addresses this issue by re-ordering paths in priority group by
alternate host ports and even PCI adapters. This re-ordering is only necessary
for round-robin path selector. We have observed better IOPS and Throughput with
this crafted ordering of paths.

Paths belonging to same host are grouped into host groups and hosts from same
adapter are grouped into adapter groups. Later paths are selected to yield
crafted order to help route i/o to alternate host ports and adapters available
within priority group of LUN

7 years agolink against libsystemd, not libsystemd-daemon
Hannes Reinecke [Thu, 13 Mar 2014 11:50:11 +0000 (12:50 +0100)]
link against libsystemd, not libsystemd-daemon

With systemd version 210 libsystemd-daemon has been merged
into libsystemd.

Signed-off-by: Hannes Reinecke <>
7 years agoUpdate FSF address
Hannes Reinecke [Thu, 13 Mar 2014 11:50:52 +0000 (12:50 +0100)]
Update FSF address

FSF moved to a different address, and our buildsystem complained.

Signed-off-by: Hannes Reinecke <>
7 years agoMark reloads with udev flag
Benjamin Marzinski [Wed, 12 Feb 2014 17:15:17 +0000 (11:15 -0600)]
Mark reloads with udev flag

In order for the udev rules to be able to distinguish uevents generated by
reloads instead of creates, multipath now tags all the reload resumes with
MPATH_UDEV_RELOAD_FLAG, which is defined as the first multipath
dm subsystem udev flag.  11-dm-mpath.rules watches for multipath events

Signed-off-by: Peter Rajnoha <>
Signed-off-by: Benjamin Marzinski <>
7 years agoNew udev rules to deal with stacked devices
Benjamin Marzinski [Wed, 12 Feb 2014 17:15:16 +0000 (11:15 -0600)]
New udev rules to deal with stacked devices

This new rules file sets some DM_* udev environment variables to keep
device mapper for doing unnecessary work on multipath device uevents.
Previously, devices with no valid paths were being scanned. Also devices
were being rescanned on uevents caused by paths being added or removed.
These are now avoided.

Signed-off-by: Peter Rajnoha <>
Signed-off-by: Benjamin Marzinski <>
7 years agoMinor spelling error fixes
Ritesh Raj Sarraf [Sun, 9 Mar 2014 11:56:34 +0000 (17:26 +0530)]
Minor spelling error fixes

Signed-off-by: Ritesh Raj Sarraf <>
7 years agoFix build failure with fomat-security. Specify the format type.
Ritesh Raj Sarraf [Sun, 9 Mar 2014 11:56:33 +0000 (17:26 +0530)]
Fix build failure with fomat-security. Specify the format type.

cc -g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat
-Werror=format-security -D_FORTIFY_SOURCE=2 -O2 -g -pipe -Wall
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector
--param=ssp-buffer-size=4 -Wunused -Wstrict-prototypes -fPIC
-DLIB_STRING=\"lib\" -I.. -c -o rdac.o rdac.c
rdac.c: In function 'libcheck_check':
rdac.c:311:3: error: format not a string literal and no format arguments
   MSG(c, (inqfail) ? MSG_RDAC_DOWN_TYPE("inquiry failed") :
rdac.c:311:3: error: format not a string literal and no format arguments
cc1: some warnings being treated as errors
make[2]: *** [rdac.o] Error 1

Signed-off-by: Ritesh Raj Sarraf <>
7 years agomultipathd: not skip paths not belonging to a mpp in check_path
Vaughan Cao [Sat, 22 Feb 2014 12:34:55 +0000 (20:34 +0800)]
multipathd: not skip paths not belonging to a mpp in check_path

commit bf4c80aee4e977e89d6925df569647acd3d5efef
multipathd: add path when transitioned from 'blocked' state
intends to check paths not belonging to a mpp usually because of
they are in 'blocked' state and we cannot get the path uuid.
So these paths ought not to be skipped at the start of the function.
It could be a fault when merge the original patch -

Signed-off-by: Vaughan Cao <>
7 years agodm-multipath: blacklist NVMe devices
Vaughan Cao [Thu, 27 Feb 2014 03:14:19 +0000 (11:14 +0800)]
dm-multipath: blacklist NVMe devices

Multipath works at the request level and NVMe bypasses the request layer. So
multipath is not going to be supported for NVMe devices. Add NVMe to default

Signed-off-by: Vaughan Cao <>
7 years agolibmultipath: Don't chop const strings
Benjamin Marzinski [Wed, 12 Feb 2014 16:21:50 +0000 (10:21 -0600)]
libmultipath: Don't chop const strings

multipath was chopping sysfs attr strings in order to make sure that
ending whitespace didn't cause them to overflow their buffer. However
those strings were const strings. This patch makes multipath check how
much of the string length is ending whitespace, so that it can tell if
it will really overflow the buffer without chopping the const string.

Signed-off-by: Benjamin Marzinski <>
7 years agoBump release version to 0.5.0 0.5.0
Christophe Varoqui [Tue, 17 Dec 2013 21:40:41 +0000 (22:40 +0100)]
Bump release version to 0.5.0

7 years agolibmultipath: Fix overflow in sysfs_get_str()
Hannes Reinecke [Tue, 17 Dec 2013 07:04:08 +0000 (08:04 +0100)]
libmultipath: Fix overflow in sysfs_get_str()

sysfs_get_str() should first do a strchop() before comparing the
returned string length with the provided buffer. Otherwise we might
incur a false positive as the overflowing bits might be occupied
by spaces, which will be removed later on.

Signed-off-by: Hannes Reinecke <>
7 years agolibmultipath: simplify basenamecpy()
Hannes Reinecke [Tue, 17 Dec 2013 07:04:07 +0000 (08:04 +0100)]
libmultipath: simplify basenamecpy()

strlcpy() already does a strlen() at the end, so no need
to call it explicitly.

Signed-off-by: Hannes Reinecke <>
7 years agolibmultipath: remove 'remove_trailing_chars'
Hannes Reinecke [Tue, 17 Dec 2013 07:04:06 +0000 (08:04 +0100)]
libmultipath: remove 'remove_trailing_chars'

Unused; superseded by strchop().

Signed-off-by: Hannes Reinecke <>
7 years agoMake 'multipath -t' able to run as normal user
Hannes Reinecke [Tue, 17 Dec 2013 07:04:05 +0000 (08:04 +0100)]
Make 'multipath -t' able to run as normal user

'multipath -t' should be run as normal user, as we might be
needing it to update the default configuration.

Signed-off-by: Hannes Reinecke <>
7 years agomultipathd: document return values for check_path()
Hannes Reinecke [Tue, 17 Dec 2013 07:04:04 +0000 (08:04 +0100)]
multipathd: document return values for check_path()

check_path() should return '1' if the path has been checked,
and '0' otherwise. So fixup missing return values and document
it properly.

Signed-off-by: Hannes Reinecke <>
7 years agoAdd missing includes to support tzget() usage
Christophe Varoqui [Fri, 13 Dec 2013 22:20:40 +0000 (23:20 +0100)]
Add missing includes to support tzget() usage

7 years ago[libmultipath] Fix a compilation warning
Christophe Varoqui [Fri, 13 Dec 2013 22:10:27 +0000 (23:10 +0100)]
[libmultipath] Fix a compilation warning

Now that we chop the sysfs attribute strings, the size returned
by strlcpy is not used anymore. Remove the variable to tame
the compiler warning.

7 years agomultipathd: add path when transitioned from 'blocked' state
Hannes Reinecke [Fri, 13 Dec 2013 12:14:13 +0000 (13:14 +0100)]
multipathd: add path when transitioned from 'blocked' state

When a path is discovered in 'blocked' state it won't be added
to the path list as we cannot get the path uuid.
And any further check will fail here as the uuid won't be
recovered. So add a check in checkerloop() to re-add the
path if it gets out of a 'blocked' state.

Signed-off-by: Hannes Reinecke <>
7 years agomultipathd: Correctly initialize udev context
Hannes Reinecke [Fri, 13 Dec 2013 12:12:45 +0000 (13:12 +0100)]
multipathd: Correctly initialize udev context

The udev context is passed as argument to ueventloop(), so
we should be using that instead of the global variable.

Signed-off-by: Hannes Reinecke <>