[lvm-devel] master - raid: check target version for shrink support

Heinz Mauelshagen heinzm at sourceware.org
Fri Mar 17 15:47:31 UTC 2017


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=fec2ea76cf30f6333ff4dc6afb8a40b84d7abf7b
Commit:        fec2ea76cf30f6333ff4dc6afb8a40b84d7abf7b
Parent:        17a8f3d6f0fa26ab01d974af409d1d075d5815a0
Author:        Heinz Mauelshagen <heinzm at redhat.com>
AuthorDate:    Fri Mar 17 16:46:33 2017 +0100
Committer:     Heinz Mauelshagen <heinzm at redhat.com>
CommitterDate: Fri Mar 17 16:46:33 2017 +0100

raid: check target version for shrink support

Starting with dm-raid target version 1.9.0 shrinking of mapped devices is supported.
Check for support being present in lvresize and lvreduce.

Related: rhbz1394048
---
 lib/metadata/lv_manip.c |   13 +++++++++++++
 lib/metadata/segtype.h  |    3 ++-
 lib/raid/raid.c         |    1 +
 3 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index a249d29..0dfbad4 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -4773,6 +4773,19 @@ static int _lvresize_check(struct logical_volume *lv,
 		return 0;
 	}
 
+	if (lv_is_raid(lv) &&
+	    lp->resize == LV_REDUCE) {
+		unsigned attrs;
+		const struct segment_type *segtype = first_seg(lv)->segtype;
+
+		if (!segtype->ops->target_present ||
+		    !segtype->ops->target_present(lv->vg->cmd, NULL, &attrs) ||
+		    !(attrs & RAID_FEATURE_SHRINK)) {
+			log_error("RAID module does not support shrinking.");
+			return 0;
+		}
+	}
+
 	if (lp->use_policies && !lv_is_cow(lv) && !lv_is_thin_pool(lv)) {
 		log_error("Policy-based resize is supported only for snapshot and thin pool volumes.");
 		return 0;
diff --git a/lib/metadata/segtype.h b/lib/metadata/segtype.h
index f99d3ad..2364db8 100644
--- a/lib/metadata/segtype.h
+++ b/lib/metadata/segtype.h
@@ -286,7 +286,8 @@ struct segment_type *init_unknown_segtype(struct cmd_context *cmd,
 #define RAID_FEATURE_RAID0			(1U << 1) /* version 1.7 */
 #define RAID_FEATURE_RESHAPING			(1U << 2) /* version 1.8 */
 #define RAID_FEATURE_RAID4			(1U << 3) /* ! version 1.8 or 1.9.0 */
-#define RAID_FEATURE_RESHAPE			(1U << 4) /* version 1.10.1 */
+#define RAID_FEATURE_SHRINK			(1U << 4) /* version 1.9.0 */
+#define RAID_FEATURE_RESHAPE			(1U << 5) /* version 1.10.1 */
 
 #ifdef RAID_INTERNAL
 int init_raid_segtypes(struct cmd_context *cmd, struct segtype_library *seglib);
diff --git a/lib/raid/raid.c b/lib/raid/raid.c
index 6439a3e..df9796d 100644
--- a/lib/raid/raid.c
+++ b/lib/raid/raid.c
@@ -473,6 +473,7 @@ static int _raid_target_present(struct cmd_context *cmd,
 	const struct raid_feature _features[] = {
 		{ 1, 3, 0, RAID_FEATURE_RAID10, SEG_TYPE_NAME_RAID10 },
 		{ 1, 7, 0, RAID_FEATURE_RAID0, SEG_TYPE_NAME_RAID0 },
+		{ 1, 9, 0, RAID_FEATURE_SHRINK, "shrinking" },
 		{ 1, 10, 1, RAID_FEATURE_RESHAPE, "reshaping" },
 	};
 




More information about the lvm-devel mailing list