diff --git a/WHATS_NEW b/WHATS_NEW index 8ad627aa6..bc1babf9b 100644 --- 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. diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c index 284617590..9d21d5f23 100644 --- a/lib/activate/dev_manager.c +++ b/lib/activate/dev_manager.c @@ -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; }