[lvm-devel] dev-mornfall-activate - lvcreate: update thin validation

Petr Rockai mornfall at fedoraproject.org
Tue Jun 4 19:27:58 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e5baaf4ac9f2de39558b23606432ebeed483c99a
Commit:        e5baaf4ac9f2de39558b23606432ebeed483c99a
Parent:        e01fbd9d8d310c0b0ddcf58782ac2b871185ddd9
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Fri May 31 11:02:52 2013 +0200
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Fri May 31 21:40:07 2013 +0200

lvcreate: update thin validation

Merge duplicate code that was validating lvcreate args
for creation of thin and snapshot.

Keep most of thin checks in _check_thin_parameters().

Update couple error messages.
---
 tools/lvcreate.c |  127 ++++++++++++++++++++----------------------------------
 1 files changed, 47 insertions(+), 80 deletions(-)

diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index 7beaf6c..05f3b13 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -707,7 +707,6 @@ static int _lvcreate_params(struct lvcreate_params *lp,
 	struct arg_value_group_list *current_group;
 	const char *segtype_str;
 	const char *tag;
-	unsigned i;
 
 	memset(lp, 0, sizeof(*lp));
 	memset(lcp, 0, sizeof(*lcp));
@@ -719,7 +718,7 @@ static int _lvcreate_params(struct lvcreate_params *lp,
 	 */
 	if ((arg_count(cmd, thin_ARG) || arg_count(cmd, thinpool_ARG)) &&
 	    arg_count(cmd,mirrors_ARG)) {
-		log_error("--thin,--thinpool  and --mirrors are incompatible.");
+		log_error("--thin, --thinpool and --mirrors are incompatible.");
 		return 0;
 	}
 
@@ -864,46 +863,30 @@ static int _lvcreate_params(struct lvcreate_params *lp,
 	    !_read_raid_params(lp, cmd))
 		return_0;
 
-	if (!lp->create_thin_pool) {
-		if (seg_is_thin(lp)) {
-			static const int _argname[] = {
-				chunksize_ARG, discards_ARG, poolmetadatasize_ARG, zero_ARG
-			};
-			for (i = 0; i < sizeof(_argname)/sizeof(_argname[0]); ++i) {
-				if (arg_count(cmd, _argname[i])) {
-					log_error("%s is only available for thin pool creation.",
-						  arg_long_option_name(_argname[i]));
-					return 0;
-				}
-			}
-		} else if (lp->snapshot) {
-			if (arg_count(cmd, zero_ARG)) {
-				log_error("-Z is incompatible with snapshots.");
-				return 0;
-			}
-			if (arg_sign_value(cmd, chunksize_ARG, SIGN_NONE) == SIGN_MINUS) {
-				log_error("Negative chunk size is invalid.");
-				return 0;
-			}
-			lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, 8);
-			if (lp->chunk_size < 8 || lp->chunk_size > 1024 ||
-			    (lp->chunk_size & (lp->chunk_size - 1))) {
-				log_error("Chunk size must be a power of 2 in the "
-					  "range 4K to 512K.");
-				return 0;
-			}
-			log_verbose("Setting chunksize to %s.", display_size(cmd, lp->chunk_size));
-
-			if (!(lp->segtype = get_segtype_from_string(cmd, "snapshot")))
-				return_0;
-		} else if (arg_count(cmd, chunksize_ARG)) {
-			log_error("--chunksize is only available with snapshots and thin pools.");
+	if (lp->snapshot && (lp->extents || lcp->size)) {
+		if (arg_sign_value(cmd, chunksize_ARG, SIGN_NONE) == SIGN_MINUS) {
+			log_error("Negative chunk size is invalid.");
+			return 0;
+		}
+		lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, 8);
+		if (lp->chunk_size < 8 || lp->chunk_size > 1024 ||
+		    (lp->chunk_size & (lp->chunk_size - 1))) {
+			log_error("Chunk size must be a power of 2 in the "
+				  "range 4K to 512K.");
 			return 0;
 		}
+		log_verbose("Setting chunksize to %s.", display_size(cmd, lp->chunk_size));
+
+		if (!(lp->segtype = get_segtype_from_string(cmd, "snapshot")))
+			return_0;
+	} else if (!lp->create_thin_pool && arg_count(cmd, chunksize_ARG)) {
+		log_error("--chunksize is only available with snapshots and thin pools.");
+		return 0;
 	}
+
 	if (lp->mirrors > DEFAULT_MIRROR_MAX_IMAGES) {
-		log_error("Only up to %d images in mirror supported currently.",
-			  DEFAULT_MIRROR_MAX_IMAGES);
+		log_error("Only up to " DM_TO_STRING(DEFAULT_MIRROR_MAX_IMAGES)
+			  " images in mirror supported currently.");
 		return 0;
 	}
 
@@ -946,6 +929,7 @@ static int _check_thin_parameters(struct volume_group *vg, struct lvcreate_param
 				  struct lvcreate_cmdline_params *lcp)
 {
 	struct lv_list *lvl;
+	unsigned i;
 
 	if (!lp->thin && !lp->create_thin_pool && !lp->snapshot) {
 		log_error("Please specify device size(s).");
@@ -953,14 +937,28 @@ static int _check_thin_parameters(struct volume_group *vg, struct lvcreate_param
 	}
 
 	if (lp->thin && lp->snapshot) {
-		log_error("Please either creater snapshot or thin volume.");
+		log_error("Please either create snapshot or thin volume.");
 		return 0;
 	}
 
-	if (lp->thin && !lp->create_thin_pool) {
-		if (arg_count(vg->cmd, chunksize_ARG)) {
-			log_error("Only specify --chunksize when originally creating the thin pool.");
-			return 0;
+	if (!lp->create_thin_pool) {
+		static const int _argname[] = {
+			alloc_ARG,
+			chunksize_ARG,
+			contiguous_ARG,
+			discards_ARG,
+			poolmetadatasize_ARG,
+			stripes_ARG,
+			stripesize_ARG,
+			zero_ARG
+		};
+
+		for (i = 0; i < sizeof(_argname)/sizeof(_argname[0]); ++i) {
+			if (arg_count(vg->cmd, _argname[i])) {
+				log_error("%s is only available for thin pool creation.",
+					  arg_long_option_name(_argname[i]));
+				return 0;
+			}
 		}
 
 		if (lcp->pv_count) {
@@ -968,53 +966,22 @@ static int _check_thin_parameters(struct volume_group *vg, struct lvcreate_param
 			return 0;
 		}
 
-		if (arg_count(vg->cmd, alloc_ARG)) {
-			log_error("--alloc may only be specified when allocating the thin pool.");
-			return 0;
-		}
-
-		if (arg_count(vg->cmd, poolmetadatasize_ARG)) {
-			log_error("--poolmetadatasize may only be specified when allocating the thin pool.");
-			return 0;
-		}
-
-		if (arg_count(vg->cmd, stripesize_ARG)) {
-			log_error("--stripesize may only be specified when allocating the thin pool.");
-			return 0;
-		}
-
-		if (arg_count(vg->cmd, stripes_ARG)) {
-			log_error("--stripes may only be specified when allocating the thin pool.");
+		if (!lp->pool) {
+			log_error("Please specify name of existing thin pool.");
 			return 0;
 		}
 
-		if (arg_count(vg->cmd, contiguous_ARG)) {
-			log_error("--contiguous may only be specified when allocating the thin pool.");
-			return 0;
-		}
-
-		if (arg_count(vg->cmd, zero_ARG)) {
-			log_error("--zero may only be specified when allocating the thin pool.");
-			return 0;
-		}
-	}
-
-	if (lp->create_thin_pool && lp->pool) {
-		if (find_lv_in_vg(vg, lp->pool)) {
-			log_error("Pool %s already exists in Volume group %s.", lp->pool, vg->name);
-			return 0;
-		}
-	} else if (lp->pool) {
 		if (!(lvl = find_lv_in_vg(vg, lp->pool))) {
-			log_error("Pool %s not found in Volume group %s.", lp->pool, vg->name);
+			log_error("Thin pool %s not found in Volume group %s.", lp->pool, vg->name);
 			return 0;
 		}
+
 		if (!lv_is_thin_pool(lvl->lv)) {
 			log_error("Logical volume %s is not a thin pool.", lp->pool);
 			return 0;
 		}
-	} else if (!lp->create_thin_pool) {
-		log_error("Please specify name of existing pool.");
+	} else if (lp->pool && find_lv_in_vg(vg, lp->pool)) {
+		log_error("Thin pool %s already exists in Volume group %s.", lp->pool, vg->name);
 		return 0;
 	}
 




More information about the lvm-devel mailing list