summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2014-10-24 15:21:48 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2014-10-24 16:39:32 +0200
commit51a29e60564d5379b38ee4688bca5eb9b844c410 (patch)
tree178fc15d785f579af866a59b089e0e0a5e579348
parentdfcf03a9ce2fe9b618f44c5f99e13ff5610ffcc0 (diff)
downloadlvm2-51a29e60564d5379b38ee4688bca5eb9b844c410.tar.gz
pools: error path removes metadata
When pool volume is create - it has already managed to update metadata once within lv_extend - so revert new created LV here.
-rw-r--r--lib/metadata/lv_manip.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 5125412fb..277a51d43 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -6888,8 +6888,10 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
first_seg(lv)->feature_flags = lp->feature_flags;
/* TODO: some calc_policy solution for cache ? */
if (!recalculate_pool_chunk_size_with_dev_hints(lv, lp->passed_args,
- THIN_CHUNK_SIZE_CALC_METHOD_GENERIC))
- return_NULL;
+ THIN_CHUNK_SIZE_CALC_METHOD_GENERIC)) {
+ stack;
+ goto revert_new_lv;
+ }
} else if (seg_is_raid(lp)) {
first_seg(lv)->min_recovery_rate = lp->min_recovery_rate;
first_seg(lv)->max_recovery_rate = lp->max_recovery_rate;
@@ -6900,8 +6902,10 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
/* FIXME: use lowwatermark via lvm.conf global for all thinpools ? */
first_seg(lv)->low_water_mark = 0;
if (!recalculate_pool_chunk_size_with_dev_hints(lv, lp->passed_args,
- lp->thin_chunk_size_calc_policy))
- return_NULL;
+ lp->thin_chunk_size_calc_policy)) {
+ stack;
+ goto revert_new_lv;
+ }
} else if (seg_is_thin_volume(lp)) {
pool_lv = first_seg(lv)->pool_lv;
if (!(first_seg(lv)->device_id =
@@ -7007,8 +7011,14 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
}
/* store vg on disk(s) */
- if (!vg_write(vg) || !vg_commit(vg))
+ if (!vg_write(vg) || !vg_commit(vg)) {
+ if (seg_is_pool(lp)) {
+ /* Pool volumes have already created metadata LV */
+ stack;
+ goto revert_new_lv;
+ }
return_NULL;
+ }
backup(vg);