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

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

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

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

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

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

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

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

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

Signed-off-by:Tejaswini Poluri <>

4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 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 <>
4 years agoRevert 'return PATH_DOWN for quiesced paths'
Hannes Reinecke [Wed, 23 Jul 2014 08:51:35 +0000 (10:51 +0200)]
Revert 'return PATH_DOWN for quiesced paths'

Has been superseded by commit 00a2549a42707e5e1ef51ef6f638dc5ceaa15740

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

References: bnc#873151

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

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

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

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

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

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

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

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

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

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