]> sourceware.org Git - lvm2.git/commitdiff
Replicator: update _create_partial_dtree()
authorZdenek Kabelac <zkabelac@redhat.com>
Fri, 21 May 2010 14:47:58 +0000 (14:47 +0000)
committerZdenek Kabelac <zkabelac@redhat.com>
Fri, 21 May 2010 14:47:58 +0000 (14:47 +0000)
Adding function _add_partial_replicator_to_dtree() to create
partial tree for Replicator target.

Using dm_tree_node_set_presuspend_node() for Replicator.

WHATS_NEW
lib/activate/dev_manager.c

index 8ad627aa6f1061ab58560c4740f7580795a7131b..bc1babf9b830ad375ebca42a56fce9c2e9d9eed4 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.67 -
 ===============================
+  Add _add_partial_replicator_to_dtree().
   Activation code read and releases also remote VGs (Replicator).
   Check for missing VGs before taking lock_vol (Replicator).
   Update process_each_lv_in_vg() to use cmd_vg structure.
index 28461759053cdd8e64113e41893bf466e235eac4..9d21d5f2322a9aaced9663689115c9519445c5ea 100644 (file)
@@ -864,6 +864,84 @@ static int _add_dev_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
        return 1;
 }
 
+/*
+ * Add replicator devices
+ *
+ * Using _add_dev_to_dtree() directly instead of _add_lv_to_dtree()
+ * to avoid extra checks with extensions.
+ */
+static int _add_partial_replicator_to_dtree(struct dev_manager *dm,
+                                           struct dm_tree *dtree,
+                                           struct logical_volume *lv)
+{
+       struct logical_volume *rlv = first_seg(lv)->replicator;
+       struct replicator_device *rdev;
+       struct replicator_site *rsite;
+       struct dm_tree_node *rep_node, *rdev_node;
+       const char *uuid;
+
+       if (!lv_is_active_replicator_dev(lv)) {
+               if (!_add_dev_to_dtree(dm, dtree, lv->rdevice->lv,
+                                     NULL))
+                       return_0;
+               return 1;
+       }
+
+       /* Add _rlog and replicator device */
+       if (!_add_dev_to_dtree(dm, dtree, first_seg(rlv)->rlog_lv, NULL))
+               return_0;
+
+       if (!_add_dev_to_dtree(dm, dtree, rlv, NULL))
+               return_0;
+
+       if (!(uuid = build_dm_uuid(dm->mem, rlv->lvid.s, NULL)))
+               return_0;
+
+       rep_node = dm_tree_find_node_by_uuid(dtree, uuid);
+
+       /* Add all related devices for replicator */
+       dm_list_iterate_items(rsite, &rlv->rsites)
+               dm_list_iterate_items(rdev, &rsite->rdevices) {
+                       if (rsite->state == REPLICATOR_STATE_ACTIVE) {
+                               /* Add _rimage LV */
+                               if (!_add_dev_to_dtree(dm, dtree, rdev->lv, NULL))
+                                       return_0;
+
+                               /* Add replicator-dev LV, except of the already added one */
+                               if ((lv != rdev->replicator_dev->lv) &&
+                                   !_add_dev_to_dtree(dm, dtree,
+                                                      rdev->replicator_dev->lv, NULL))
+                                       return_0;
+
+                               /* If replicator exists - try connect existing heads */
+                               if (rep_node) {
+                                       uuid = build_dm_uuid(dm->mem,
+                                                            rdev->replicator_dev->lv->lvid.s,
+                                                            NULL);
+                                       if (!uuid)
+                                               return_0;
+
+                                       rdev_node = dm_tree_find_node_by_uuid(dtree, uuid);
+                                       if (rdev_node)
+                                               dm_tree_node_set_presuspend_node(rdev_node,
+                                                                                rep_node);
+                               }
+                       }
+
+                       if (!rdev->rsite->vg_name)
+                               continue;
+
+                       if (!_add_dev_to_dtree(dm, dtree, rdev->lv, NULL))
+                               return_0;
+
+                       if (rdev->slog &&
+                           !_add_dev_to_dtree(dm, dtree, rdev->slog, NULL))
+                               return_0;
+               }
+
+       return 1;
+}
+
 /*
  * Add LV and any known dependencies
  */
@@ -883,6 +961,11 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree, struc
            !_add_dev_to_dtree(dm, dtree, first_seg(lv)->log_lv, NULL))
                return_0;
 
+       /* Adding LV head of replicator adds all other related devs */
+       if (lv_is_replicator_dev(lv) &&
+           !_add_partial_replicator_to_dtree(dm, dtree, lv))
+               return_0;
+
        return 1;
 }
 
This page took 0.057859 seconds and 5 git commands to generate.