From efc8ca105de29b6734ae84533d47561d7a80a53e Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Wed, 25 Jan 2012 09:10:13 +0000 Subject: [PATCH] Thin add support for origin_only suspend of thin volumes Pass in the origin_only flag also for thin volumes - but curently the flag is not used to its best. FIXME: achieve the state where only thin volume snapshot origin is suspended without its childrens - let's explore whether this may happen automatically inside libdm (might be generic for other targets). So the code would not need to annotate the node for this. --- lib/activate/activate.c | 2 +- lib/activate/dev_manager.c | 31 ++++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/activate/activate.c b/lib/activate/activate.c index 27ecde442..36fe3df43 100644 --- a/lib/activate/activate.c +++ b/lib/activate/activate.c @@ -1344,7 +1344,7 @@ static int _lv_suspend(struct cmd_context *cmd, const char *lvid_s, goto_out; /* Ignore origin_only unless LV is origin in both old and new metadata */ - if (!lv_is_origin(lv) || !lv_is_origin(lv_pre)) + if (!lv_is_thin_volume(lv) && !(lv_is_origin(lv) && lv_is_origin(lv_pre))) laopts->origin_only = 0; if (test_mode()) { diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c index 36fbd904c..fa52050fa 100644 --- a/lib/activate/dev_manager.c +++ b/lib/activate/dev_manager.c @@ -1201,8 +1201,13 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree, uint32_t s; struct seg_list *sl; struct lv_segment *seg = first_seg(lv); + /* FIXME: Resolve skip_childrens + struct dm_tree_node *thin_node; + const char *uuid; + */ - if (!origin_only && !_add_dev_to_dtree(dm, dtree, lv, NULL)) + if ((!origin_only || lv_is_thin_volume(lv)) && + !_add_dev_to_dtree(dm, dtree, lv, NULL)) return_0; /* FIXME Can we avoid doing this every time? */ @@ -1233,17 +1238,29 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree, !_add_partial_replicator_to_dtree(dm, dtree, lv)) return_0; + if (lv_is_thin_volume(lv)) { + /* FIXME: Resolve skip_childrens + if (origin_only) { + if (!(uuid = build_dm_uuid(dm->mem, lv->lvid.s, NULL))) + return_0; + if ((thin_node = dm_tree_find_node_by_uuid(dtree, uuid))) + dm_tree_node_skip_childrens(thin_node, 1); + } + */ + /* Add thin pool LV layer */ + lv = seg->pool_lv; + seg = first_seg(lv); + } + if (lv_is_thin_pool(lv)) { - if (!_add_lv_to_dtree(dm, dtree, seg->metadata_lv, origin_only)) + if (!_add_lv_to_dtree(dm, dtree, seg->metadata_lv, 0)) return_0; /* FIXME code from _create_partial_dtree() should be moved here */ - if (!_add_lv_to_dtree(dm, dtree, seg_lv(seg, 0), origin_only)) + if (!_add_lv_to_dtree(dm, dtree, seg_lv(seg, 0), 0)) return_0; if (!_add_dev_to_dtree(dm, dtree, lv, _thin_layer)) return_0; - } else if (lv_is_thin_volume(lv) && - !_add_lv_to_dtree(dm, dtree, seg->pool_lv, origin_only)) - return_0; + } return 1; } @@ -1260,7 +1277,7 @@ static struct dm_tree *_create_partial_dtree(struct dev_manager *dm, struct logi return NULL; } - if (!_add_lv_to_dtree(dm, dtree, lv, lv_is_origin(lv) ? origin_only : 0)) + if (!_add_lv_to_dtree(dm, dtree, lv, (lv_is_origin(lv) || lv_is_thin_volume(lv)) ? origin_only : 0)) goto_bad; /* Add any snapshots of this LV */ -- 2.43.5