@@ -572,7 +572,7 @@ out:
* returns:
* 1 : match
* 0 : no match
- * -1 : empty map
+ * -1 : empty map, or more than 1 target
*/
int dm_type(const char *name, char *type)
{
@@ -594,10 +594,11 @@ int dm_type(const char *name, char *type)
goto out;
/* Fetch 1st target */
- dm_get_next_target(dmt, NULL, &start, &length,
- &target_type, ¶ms);
-
- if (!target_type)
+ if (dm_get_next_target(dmt, NULL, &start, &length,
+ &target_type, ¶ms) != NULL)
+ /* multiple targets */
+ r = -1;
+ else if (!target_type)
r = -1;
else if (!strcmp(target_type, type))
r = 1;
@@ -1185,9 +1186,9 @@ do_foreach_partmaps (const char * mapname,
do {
if (
/*
- * if devmap target is "linear"
+ * if there is only a single "linear" target
*/
- (dm_type(names->name, TGT_PART) > 0) &&
+ (dm_type(names->name, TGT_PART) == 1) &&
/*
* and both uuid end with same suffix starting
dm_type is used in libmultipath only to check whether a mapping is "linear", with the intention to test if it represents a "partition". This test returns TRUE also for mappings with multiple targets, the first of which happens to be a linear mapping into the target device. This is questionable, it's hard to assign a "type" to such maps anyway. Fix this by returning an error for multi-target maps. This is analogous to the patch "kpartx: don't treat multi-linear mappings as partitions". Signed-off-by: Martin Wilck <mwilck@suse.com> --- libmultipath/devmapper.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)