Linux Device Mapper development
 help / color / mirror / Atom feed
* [PATCH 0/1] multipath: fix "multipath -f <path>" regression since 0.9.8
@ 2026-09-28 16:54 Brian Bunker
  2026-09-28 16:54 ` [PATCH 1/1] multipath: resolve map paths before delegating -f to multipathd Brian Bunker
  0 siblings, 1 reply; 3+ messages in thread
From: Brian Bunker @ 2026-09-28 16:54 UTC (permalink / raw)
  To: dm-devel; +Cc: Brian Bunker, Benjamin Marzinski, Martin Wilck

Since 0.9.8, "multipath -f" fails with "device not found" when it is
given a path to a map, such as /dev/mapper/<alias> or
/dev/disk/by-id/dm-uuid-mpath-<WWID>, while multipathd is running.
This patch fixes it in the multipath command. Some background that
doesn't belong in the commit message:

How it was found
----------------
OpenStack os-brick's Fibre Channel connector detaches a volume with
"multipath -f /dev/disk/by-id/dm-uuid-mpath-<WWID>". Every FC detach
fails on distributions with multipath-tools 0.9.8 or later, including
RHEL/Rocky 10 (0.9.9), Debian 13 and Ubuntu 26.04 (0.14.3), the tested
platform for the next OpenStack release. It is tracked as
https://bugs.launchpad.net/os-brick/+bug/2167932. os-brick is adding
a workaround, but fixing "multipath -f" also covers existing os-brick
releases and other tools that remove maps by path.

Why in the client
-----------------
Commit a4dbdcec made cli_del_map() look up maps with find_mp_by_str(),
like the other client handlers, so I didn't want to bring device-mapper
lookups back into multipathd. get_dev_type() has already stat()ed the
argument, so the client can resolve it to the map name before it
delegates. This leaves "multipathd del map <path>" unsupported. If
you'd rather have multipathd accept paths, I can rework the patch that
way.

Testing
-------
Rocky Linux 10.2, device-mapper-multipath 0.9.9-18.el10 with this
patch on top (it applies cleanly after the RHEL patches), a PURE
FlashArray LUN over iSCSI, multipathd running:

- "multipath -f /dev/disk/by-id/dm-uuid-mpath-<WWID>" and
  "multipath -f /dev/mapper/<WWID>" fail with "device not found"
  without the patch and remove the map with it.
- "multipath -f <WWID>" works as before; the argument isn't changed.

multipathd's log, before and after, for the by-id path:

  disk/by-id/dm-uuid-mpath-44BE9D5DF0A14AFE000113E9: remove map (operator)
  disk/by-id/dm-uuid-mpath-44BE9D5DF0A14AFE000113E9: invalid map name.
  44BE9D5DF0A14AFE000113E9: remove map (operator)

On master, the patch builds without warnings and "make test" passes.

The regression is in every release since 0.9.8, so this may be worth
picking up for the stable branches.

Brian Bunker (1):
  multipath: resolve map paths before delegating -f to multipathd

 multipath/main.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

-- 
2.55.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/1] multipath: resolve map paths before delegating -f to multipathd
  2026-09-28 16:54 [PATCH 0/1] multipath: fix "multipath -f <path>" regression since 0.9.8 Brian Bunker
@ 2026-09-28 16:54 ` Brian Bunker
  2026-09-28 18:50   ` Benjamin Marzinski
  0 siblings, 1 reply; 3+ messages in thread
From: Brian Bunker @ 2026-09-28 16:54 UTC (permalink / raw)
  To: dm-devel; +Cc: Brian Bunker, Benjamin Marzinski, Martin Wilck, Simon Dodsley

Since 0.9.8, "multipath -f" fails with "device not found" when it is
given a path to a map, such as /dev/mapper/<alias> or
/dev/disk/by-id/dm-uuid-mpath-<WWID>, and multipathd is running.

get_dev_type() accepts such a path as DEV_DEVMAP, because it stat()s
to a device-mapper block device, and delegate_to_multipathd() sends
it unchanged as "del map <path>". cli_del_map() only strips a leading
"/dev/", and find_mp_by_str() only matches an alias, a WWID or a dm-N
name, so the map is not found. Before commit a4dbdcec, cli_del_map()
looked the argument up with dm_get_major_minor(), which accepted any
path to the device. And before commit 8c0c12ef, a failed delegation
fell back to a local flush, which also resolves paths.

This breaks callers that remove maps by path. OpenStack os-brick's
Fibre Channel connector flushes /dev/disk/by-id/dm-uuid-mpath-<WWID>
on every volume detach, so detach works on RHEL 9 (0.8.7 based) and
fails on RHEL 10 (0.9.9 based).

If the -f argument is a path, resolve it to the map name with
dm_mapname() before delegating. The local flush, used when multipathd
is not running, gets the same name. Arguments that are valid map
names are passed through unchanged.

Fixes: a4dbdcec ("multipathd: simplify cli_del_map()")
Reported-by: Simon Dodsley <simon@purestorage.com>
Signed-off-by: Brian Bunker <brian@purestorage.com>
---
 multipath/main.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/multipath/main.c b/multipath/main.c
index f20d701c..5068a659 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -729,6 +729,30 @@ get_dev_type(char *dev) {
 	return DEV_NONE;
 }
 
+/*
+ * multipathd resolves "del map $map" arguments by alias, WWID or dm-N
+ * name, not by device path. If a map was passed as a path, e.g.
+ * /dev/mapper/$alias or /dev/disk/by-id/dm-uuid-mpath-$WWID, replace it
+ * with the map name.
+ */
+static void
+resolve_devmap_path(char *dev)
+{
+	struct stat buf;
+	char __attribute__((cleanup(cleanup_charp))) *name = NULL;
+
+	if (valid_alias(dev) || stat(dev, &buf) != 0 ||
+	    !S_ISBLK(buf.st_mode))
+		return;
+
+	name = dm_mapname(major(buf.st_rdev), minor(buf.st_rdev));
+	if (!name)
+		return;
+
+	condlog(3, "%s: using map name %s", dev, name);
+	strlcpy(dev, name, FILE_NAME_SIZE);
+}
+
 /*
  * Some multipath commands are dangerous to run while multipathd is running.
  * For example, "multipath -r" may apply a modified configuration to the kernel,
@@ -1027,6 +1051,8 @@ main (int argc, char *argv[])
 		condlog(0, "the -f option requires a map name to remove");
 		goto out;
 	}
+	if (cmd == CMD_FLUSH_ONE)
+		resolve_devmap_path(dev);
 
 	while (1) {
 		int ret = delegate_to_multipathd(cmd, dev, dev_type, conf);
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/1] multipath: resolve map paths before delegating -f to multipathd
  2026-09-28 16:54 ` [PATCH 1/1] multipath: resolve map paths before delegating -f to multipathd Brian Bunker
@ 2026-09-28 18:50   ` Benjamin Marzinski
  0 siblings, 0 replies; 3+ messages in thread
From: Benjamin Marzinski @ 2026-09-28 18:50 UTC (permalink / raw)
  To: Brian Bunker; +Cc: dm-devel, Martin Wilck, Simon Dodsley

On Mon, Sep 28, 2026 at 09:54:43AM -0700, Brian Bunker wrote:
> --- a/multipath/main.c
> +++ b/multipath/main.c
> @@ -729,6 +729,30 @@ get_dev_type(char *dev) {
>  	return DEV_NONE;
>  }
>  
> +/*
> + * multipathd resolves "del map $map" arguments by alias, WWID or dm-N
> + * name, not by device path. If a map was passed as a path, e.g.
> + * /dev/mapper/$alias or /dev/disk/by-id/dm-uuid-mpath-$WWID, replace it
> + * with the map name.
> + */
> +static void
> +resolve_devmap_path(char *dev)
> +{
> +	struct stat buf;
> +	char __attribute__((cleanup(cleanup_charp))) *name = NULL;
> +
> +	if (valid_alias(dev) || stat(dev, &buf) != 0 ||
> +	    !S_ISBLK(buf.st_mode))
> +		return;
> +
> +	name = dm_mapname(major(buf.st_rdev), minor(buf.st_rdev));
> +	if (!name)
> +		return;
> +
> +	condlog(3, "%s: using map name %s", dev, name);
> +	strlcpy(dev, name, FILE_NAME_SIZE);
> +}
> +
>  /*
>   * Some multipath commands are dangerous to run while multipathd is running.
>   * For example, "multipath -r" may apply a modified configuration to the kernel,
> @@ -1027,6 +1051,8 @@ main (int argc, char *argv[])
>  		condlog(0, "the -f option requires a map name to remove");
>  		goto out;
>  	}

Thanks for the fix. This looks good, although I wonder if we should
always update dev for a DEV_DEVMAP type device that we can stat(),
likely in get_dev_type(). That would keep us from needing to deal with
this again if we delegate anything else to multipathd. Thoughts, Martin?
Otherwise, I'm fine with this as is.

-Ben 

> +	if (cmd == CMD_FLUSH_ONE)
> +		resolve_devmap_path(dev);
>  
>  	while (1) {
>  		int ret = delegate_to_multipathd(cmd, dev, dev_type, conf);
> -- 
> 2.55.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-09-28 18:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-28 16:54 [PATCH 0/1] multipath: fix "multipath -f <path>" regression since 0.9.8 Brian Bunker
2026-09-28 16:54 ` [PATCH 1/1] multipath: resolve map paths before delegating -f to multipathd Brian Bunker
2026-09-28 18:50   ` Benjamin Marzinski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox