The semantics of MAPINFO_CHECK_UUID, MAPINFO_MPATH_ONLY and MAPINFO_PART_ONLY
are confusing. Fix that by supporting UUID check for partitions, too.

Signed-off-by: Martin Wilck <mwi...@suse.com>
---
 libmultipath/devmapper.c | 30 ++++++++++++++++--------------
 libmultipath/devmapper.h |  8 +++++++-
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
index d193586..03dae16 100644
--- a/libmultipath/devmapper.c
+++ b/libmultipath/devmapper.c
@@ -616,6 +616,18 @@ static bool is_mpath_uuid(const char uuid[DM_UUID_LEN])
        return !strncmp(uuid, UUID_PREFIX, UUID_PREFIX_LEN);
 }
 
+static bool is_mpath_part_uuid(const char part_uuid[DM_UUID_LEN],
+                              const char map_uuid[DM_UUID_LEN])
+{
+       char c;
+       int np, nc;
+
+       if (2 != sscanf(part_uuid, "part%d-%n" UUID_PREFIX "%c", &np, &nc, &c)
+           || np <= 0)
+               return false;
+       return map_uuid == NULL || !strcmp(part_uuid + nc, map_uuid);
+}
+
 bool
 has_dm_info(const struct multipath *mpp)
 {
@@ -720,8 +732,10 @@ static int libmp_mapinfo__(int flags, mapid_t id, 
mapinfo_t info, const char *ma
                && !(uuid = dm_task_get_uuid(dmt))))
                return DMP_ERR;
 
-       if (flags & MAPINFO_CHECK_UUID && !is_mpath_uuid(uuid)) {
-               condlog(3, "%s: UUID mismatch: %s", fname__, uuid);
+       if (flags & MAPINFO_CHECK_UUID &&
+           ((flags & MAPINFO_PART_ONLY && !is_mpath_part_uuid(uuid, NULL)) ||
+            !is_mpath_uuid(uuid))) {
+               condlog(4, "%s: UUID mismatch: %s", fname__, uuid);
                return DMP_NO_MATCH;
        }
 
@@ -846,18 +860,6 @@ int dm_get_wwid(const char *name, char *uuid, int uuid_len)
        return DMP_OK;
 }
 
-static bool is_mpath_part_uuid(const char part_uuid[DM_UUID_LEN],
-                              const char map_uuid[DM_UUID_LEN])
-{
-       char c;
-       int np, nc;
-
-       if (2 != sscanf(part_uuid, "part%d-%n" UUID_PREFIX "%c", &np, &nc, &c)
-           || np <= 0)
-               return false;
-       return !strcmp(part_uuid + nc, map_uuid);
-}
-
 int dm_is_mpath(const char *name)
 {
        int rc = libmp_mapinfo(DM_MAP_BY_NAME | MAPINFO_MPATH_ONLY | 
MAPINFO_CHECK_UUID,
diff --git a/libmultipath/devmapper.h b/libmultipath/devmapper.h
index ba05e0a..6b3bbad 100644
--- a/libmultipath/devmapper.h
+++ b/libmultipath/devmapper.h
@@ -58,7 +58,13 @@ enum {
        /* Fail if target type is not "partition" (linear) */
        MAPINFO_PART_ONLY   = (1 << 9),
        MAPINFO_TGT_TYPE__  = (MAPINFO_MPATH_ONLY | MAPINFO_PART_ONLY),
-       /* Fail if the UUID doesn't match the multipath UUID format */
+       /*
+        * Fail if the UUID doesn't match the expected UUID format
+        * If combined with MAPINFO_PART_ONLY, checks for partition UUID format
+        * ("part<N>-mpath-xyz").
+        * Otherwise (whether or not MAPINFO_MPATH_ONLY is set) checks for
+        * multipath UUID format ("mpath-xyz").
+        */
        MAPINFO_CHECK_UUID  = (1 << 10),
 };
 
-- 
2.47.0


Reply via email to