summaryrefslogtreecommitdiffstats
path: root/lib/activate
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2011-11-03 14:52:09 +0000
committerZdenek Kabelac <zkabelac@redhat.com>2011-11-03 14:52:09 +0000
commita0c4e85c481de6b68f253cd6292b39feab2ce26a (patch)
treeb743501823e22952c9012ecabe5d2ac85260b603 /lib/activate
parent2e732e9628d07071e392cd25fe9b10679cef805f (diff)
downloadlvm2-a0c4e85c481de6b68f253cd6292b39feab2ce26a.tar.gz
lvm2-a0c4e85c481de6b68f253cd6292b39feab2ce26a.tar.xz
lvm2-a0c4e85c481de6b68f253cd6292b39feab2ce26a.zip
Add -tpool layer in activation tree
Let's put the overlay device over real thin pool device. So we can get the proper locking on cluster. Overwise the pool LV would be activate once implicitely and in other case explicitely, confusing locking mechanism. This patch make the activation of pool LV independent on activation of thin LV since they will both implicitely use real -thin pool device.
Diffstat (limited to 'lib/activate')
-rw-r--r--lib/activate/activate.h1
-rw-r--r--lib/activate/dev_manager.c25
2 files changed, 18 insertions, 8 deletions
diff --git a/lib/activate/activate.h b/lib/activate/activate.h
index b95c1e09..119211df 100644
--- a/lib/activate/activate.h
+++ b/lib/activate/activate.h
@@ -34,6 +34,7 @@ struct lv_activate_opts {
int exclusive;
int origin_only;
int no_merging;
+ int real_pool;
unsigned revert;
};
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 9fcdde89..1e404e4a 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -1100,13 +1100,16 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
return_0;
if (lv_is_thin_pool(lv)) {
- if (!_add_lv_to_dtree(dm, dtree, first_seg(lv)->pool_metadata_lv, origin_only))
- return_0;
- if (!_add_lv_to_dtree(dm, dtree, seg_lv(first_seg(lv), 0), origin_only))
- return_0;
+ if (!_add_dev_to_dtree(dm, dtree, lv, "tpool"))
+ return_0;
+ if (!_add_lv_to_dtree(dm, dtree, first_seg(lv)->pool_metadata_lv, origin_only))
+ return_0;
+ /* FIXME code from _create_partial_dtree() should be moved here */
+ if (!_add_lv_to_dtree(dm, dtree, seg_lv(first_seg(lv), 0), origin_only))
+ return_0;
} else if (lv_is_thin_volume(lv)) {
- if (!_add_lv_to_dtree(dm, dtree, first_seg(lv)->pool_lv, origin_only))
- return_0;
+ if (!_add_lv_to_dtree(dm, dtree, first_seg(lv)->pool_lv, origin_only))
+ return_0;
}
return 1;
@@ -1451,6 +1454,7 @@ static int _add_segment_to_dtree(struct dev_manager *dm,
struct dm_list *snh;
struct lv_segment *seg_present;
const char *target_name;
+ struct lv_activate_opts lva;
/* Ensure required device-mapper targets are loaded */
seg_present = find_cow(seg->lv) ? : seg;
@@ -1495,13 +1499,18 @@ static int _add_segment_to_dtree(struct dev_manager *dm,
} else if (lv_is_cow(seg->lv) && !layer) {
if (!_add_new_lv_to_dtree(dm, dtree, seg->lv, laopts, "cow"))
return_0;
- } else if (lv_is_thin_volume(seg->lv)) {
- if (!_add_new_lv_to_dtree(dm, dtree, seg->pool_lv, laopts, NULL))
+ } else if (!layer && (lv_is_thin_pool(seg->lv) ||
+ lv_is_thin_volume(seg->lv))) {
+ lva = *laopts;
+ lva.real_pool = 1;
+ if (!_add_new_lv_to_dtree(dm, dtree, lv_is_thin_pool(seg->lv) ?
+ seg->lv : seg->pool_lv, &lva, "tpool"))
return_0;
} else {
if (lv_is_thin_pool(seg->lv) &&
!_add_new_lv_to_dtree(dm, dtree, seg->pool_metadata_lv, laopts, NULL))
return_0;
+
/* Add any LVs used by this segment */
for (s = 0; s < seg->area_count; s++) {
if ((seg_type(seg, s) == AREA_LV) &&