[lvm-devel] master - thin: better thin snapshot error detection
Zdenek Kabelac
zkabelac at fedoraproject.org
Mon Oct 6 13:32:47 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=1a6c892864c409724bcc0fdd48e325ae1674ae8b
Commit: 1a6c892864c409724bcc0fdd48e325ae1674ae8b
Parent: 1ef660be460a6dcd876f8077bac9478aca6df3e5
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Mon Oct 6 13:42:59 2014 +0200
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Oct 6 15:18:05 2014 +0200
thin: better thin snapshot error detection
While creating thin snapshot, we cannot use size argument.
---
tools/lvcreate.c | 41 +++++++++++++++++++++++++++--------------
1 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index 9e2c85c..a3f07f3 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -233,37 +233,50 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
* Normal snapshot or thinly-provisioned snapshot?
*/
static int _determine_snapshot_type(struct volume_group *vg,
- struct lvcreate_params *lp)
+ struct lvcreate_params *lp)
{
- struct lv_list *lvl;
+ struct logical_volume *lv, *pool_lv = NULL;
- if (!(lvl = find_lv_in_vg(vg, lp->origin))) {
+ if (!(lv = find_lv(vg, lp->origin))) {
log_error("Snapshot origin LV %s not found in Volume group %s.",
lp->origin, vg->name);
return 0;
}
- if (lv_is_cache(lvl->lv)) {
+ if (lv_is_cache(lv)) {
log_error("Snapshot of cache LV is not yet supported.");
return 0;
}
- if (!arg_count(vg->cmd, extents_ARG) && !arg_count(vg->cmd, size_ARG)) {
- if (seg_is_thin(lp)) {
- if (!(lp->segtype = get_segtype_from_string(vg->cmd, "thin")))
- return_0;
- return 1;
+ if (lp->pool) {
+ if (!(pool_lv = find_lv(vg, lp->pool))) {
+ log_error("Thin pool volume %s not found in Volume group %s.",
+ lp->pool, vg->name);
+ return 0;
}
- if (!lv_is_thin_volume(lvl->lv)) {
- log_error("Please specify either size or extents with snapshots.");
+ if (!lv_is_thin_pool(pool_lv)) {
+ log_error("Logical volume %s is not a thin pool volume.",
+ display_lvname(pool_lv));
return 0;
}
+ }
- if (!(lp->segtype = get_segtype_from_string(vg->cmd, "thin")))
- return_0;
+ if (!arg_count(vg->cmd, extents_ARG) && !arg_count(vg->cmd, size_ARG)) {
+ if (lv_is_thin_volume(lv) && !lp->pool)
+ lp->pool = first_seg(lv)->pool_lv->name;
- lp->pool = first_seg(lvl->lv)->pool_lv->name;
+ if (seg_is_thin(lp) || lp->pool) {
+ if (!(lp->segtype = get_segtype_from_string(vg->cmd, "thin")))
+ return_0;
+ return 1;
+ }
+
+ log_error("Please specify either size or extents with snapshots.");
+ return 0;
+ } else if (lp->pool) {
+ log_error("Cannot specify size with thin pool snapshot.");
+ return 0;
}
return 1;
More information about the lvm-devel
mailing list