[lvm-devel] [PATCH 04/11] Add pv_remove_metadata_area to format_handler interface.
Peter Rajnoha
prajnoha at redhat.com
Thu Nov 18 21:32:18 UTC 2010
The same as for pv_add_metadata_area, but removing...
Signed-off-by: Peter Rajnoha <prajnoha at redhat.com>
---
lib/format_text/format-text.c | 50 +++++++++++++++++++++++++++++++++++++++++
lib/format_text/format-text.h | 3 ++
lib/metadata/metadata.h | 7 +++++
3 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index 0c1c4c7..db39c80 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -2157,6 +2157,55 @@ bad:
return 0;
}
+int remove_metadata_area_from_cache(struct lvmcache_info *info,
+ unsigned mda_index)
+{
+ struct metadata_area *mda;
+
+ if (mda_index >= FMT_TEXT_MAX_MDAS_PER_PV) {
+ log_error(INTERNAL_ERROR "can't remove metadata with index %u "
+ "from cache for PV %s. Metadata layout "
+ "not supported by %s format.",
+ mda_index, dev_name(info->dev),
+ info->fmt->name);
+ return 0;
+ }
+
+ mda = info->mda_slots[mda_index];
+
+ dm_list_del(&mda->list);
+ info->mda_slots[mda_index] = NULL;
+ dm_free(mda->metadata_locn);
+ dm_free(mda);
+
+ return 1;
+}
+
+static int _text_pv_remove_metadata_area(const struct format_type *fmt,
+ struct physical_volume *pv,
+ unsigned mda_index)
+{
+ struct lvmcache_info *info;
+
+ if (mda_index >= FMT_TEXT_MAX_MDAS_PER_PV) {
+ log_error(INTERNAL_ERROR "invalid index of value %u used "
+ "while trying to remove metadata area on PV %s. "
+ "Metadata layout not supported by %s format.",
+ mda_index, pv_dev_name(pv), fmt->name);
+ return 0;
+ }
+
+ if (!(info = info_from_pvid(pv->dev->pvid, 0)))
+ return_0;
+
+ /* FIXME: Also wipe the mda area with zeroes? */
+
+ if (!remove_metadata_area_from_cache(info, mda_index))
+ return_0;
+
+ return 1;
+}
+
/* NULL vgname means use only the supplied context e.g. an archive file */
static struct format_instance *_text_create_text_instance(const struct format_type
*fmt, const char *vgname,
@@ -2298,6 +2347,7 @@ static struct format_handler _text_handler = {
.pv_read = _text_pv_read,
.pv_setup = _text_pv_setup,
.pv_add_metadata_area = _text_pv_add_metadata_area,
+ .pv_remove_metadata_area = _text_pv_remove_metadata_area,
.pv_write = _text_pv_write,
.vg_setup = _text_vg_setup,
.lv_setup = _text_lv_setup,
diff --git a/lib/format_text/format-text.h b/lib/format_text/format-text.h
index 75d69bf..e172e3b 100644
--- a/lib/format_text/format-text.h
+++ b/lib/format_text/format-text.h
@@ -62,6 +62,9 @@ int add_metadata_area_to_cache(struct lvmcache_info *info,
uint64_t mda_size,
unsigned mda_ignored);
+int remove_metadata_area_from_cache(struct lvmcache_info *info,
+ unsigned mda_index);
+
int add_mda(const struct format_type *fmt, struct dm_pool *mem, struct dm_list *mdas,
struct device *dev, uint64_t start, uint64_t size, unsigned ignored);
void del_mdas(struct dm_list *mdas);
diff --git a/lib/metadata/metadata.h b/lib/metadata/metadata.h
index ca2ec0b..a78f3a2 100644
--- a/lib/metadata/metadata.h
+++ b/lib/metadata/metadata.h
@@ -259,6 +259,13 @@ struct format_handler {
unsigned metadata_ignored);
/*
+ * Remove metadata area from a PV. Changes will take effect on pv_write.
+ */
+ int (*pv_remove_metadata_area) (const struct format_type *fmt,
+ struct physical_volume *pv,
+ unsigned metadata_index);
+
+ /*
* Write a PV structure to disk. Fails if the PV is in a VG ie
* pv->vg_name must be a valid orphan VG name
*/
--
1.7.3.2
More information about the lvm-devel
mailing list