diff mbox series

[6/8] libmultipath: signal multipath UUID device with no table

Message ID 20241031183301.391416-7-bmarzins@redhat.com (mailing list archive)
State New
Headers show
Series multipath fixes to tableless device handling | expand

Commit Message

Benjamin Marzinski Oct. 31, 2024, 6:32 p.m. UTC
if libmp_mapinfo() is run on a device that has a multipath prefixed DM
UUID but no table (either active or inactive), it will now return with a
new exit code, DMP_BAD_DEV, to signal that this is an invalid multipath
device. Currently all code paths treat this identically to
DMP_NOT_FOUND.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---
 libmultipath/devmapper.c | 18 ++++++++++++++++++
 libmultipath/devmapper.h |  5 ++++-
 2 files changed, 22 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
index 13d8c1e5..6e11d5b5 100644
--- a/libmultipath/devmapper.c
+++ b/libmultipath/devmapper.c
@@ -726,6 +726,22 @@  static int libmp_mapinfo__(int flags, mapid_t id, mapinfo_t info, const char *ma
 	}
 
 	if (info.target || info.status || info.size || flags & MAPINFO_TGT_TYPE__) {
+		if (!dmi.live_table) {
+			/*
+			 * If this is device has a multipath uuid but no
+			 * table, flag it, so multipath can clean it up
+			 */
+			if (flags & MAPINFO_CHECK_UUID &&
+			    !dmi.inactive_table) {
+				condlog(2, "%s: multipath map %s has no table",
+					fname__, map_id);
+				return DMP_BAD_DEV;
+			} else {
+				condlog(2, "%s: map %s has no table", fname__,
+					map_id);
+				return DMP_NOT_FOUND;
+			}
+		}
 		if (dm_get_next_target(dmt, NULL, &start, &length,
 				       &target_type, &params) != NULL) {
 			condlog(2, "%s: map %s has multiple targets", fname__, map_id);
@@ -869,6 +885,7 @@  int dm_is_mpath(const char *name)
 		return DM_IS_MPATH_YES;
 	case DMP_NOT_FOUND:
 	case DMP_NO_MATCH:
+	case DMP_BAD_DEV:
 		return DM_IS_MPATH_NO;
 	case DMP_ERR:
 	default:
@@ -1262,6 +1279,7 @@  int dm_get_maps(vector mp)
 			}
 			vector_set_slot(mp, mpp);
 			break;
+		case DMP_BAD_DEV:
 		case DMP_NO_MATCH:
 		case DMP_NOT_FOUND:
 			break;
diff --git a/libmultipath/devmapper.h b/libmultipath/devmapper.h
index ba05e0a1..a2dcfb84 100644
--- a/libmultipath/devmapper.h
+++ b/libmultipath/devmapper.h
@@ -35,6 +35,7 @@  enum {
 	DMP_OK,
 	DMP_NOT_FOUND,
 	DMP_NO_MATCH,
+	DMP_BAD_DEV,
 	DMP_LAST__,
 };
 
@@ -99,7 +100,9 @@  typedef struct libmp_map_info {
  * @returns:
  *     DMP_OK if successful.
  *     DMP_NOT_FOUND if the map wasn't found, or has no or multiple targets.
- *     DMP_NO_MATCH if the map didn't match @tgt_type (see above).
+ *     DMP_NO_MATCH if the map didn't match @tgt_type (see above) or didn't
+ *                  have a multipath uuid prefix.
+ *     DMP_BAD_DEV if the map has a multipath uuid prefix but no table.
  *     DMP_ERR if some other error occurred.
  *
  * This function obtains the requested information for the device-mapper map