All of lore.kernel.org
 help / color / mirror / Atom feed
* master - lvcreate: update thin validation
@ 2013-05-31 19:44 Zdenek Kabelac
  0 siblings, 0 replies; only message in thread
From: Zdenek Kabelac @ 2013-05-31 19:44 UTC (permalink / raw)
  To: lvm-devel

Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e5baaf4ac9f2de39558b23606432ebeed483c99a
Commit:        e5baaf4ac9f2de39558b23606432ebeed483c99a
Parent:        e01fbd9d8d310c0b0ddcf58782ac2b871185ddd9
Author:        Zdenek Kabelac <zkabelac@redhat.com>
AuthorDate:    Fri May 31 11:02:52 2013 +0200
Committer:     Zdenek Kabelac <zkabelac@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;
 	}
 



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2013-05-31 19:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-31 19:44 master - lvcreate: update thin validation Zdenek Kabelac

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.