From 8571d54f61fe5d3950ebac283666f08cca960677 Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Fri, 21 May 2010 14:07:16 +0000 Subject: [PATCH] Replicator: add read and release VGs for rsites Add functions to read and release remote VGs for replicator sites in activation context. --- WHATS_NEW | 1 + lib/metadata/metadata-exported.h | 3 ++ lib/metadata/replicator_manip.c | 56 ++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/WHATS_NEW b/WHATS_NEW index 0b8d7fb44..bcd2099da 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.67 - =============================== + Add functions for read and release VGs list. Add find_replicator_vgs() to discover all needed VGs for replicator-dev LV. Add functions for handling cmd_vg structure. Extend _lv_each_dependency() with Replicator dependencies. diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index 5fde3835a..258f221d5 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -817,6 +817,9 @@ void cmd_vg_release(struct dm_list *cmd_vgs); int find_replicator_vgs(struct logical_volume *lv); +int lv_read_replicator_vgs(struct logical_volume *lv); +void lv_release_replicator_vgs(struct logical_volume *lv); + struct logical_volume *find_pvmove_lv(struct volume_group *vg, struct device *dev, uint32_t lv_type); struct logical_volume *find_pvmove_lv_from_pvname(struct cmd_context *cmd, diff --git a/lib/metadata/replicator_manip.c b/lib/metadata/replicator_manip.c index 18fe6c760..b3a2fff66 100644 --- a/lib/metadata/replicator_manip.c +++ b/lib/metadata/replicator_manip.c @@ -635,3 +635,59 @@ int find_replicator_vgs(struct logical_volume *lv) return ret; } + +/** + * Read all remote VGs from lv's replicator sites. + * Function is used in activation context and needs all VGs already locked. + */ +int lv_read_replicator_vgs(struct logical_volume *lv) +{ + struct replicator_device *rdev; + struct replicator_site *rsite; + struct volume_group *vg; + + if (!lv_is_replicator_dev(lv)) + return 1; + + dm_list_iterate_items(rsite, &first_seg(lv)->replicator->rsites) { + if (!rsite->vg_name) + continue; + vg = vg_read(lv->vg->cmd, rsite->vg_name, 0, 0); // READ_WITHOUT_LOCK + if (vg_read_error(vg)) { + log_error("Unable to read volume group %s", + rsite->vg_name); + goto bad; + } + rsite->vg = vg; + /* FIXME: handling missing LVs needs to be better */ + dm_list_iterate_items(rdev, &rsite->rdevices) + if (!(rdev->lv = find_lv(vg, rdev->name))) { + log_error("Unable to find %s in volume group %s", + rdev->name, rsite->vg_name); + goto bad; + } + } + + return 1; +bad: + lv_release_replicator_vgs(lv); + return 0; +} + +/** + * Release all VG resources taken by lv's replicator sites. + * Function is used in activation context and needs all VGs already locked. + */ +void lv_release_replicator_vgs(struct logical_volume *lv) +{ + struct replicator_site *rsite; + + if (!lv_is_replicator_dev(lv)) + return; + + dm_list_iterate_back_items(rsite, &first_seg(lv)->replicator->rsites) + if (rsite->vg_name && rsite->vg) { + vg_release(rsite->vg); + rsite->vg = NULL; + } +} -- 2.43.5