]> sourceware.org Git - lvm2.git/commitdiff
Thin add support for origin_only suspend of thin volumes
authorZdenek Kabelac <zkabelac@redhat.com>
Wed, 25 Jan 2012 09:10:13 +0000 (09:10 +0000)
committerZdenek Kabelac <zkabelac@redhat.com>
Wed, 25 Jan 2012 09:10:13 +0000 (09:10 +0000)
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
lib/activate/dev_manager.c

index 27ecde442d7096c703cc54c7194461d91e26dc86..36fe3df4318cab2ff16990e8eba377c89e7b376a 100644 (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()) {
index 36fbd904c27d4bb63346ff0d1a1b2a2e311f86a7..fa52050fa910b0fd2cc325eef10b56696a69beca 100644 (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 */
This page took 0.040612 seconds and 5 git commands to generate.