@@ -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,
@@ -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),
};
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 <mwilck@suse.com> --- libmultipath/devmapper.c | 30 ++++++++++++++++-------------- libmultipath/devmapper.h | 8 +++++++- 2 files changed, 23 insertions(+), 15 deletions(-)