diff options
-rw-r--r-- | lib/cache/lvmcache.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c index 85fbf4789..eb7f53a6d 100644 --- a/lib/cache/lvmcache.c +++ b/lib/cache/lvmcache.c @@ -822,10 +822,12 @@ static void _choose_preferred_devs(struct cmd_context *cmd, struct lvmcache_info *info; struct device *dev1, *dev2; uint32_t dev1_major, dev1_minor, dev2_major, dev2_minor; + uint64_t info_size, dev1_size, dev2_size; int in_subsys1, in_subsys2; int is_dm1, is_dm2; int has_fs1, has_fs2; int has_lv1, has_lv2; + int same_size1, same_size2; int change; /* @@ -881,6 +883,11 @@ next: dev2_major = MAJOR(dev2->dev); dev2_minor = MINOR(dev2->dev); + if (!dev_get_size(dev1, &dev1_size)) + dev1_size = 0; + if (!dev_get_size(dev2, &dev2_size)) + dev2_size = 0; + has_lv1 = (dev1->flags & DEV_USED_FOR_LV) ? 1 : 0; has_lv2 = (dev2->flags & DEV_USED_FOR_LV) ? 1 : 0; @@ -893,13 +900,25 @@ next: has_fs1 = dm_device_has_mounted_fs(dev1_major, dev1_minor); has_fs2 = dm_device_has_mounted_fs(dev2_major, dev2_minor); + info_size = info->device_size >> SECTOR_SHIFT; + same_size1 = (dev1_size == info_size); + same_size2 = (dev2_size == info_size); + log_debug_cache("PV %s compare duplicates %s and %s", devl->dev->pvid, dev_name(dev1), dev_name(dev2)); - log_debug_cache("dup dev1 %s subsys %d dm %d fs %d lv %d", - dev_name(dev1), in_subsys1, is_dm1, has_fs1, has_lv1); - log_debug_cache("dup dev2 %s subsys %d dm %d fs %d lv %d", - dev_name(dev2), in_subsys2, is_dm2, has_fs2, has_lv2); + log_debug_cache("PV %s info size %llu dev1 %s size %llu dev2 %s size %llu", + devl->dev->pvid, + (unsigned long long)info_size, + dev_name(dev1), + (unsigned long long)dev1_size, + dev_name(dev2), + (unsigned long long)dev2_size); + + log_debug_cache("dup dev1 %s subsys %d dm %d fs %d lv %d size %d", + dev_name(dev1), in_subsys1, is_dm1, has_fs1, has_lv1, same_size1); + log_debug_cache("dup dev2 %s subsys %d dm %d fs %d lv %d size %d", + dev_name(dev2), in_subsys2, is_dm2, has_fs2, has_lv2, same_size2); change = 0; @@ -908,6 +927,11 @@ next: } else if (has_lv2 && !has_lv1) { /* change to 2 */ change = 1; + } else if (same_size1 && !same_size2) { + /* keep 1 */ + } else if (same_size2 && !same_size1) { + /* change to 2 */ + change = 1; } else if (has_fs1 && !has_fs2) { /* keep 1 */ } else if (has_fs2 && !has_fs1) { |