]> sourceware.org Git - lvm2.git/commitdiff
Thin add messages only for activation tree
authorZdenek Kabelac <zkabelac@redhat.com>
Wed, 25 Jan 2012 09:06:43 +0000 (09:06 +0000)
committerZdenek Kabelac <zkabelac@redhat.com>
Wed, 25 Jan 2012 09:06:43 +0000 (09:06 +0000)
Extend lv_activate_opts with bool flag to know for which purpose
dtree is created - and add message only for activation tree
(since that's the only place that may send them).

Extend validation check for thin snapshot creation and test whether
active snapshot origin is suspended before its snapshot is created
(useful in recover scenarios) -  in this case also detect, whether
transaction has been already completed and avoid such suspend check
failure in that case.

lib/activate/activate.h
lib/activate/dev_manager.c
lib/thin/thin.c

index 9029b8da42608937c869f3d685b1555a5ffccd3a..f6c6f54f1008f66d1c0201356e939aabf83b116b 100644 (file)
@@ -35,6 +35,7 @@ struct lv_activate_opts {
        int origin_only;
        int no_merging;
        int real_pool;
+       int is_activate;
        unsigned revert;
        unsigned read_only;
 };
index 3b8bd5855c47fbd06622db80edc352086742ef81..36fbd904c27d4bb63346ff0d1a1b2a2e311f86a7 100644 (file)
@@ -1974,6 +1974,8 @@ static int _tree_action(struct dev_manager *dm, struct logical_volume *lv,
        char *dlid;
        int r = 0;
 
+       laopts->is_activate = (action == ACTIVATE);
+
        if (!(dtree = _create_partial_dtree(dm, lv, laopts->origin_only)))
                return_0;
 
index e3747a0cd77a4d8d33635e8abf85d4c999429eb7..96eee76ce235e24ae767e4e371764ef5eb622ac5 100644 (file)
@@ -223,6 +223,8 @@ static int _thin_pool_add_target_line(struct dev_manager *dm,
        char *metadata_dlid, *pool_dlid;
        const struct lv_thin_message *lmsg;
        const struct logical_volume *origin;
+       struct lvinfo info;
+       uint64_t transaction_id = 0;
 
        if (!laopts->real_pool) {
                if (!(pool_dlid = build_dm_uuid(mem, seg->lv->lvid.s, "tpool"))) {
@@ -257,10 +259,35 @@ static int _thin_pool_add_target_line(struct dev_manager *dm,
                                               seg->zero_new_blocks ? 0 : 1))
                return_0;
 
+       /*
+        * Add messages only for activation tree.
+        * Otherwise avoid checking for existence of suspended origin.
+        * Also transation_id is checked only when snapshot origin is active.
+        * (This might change later)
+        */
+       if (!laopts->is_activate)
+               return 1;
+
        dm_list_iterate_items(lmsg, &seg->thin_messages) {
                switch (lmsg->type) {
                case DM_THIN_MESSAGE_CREATE_THIN:
                        origin = first_seg(lmsg->u.lv)->origin;
+                       /* Check if the origin is suspended */
+                       if (origin && lv_info(cmd, origin, 0, &info, 0, 0) &&
+                           info.exists && !info.suspended) {
+                               /* Origin is not suspended, but the transaction may have been
+                                * already transfered, so test for transaction_id and
+                                * allow to pass in the message for dmtree processing
+                                * so it will skip all messages later.
+                                */
+                               if (!lv_thin_pool_transaction_id(seg->lv, &transaction_id))
+                                       return_0; /* Thin pool should exist and work */
+                               if (transaction_id != seg->transaction_id) {
+                                       log_error("Can't create snapshot %s as origin %s is not suspended.",
+                                                 lmsg->u.lv->name, origin->name);
+                                       return 0;
+                               }
+                       }
                        log_debug("Thin pool create_%s %s.", (!origin) ? "thin" : "snap", lmsg->u.lv->name);
                        if (!dm_tree_node_add_thin_pool_message(node,
                                                                (!origin) ? lmsg->type : DM_THIN_MESSAGE_CREATE_SNAP,
This page took 0.902439 seconds and 5 git commands to generate.