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@xxxxxxxx> --- 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