@@ -2088,6 +2088,67 @@ void lv_calculate_readahead(const struct logical_volume *lv, uint32_t *read_ahea
}
}
+/*
+ * Check for duplicate
+ * site name
+ * site index
+ * device name
+ * device index
+ */
+static int _replicator_validate(const struct logical_volume *lv)
+{
+ struct replicator_site *rsite, *rsiteb;
+ struct replicator_device *rdev, *rdevb;
+ int r = 1;
+
+ dm_list_iterate_items(rsite, &lv->rsites) {
+ dm_list_iterate_items(rsiteb, &lv->rsites) {
+ if (rsite == rsiteb)
+ break;
+ if (strcasecmp(rsite->name, rsiteb->name) == 0) {
+ log_error("Internal error: Duplicate site name "
+ "%s detected for replicator %s",
+ rsite->name, lv->name);
+ r = 0;
+ }
+ if (rsite->site_index == rsiteb->site_index) {
+ log_error("Internal error: Duplicate site index "
+ "%d detected for replicator %s/%s",
+ rsite->site_index, lv->name, rsite->name);
+ r = 0;
+ }
+ }
+
+ dm_list_iterate_items(rdev, &rsite->rdevices) {
+ dm_list_iterate_items(rdevb, &rsite->rdevices) {
+ if (rdev == rdevb)
+ break;
+ log_error("devs: lv:%s %s", rdev->name, rdevb->name);
+ if (rdev->slog && (rdev->slog == rdevb->slog)) {
+ log_error("Internal error: Duplicate sync log "
+ "%s detected for replicator %s",
+ rdev->slog->name, lv->name);
+ r = 0;
+ }
+ if (strcasecmp(rdev->name, rdevb->name) == 0) {
+ log_error("Internal error: Duplicate device name "
+ "%s detected for replicator %s",
+ rdev->name, lv->name);
+ r = 0;
+ }
+ if (rdev->device_index == rdevb->device_index) {
+ log_error("Internal error: Duplicate device index %"
+ PRId64 " detected for replicator %s/%s",
+ rdev->device_index, lv->name, rsite->name);
+ r = 0;
+ }
+ }
+ }
+ }
+
+ return r;
+}
+
int vg_validate(struct volume_group *vg)
{
struct pv_list *pvl, *pvl2;
@@ -2188,6 +2249,9 @@ int vg_validate(struct volume_group *vg)
r = 0;
}
}
+
+ if (lv_is_replicator(lvl->lv) && !_replicator_validate(lvl->lv))
+ r = 0;
}
dm_list_iterate_items(lvl, &vg->lvs) {