[lvm-devel] [PATCH 08/17] Add pv_remove_metadata_area fn to support removing metadata areas on demand.
Petr Rockai
prockai at redhat.com
Fri Jan 28 15:31:01 UTC 2011
Peter Rajnoha <prajnoha at redhat.com> writes:
> The same as for pv_add_metadata_area, but removing...
These look OK (although the FMT_TEXT_MAX_MDAS_PER_PV is a bit fiddly).
> Signed-off-by: Peter Rajnoha <prajnoha at redhat.com>
Reviewed-by: Petr Rockai <prockai at redhat.com>
> ---
> lib/format_text/format-text.c | 24 ++++++++++++++++++++++++
> lib/format_text/format-text.h | 2 ++
> lib/metadata/metadata.h | 7 +++++++
> 3 files changed, 33 insertions(+), 0 deletions(-)
>
> diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
> index cf18f25..99f691f 100644
> --- a/lib/format_text/format-text.c
> +++ b/lib/format_text/format-text.c
> @@ -2275,6 +2275,29 @@ bad:
> return 0;
> }
>
> +int remove_metadata_area_from_pv(struct physical_volume *pv,
> + unsigned mda_index)
> +{
> + if (mda_index >= FMT_TEXT_MAX_MDAS_PER_PV) {
> + log_error(INTERNAL_ERROR "can't remove metadata area with "
> + "index %u from PV %s. Metadata "
> + "layou not supported by %s format.",
> + mda_index, dev_name(pv->dev),
> + pv->fmt->name);
> + return 0;
> + }
> +
> + return fid_remove_mda(pv->fid, NULL, (const char *) &pv->id,
> + ID_LEN, mda_index);
> +}
> +
> +static int _text_pv_remove_metadata_area(const struct format_type *fmt,
> + struct physical_volume *pv,
> + unsigned mda_index)
> +{
> + return remove_metadata_area_from_pv(pv, mda_index);
> +}
> +
> /* 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 *pvid,
> @@ -2356,6 +2379,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 f65be74..694b5c1 100644
> --- a/lib/format_text/format-text.h
> +++ b/lib/format_text/format-text.h
> @@ -61,6 +61,8 @@ int add_metadata_area_to_pv(struct physical_volume *pv,
> uint64_t mda_start,
> uint64_t mda_size,
> unsigned mda_ignored);
> +int remove_metadata_area_from_pv(struct physical_volume *pv,
> + 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 0da8b3d..ed72551 100644
> --- a/lib/metadata/metadata.h
> +++ b/lib/metadata/metadata.h
> @@ -266,6 +266,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
> */
More information about the lvm-devel
mailing list