Blame SOURCES/lvm2-2_03_09-writecache-working-real-dm-uuid-suffix-for-wcorig-lv.patch

f41bc7
 lib/activate/dev_manager.c      |  4 ++++
f41bc7
 lib/metadata/lv.c               |  2 +-
f41bc7
 lib/metadata/writecache_manip.c | 16 ++++++++--------
f41bc7
 lib/misc/lvm-string.c           |  1 +
f41bc7
 lib/writecache/writecache.c     |  2 +-
f41bc7
 tools/lvconvert.c               |  2 ++
f41bc7
 6 files changed, 17 insertions(+), 10 deletions(-)
f41bc7
f41bc7
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
f41bc7
index c8a22fb..3b99131 100644
f41bc7
--- a/lib/activate/dev_manager.c
f41bc7
+++ b/lib/activate/dev_manager.c
f41bc7
@@ -3316,6 +3316,10 @@ static int _add_new_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
f41bc7
 	if (!layer && lv_is_new_thin_pool(lv))
f41bc7
 		layer = lv_layer(lv);
f41bc7
 
f41bc7
+	/* Adds -real to the dm uuid of wcorig LV. */
f41bc7
+	if (!layer && lv_is_writecache_origin(lv))
f41bc7
+		layer = lv_layer(lv); /* "real" */
f41bc7
+
f41bc7
 	if (!(dlid = build_dm_uuid(dm->mem, lv, layer)))
f41bc7
 		return_0;
f41bc7
 
f41bc7
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
f41bc7
index ab26b8d..17d4907 100644
f41bc7
--- a/lib/metadata/lv.c
f41bc7
+++ b/lib/metadata/lv.c
f41bc7
@@ -830,7 +830,7 @@ const char *lv_layer(const struct logical_volume *lv)
f41bc7
 	if (lv_is_vdo_pool(lv))
f41bc7
 		return "vpool";
f41bc7
 
f41bc7
-	if (lv_is_origin(lv) || lv_is_external_origin(lv))
f41bc7
+	if (lv_is_origin(lv) || lv_is_external_origin(lv) || lv_is_writecache_origin(lv))
f41bc7
 		return "real";
f41bc7
 
f41bc7
 	return NULL;
f41bc7
diff --git a/lib/metadata/writecache_manip.c b/lib/metadata/writecache_manip.c
f41bc7
index 0122025..31d069e 100644
f41bc7
--- a/lib/metadata/writecache_manip.c
f41bc7
+++ b/lib/metadata/writecache_manip.c
f41bc7
@@ -24,15 +24,15 @@
f41bc7
 
f41bc7
 int lv_is_writecache_origin(const struct logical_volume *lv)
f41bc7
 {
f41bc7
-	struct seg_list *sl;
f41bc7
+	struct lv_segment *seg;
f41bc7
 
f41bc7
-	dm_list_iterate_items(sl, &lv->segs_using_this_lv) {
f41bc7
-		if (!sl->seg || !sl->seg->lv || !sl->seg->origin)
f41bc7
-			continue;
f41bc7
-		if (lv_is_writecache(sl->seg->lv) && (sl->seg->origin == lv))
f41bc7
-			return 1;
f41bc7
-	}
f41bc7
-	return 0;
f41bc7
+	/* Make sure there's exactly one segment in segs_using_this_lv! */
f41bc7
+	if (dm_list_empty(&lv->segs_using_this_lv) ||
f41bc7
+	    (dm_list_size(&lv->segs_using_this_lv) > 1))
f41bc7
+		return 0;
f41bc7
+
f41bc7
+	seg = get_only_segment_using_this_lv(lv);
f41bc7
+	return seg && lv_is_writecache(seg->lv) && !lv_is_pending_delete(seg->lv) && (seg_lv(seg, 0) == lv);
f41bc7
 }
f41bc7
 
f41bc7
 int lv_is_writecache_cachevol(const struct logical_volume *lv)
f41bc7
diff --git a/lib/misc/lvm-string.c b/lib/misc/lvm-string.c
f41bc7
index d8b27cb..0ee3403 100644
f41bc7
--- a/lib/misc/lvm-string.c
f41bc7
+++ b/lib/misc/lvm-string.c
f41bc7
@@ -251,6 +251,7 @@ char *build_dm_uuid(struct dm_pool *mem, const struct logical_volume *lv,
f41bc7
 		 */
f41bc7
 		/* Suffixes used here MUST match lib/activate/dev_manager.c */
f41bc7
 		layer = lv_is_cache_origin(lv) ? "real" :
f41bc7
+			lv_is_writecache_origin(lv) ? "real" :
f41bc7
 			(lv_is_cache(lv) && lv_is_pending_delete(lv)) ? "real" :
f41bc7
 			lv_is_cache_pool_data(lv) ? "cdata" :
f41bc7
 			lv_is_cache_pool_metadata(lv) ? "cmeta" :
f41bc7
diff --git a/lib/writecache/writecache.c b/lib/writecache/writecache.c
f41bc7
index 08a306e..130922a 100644
f41bc7
--- a/lib/writecache/writecache.c
f41bc7
+++ b/lib/writecache/writecache.c
f41bc7
@@ -260,7 +260,7 @@ static int _writecache_add_target_line(struct dev_manager *dm,
f41bc7
 	if ((pmem = lv_on_pmem(seg->writecache)) < 0)
f41bc7
 		return_0;
f41bc7
 
f41bc7
-	if (!(origin_uuid = build_dm_uuid(mem, seg_lv(seg, 0), NULL)))
f41bc7
+	if (!(origin_uuid = build_dm_uuid(mem, seg_lv(seg, 0), "real")))
f41bc7
 		return_0;
f41bc7
 
f41bc7
 	if (!(fast_uuid = build_dm_uuid(mem, seg->writecache, "cvol")))
f41bc7
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
f41bc7
index 757b323..0ddeb35 100644
f41bc7
--- a/tools/lvconvert.c
f41bc7
+++ b/tools/lvconvert.c
f41bc7
@@ -5537,6 +5537,8 @@ static struct logical_volume *_lv_writecache_create(struct cmd_context *cmd,
f41bc7
 	if (!(segtype = get_segtype_from_string(cmd, SEG_TYPE_NAME_WRITECACHE)))
f41bc7
 		return_NULL;
f41bc7
 
f41bc7
+	lv->status |= WRITECACHE;
f41bc7
+
f41bc7
 	/*
f41bc7
 	 * "lv_wcorig" is a new LV with new id, but with the segments from "lv".
f41bc7
 	 * "lv" keeps the existing name and id, but gets a new writecache segment,