summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2016-04-29 14:10:29 -0500
committerDavid Teigland <teigland@redhat.com>2016-05-02 16:35:42 -0500
commit1054f1c53ac60dd4d0f34190880d48ddce80f36f (patch)
tree353cb14a37b61494174e7fb4088761d959c596d1
parente05778845cd1a14cb4a6534faa85e23cf2703839 (diff)
downloadlvm2-dev-dct-lvmetad-disabled-14.tar.gz
devices: use device size in duplicate preferencedev-dct-lvmetad-disabled-14
If duplicate devices exist for a PV, and one device's size matches the PV size, but the other doesn't, then prefer the matching device.
-rw-r--r--lib/cache/lvmcache.c32
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) {