[lvm-devel] master - cache: never activate cache pool

Zdenek Kabelac zkabelac at fedoraproject.org
Tue Apr 1 18:55:56 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=a018c57f0bd36f1b56c67a2afe5254e6da8251b7
Commit:        a018c57f0bd36f1b56c67a2afe5254e6da8251b7
Parent:        504c328e3d2c0a8b6b946fe7d323e1f28887e285
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Tue Apr 1 17:53:18 2014 +0200
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Tue Apr 1 20:17:10 2014 +0200

cache: never activate cache pool

Since cache-pool is purely lvm abstraction layer LV, it never
need any device node, so do not add even 'error' device for it.
---
 lib/activate/dev_manager.c |   26 +++++++++++++++++++++-----
 lib/metadata/lv_manip.c    |    8 +++++++-
 tools/lvchange.c           |    5 +++++
 tools/vgchange.c           |    4 ++++
 4 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 490218c..cde39af 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -1828,6 +1828,16 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
 	struct dm_tree_node *thin_node;
 	const char *uuid;
 
+	if (lv_is_cache_pool(lv)) {
+		/* origin_only is ignored */
+		/* cache pool is 'meta' LV and does not have a real device node */
+		if (!_add_lv_to_dtree(dm, dtree, seg_lv(first_seg(lv), 0), 0))
+			return_0;
+		if (!_add_lv_to_dtree(dm, dtree, first_seg(lv)->metadata_lv, 0))
+			return_0;
+		return 1;
+	}
+
 	if (!origin_only && !_add_dev_to_dtree(dm, dtree, lv, NULL))
 		return_0;
 
@@ -1917,14 +1927,11 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
 		if (seg->metadata_lv &&
 		    !_add_lv_to_dtree(dm, dtree, seg->metadata_lv, 0))
 			return_0;
-		if (seg->pool_lv && !dm->skip_external_lv &&
+		if (seg->pool_lv &&
+		    (lv_is_cache_pool(seg->pool_lv) || !dm->skip_external_lv) &&
 		    !_add_lv_to_dtree(dm, dtree, seg->pool_lv, 1)) /* stack */
 			return_0;
 
-		if (seg->pool_lv && lv_is_cache_pool(seg->pool_lv) &&
-		    !_add_lv_to_dtree(dm, dtree, seg->pool_lv, 0))
-			return_0;
-
 		for (s = 0; s < seg->area_count; s++) {
 			if (seg_type(seg, s) == AREA_LV && seg_lv(seg, s) &&
 			    !_add_lv_to_dtree(dm, dtree, seg_lv(seg, s), 0))
@@ -2495,6 +2502,15 @@ static int _add_new_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
 	uint32_t read_ahead = lv->read_ahead;
 	uint32_t read_ahead_flags = UINT32_C(0);
 
+	if (lv_is_cache_pool(lv)) {
+		/* cache pool is 'meta' LV and does not have a real device node */
+		if (!_add_new_lv_to_dtree(dm, dtree, seg_lv(first_seg(lv), 0), laopts, NULL))
+			return_0;
+		if (!_add_new_lv_to_dtree(dm, dtree, first_seg(lv)->metadata_lv, laopts, NULL))
+			return_0;
+		return 1;
+	}
+
 	/* FIXME Seek a simpler way to lay out the snapshot-merge tree. */
 
 	if (!layer && lv_is_merging_origin(lv)) {
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index bb812e2..17933a2 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -4714,7 +4714,8 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
 	/* FIXME Ensure not referred to by another existing LVs */
 	ask_discard = find_config_tree_bool(cmd, devices_issue_discards_CFG, NULL);
 
-	if (lv_info(cmd, lv, 0, &info, 1, 0)) {
+	if (!lv_is_cache_pool(lv) &&
+	    lv_info(cmd, lv, 0, &info, 1, 0)) {
 		if (!lv_check_not_in_use(cmd, lv, &info))
 			return_0;
 
@@ -6293,6 +6294,11 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
 		goto out;
 	}
 
+	if (lv_is_cache_pool(lv)) {
+		log_verbose("Cache pool is prepared.");
+		goto out;
+	}
+
 	/* Do not scan this LV until properly zeroed/wiped. */
 	if (_should_wipe_lv(lp, lv))
 		lv->status |= LV_NOSCAN;
diff --git a/tools/lvchange.c b/tools/lvchange.c
index 8ceacc5..982e620 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -950,6 +950,11 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
 		return EINVALID_CMD_LINE;
 	}
 
+	if (lv_is_cache_pool(lv)) {
+		log_error("Can't change cache pool logical volume.");
+		return ECMD_FAILED;
+	}
+
 	if (lv_is_origin(lv) && !lv_is_thin_volume(lv) &&
 	    (arg_count(cmd, contiguous_ARG) || arg_count(cmd, permission_ARG) ||
 	     arg_count(cmd, readahead_ARG) || arg_count(cmd, persistent_ARG) ||
diff --git a/tools/vgchange.c b/tools/vgchange.c
index e7b5e59..2856b28 100644
--- a/tools/vgchange.c
+++ b/tools/vgchange.c
@@ -98,6 +98,10 @@ static int _activate_lvs_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 		if (!lv_is_visible(lv))
 			continue;
 
+		/* Cache pool cannot be activated */
+		if (lv_is_cache_pool(lv))
+			continue;
+
 		/* If LV is sparse, activate origin instead */
 		if (lv_is_cow(lv) && lv_is_virtual_origin(origin_from_cow(lv)))
 			lv = origin_from_cow(lv);




More information about the lvm-devel mailing list