diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2015-03-23 13:32:00 +0100 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2015-03-23 13:41:34 +0100 |
commit | f4060818825b96efc12b142384dd862838ac4e4e (patch) | |
tree | 3f0c70c464b5e97690054ba9d45b9deae7fd55fb | |
parent | 27dec73e8804538250cfb8f52191a92ef427d341 (diff) | |
download | lvm2-dev-prajnoha-process-each-lv-list.tar.gz |
metadata: vg: add removed_lvs field to collect LVs which have been removeddev-prajnoha-process-each-lv-list
-rw-r--r-- | lib/metadata/lv_manip.c | 2 | ||||
-rw-r--r-- | lib/metadata/metadata-exported.h | 5 | ||||
-rw-r--r-- | lib/metadata/metadata.c | 14 | ||||
-rw-r--r-- | lib/metadata/vg.c | 1 | ||||
-rw-r--r-- | lib/metadata/vg.h | 5 | ||||
-rw-r--r-- | tools/toollib.c | 5 |
6 files changed, 30 insertions, 2 deletions
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index b9cd056d2..99fb91f49 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -5350,7 +5350,7 @@ int unlink_lv_from_vg(struct logical_volume *lv) if (!(lvl = find_lv_in_vg(lv->vg, lv->name))) return_0; - dm_list_del(&lvl->list); + dm_list_move(&lv->vg->removed_lvs, &lvl->list); lv->status |= LV_REMOVED; return 1; diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index a336769b2..5d6fb5867 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -123,7 +123,10 @@ #define PV_ALLOCATION_PROHIBITED UINT64_C(0x0010000000000000) /* PV - internal use only - allocation prohibited e.g. to prohibit allocation of a RAID image on a PV already holing an image of the RAID set */ -#define LV_REMOVED UINT64_C(0x0040000000000000) /* LV - Internal use only */ +#define LV_REMOVED UINT64_C(0x0040000000000000) /* LV - Internal use only + FIXME: Remove this flag once we have + indexed vg->removed_lvs + */ /* Next unused flag: UINT64_C(0x0080000000000000) */ /* Format features flags */ diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 33ce3708d..a1a31eb27 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -2568,12 +2568,26 @@ int vg_validate(struct volume_group *vg) r = 0; } + dm_list_iterate_items(lvl, &vg->removed_lvs) { + if (!(lvl->lv->status & LV_REMOVED)) { + log_error(INTERNAL_ERROR "LV %s is not marked as removed while it's part " + "of removed LV list for VG %s", lvl->lv->name, vg->name); + r = 0; + } + } + /* * Count all non-snapshot invisible LVs */ dm_list_iterate_items(lvl, &vg->lvs) { lv_count++; + if (lvl->lv->status & LV_REMOVED) { + log_error(INTERNAL_ERROR "LV %s is marked as removed while it's " + "still part of the VG %s", lvl->lv->name, vg->name); + r = 0; + } + if (lvl->lv->status & LVM_WRITE_LOCKED) { log_error(INTERNAL_ERROR "LV %s has external flag LVM_WRITE_LOCKED set internally.", lvl->lv->name); diff --git a/lib/metadata/vg.c b/lib/metadata/vg.c index 404cc6fa6..c9a7e9e1b 100644 --- a/lib/metadata/vg.c +++ b/lib/metadata/vg.c @@ -63,6 +63,7 @@ struct volume_group *alloc_vg(const char *pool_name, struct cmd_context *cmd, dm_list_init(&vg->pvs_to_create); dm_list_init(&vg->lvs); dm_list_init(&vg->tags); + dm_list_init(&vg->removed_lvs); dm_list_init(&vg->removed_pvs); log_debug_mem("Allocated VG %s at %p.", vg->name, vg); diff --git a/lib/metadata/vg.h b/lib/metadata/vg.h index 67a04a05f..b0ab12217 100644 --- a/lib/metadata/vg.h +++ b/lib/metadata/vg.h @@ -113,6 +113,11 @@ struct volume_group { */ /* + * List of removed logical volumes by _lv_reduce. + */ + struct dm_list removed_lvs; + + /* * List of removed physical volumes by pvreduce. * They have to get cleared on vg_commit. */ diff --git a/tools/toollib.c b/tools/toollib.c index be8945019..142ff3373 100644 --- a/tools/toollib.c +++ b/tools/toollib.c @@ -2061,6 +2061,11 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg, } dm_list_iterate_items(lvl, &final_lvs) { + /* + * FIXME: Once we have index over vg->removed_lvs, check directly + * LV presence there and remove LV_REMOVE flag/lv_is_removed fn + * as they won't be needed anymore. + */ if (lv_is_removed(lvl->lv)) continue; |