1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-03 05:18:29 +03:00

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.
This commit is contained in:
Zdenek Kabelac 2012-01-25 09:10:13 +00:00
parent 78c3b21bfa
commit efc8ca105d
2 changed files with 25 additions and 8 deletions

View File

@ -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()) {

View File

@ -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 */