@@ -951,6 +951,47 @@ static int _add_target_to_dtree(struct dev_manager *dm,
static int _add_new_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
struct logical_volume *lv, const char *layer);
+/* Add all replicators' LVs from active segment */
+static int _add_replicator_dev_target_to_dtree(struct dev_manager *dm,
+ struct dm_tree *dtree,
+ struct lv_segment *seg)
+{
+ struct replicator_device *rdev;
+ struct replicator_site *rsite;
+
+ /* only active replicator */
+ if (lv_is_active_replicator_dev(seg->lv)) {
+ /* activation of one replicator node activate all other nodes */
+ if (!seg->replicator ||
+ !_add_new_lv_to_dtree(dm, dtree, seg->replicator, NULL))
+ return_0;
+
+ dm_list_iterate_items(rsite, &seg->replicator->rsites) {
+ dm_list_iterate_items(rdev, &rsite->rdevices) {
+ if (rdev->slog && !_add_new_lv_to_dtree(dm, dtree, rdev->slog, NULL))
+ return_0;
+ if ((rsite->state == REPLICATOR_STATE_ACTIVE) &&
+ (!rdev->lv || !_add_new_lv_to_dtree(dm, dtree, rdev->lv, NULL)))
+ return_0;
+ }
+ }
+ dm_list_iterate_items(rsite, &seg->replicator->rsites) {
+ if (rsite->state != REPLICATOR_STATE_ACTIVE)
+ continue;
+ dm_list_iterate_items(rdev, &rsite->rdevices) {
+ if (rdev->replicator_dev->lv == seg->lv)
+ continue;
+ if (!rdev->replicator_dev->lv ||
+ !_add_new_lv_to_dtree(dm, dtree, rdev->replicator_dev->lv, NULL))
+ return_0;
+ }
+ }
+ } else if (!_add_new_lv_to_dtree(dm, dtree, seg->lv->rdevice->lv, NULL))
+ return_0;
+
+ return 1;
+}
+
static int _add_segment_to_dtree(struct dev_manager *dm,
struct dm_tree *dtree,
struct dm_tree_node *dnode,
@@ -981,8 +1022,14 @@ static int _add_segment_to_dtree(struct dev_manager *dm,
!_add_new_lv_to_dtree(dm, dtree, seg->log_lv, NULL))
return_0;
+ if (seg_is_replicator_dev(seg)) {
+ if (!_add_replicator_dev_target_to_dtree(dm, dtree, seg))
+ return_0;
+ } else if (seg_is_replicator(seg) && seg->rlog_lv) {
+ if (!_add_new_lv_to_dtree(dm, dtree, seg->rlog_lv, NULL))
+ return_0;
/* If this is a snapshot origin, add real LV */
- if (lv_is_origin(seg->lv) && !layer) {
+ } else if (lv_is_origin(seg->lv) && !layer) {
if (vg_is_clustered(seg->lv->vg)) {
log_error("Clustered snapshots are not yet supported");
return 0;