[lvm-devel] master - format_text: Allocate update_mda baton from mempool.
Alasdair Kergon
agk at sourceware.org
Thu Jan 4 00:07:30 UTC 2018
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=111a9fcff5ace7391a9247678c8257da60cc37e6
Commit: 111a9fcff5ace7391a9247678c8257da60cc37e6
Parent: 5a846e09297a56b6fdb0ba85a215164d08204589
Author: Alasdair G Kergon <agk at redhat.com>
AuthorDate: Wed Jan 3 23:53:00 2018 +0000
Committer: Alasdair G Kergon <agk at redhat.com>
CommitterDate: Wed Jan 3 23:53:00 2018 +0000
format_text: Allocate update_mda baton from mempool.
Also store return code. Note that fatal and non-fatal errors while
handling the mda aren't currently distinguished.
---
lib/format_text/text_label.c | 56 +++++++++++++++++++++++++++--------------
1 files changed, 37 insertions(+), 19 deletions(-)
diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c
index d5e4820..42cf5b3 100644
--- a/lib/format_text/text_label.c
+++ b/lib/format_text/text_label.c
@@ -36,14 +36,14 @@ static int _text_can_handle(struct labeller *l __attribute__((unused)),
return 0;
}
-struct _dl_setup_baton {
+struct dl_setup_baton {
struct disk_locn *pvh_dlocn_xl;
struct device *dev;
};
static int _da_setup(struct disk_locn *da, void *baton)
{
- struct _dl_setup_baton *p = baton;
+ struct dl_setup_baton *p = baton;
p->pvh_dlocn_xl->offset = xlate64(da->offset);
p->pvh_dlocn_xl->size = xlate64(da->size);
p->pvh_dlocn_xl++;
@@ -57,7 +57,7 @@ static int _ba_setup(struct disk_locn *ba, void *baton)
static int _mda_setup(struct metadata_area *mda, void *baton)
{
- struct _dl_setup_baton *p = baton;
+ struct dl_setup_baton *p = baton;
struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
if (mdac->area.dev != p->dev)
@@ -72,7 +72,7 @@ static int _mda_setup(struct metadata_area *mda, void *baton)
static int _dl_null_termination(void *baton)
{
- struct _dl_setup_baton *p = baton;
+ struct dl_setup_baton *p = baton;
p->pvh_dlocn_xl->offset = xlate64(UINT64_C(0));
p->pvh_dlocn_xl->size = xlate64(UINT64_C(0));
@@ -87,7 +87,7 @@ static int _text_write(struct label *label, void *buf)
struct pv_header *pvhdr;
struct pv_header_extension *pvhdr_ext;
struct lvmcache_info *info;
- struct _dl_setup_baton baton;
+ struct dl_setup_baton baton;
char buffer[64] __attribute__((aligned(8)));
int ba1, da1, mda1, mda2;
@@ -319,15 +319,16 @@ static int _text_initialise_label(struct labeller *l __attribute__((unused)),
return 1;
}
-struct _update_mda_baton {
+struct update_mda_baton {
struct lvmcache_info *info;
struct label *label;
+ int ret;
};
static int _update_mda(struct metadata_area *mda, void *baton)
{
- struct _update_mda_baton *p = baton;
- const struct format_type *fmt = p->label->labeller->fmt;
+ struct update_mda_baton *umb = baton;
+ const struct format_type *fmt = umb->label->labeller->fmt;
struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
struct mda_header *mdah;
struct lvmcache_vgsummary vgsummary = { 0 };
@@ -361,11 +362,17 @@ static int _update_mda(struct metadata_area *mda, void *baton)
return 1;
}
- if (vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &vgsummary,
- &mdac->free_sectors) &&
- !lvmcache_update_vgname_and_id(p->info, &vgsummary)) {
+ if (!vgname_from_mda(fmt, mdah, mda_is_primary(mda), &mdac->area, &vgsummary,
+ &mdac->free_sectors)) {
+ /* FIXME Separate fatal and non-fatal error cases? */
+ stack;
+ goto close_dev;
+ }
+
+ if (!lvmcache_update_vgname_and_id(umb->info, &vgsummary)) {
if (!dev_close(mdac->area.dev))
stack;
+ umb->ret = 0;
return_0;
}
@@ -376,8 +383,7 @@ close_dev:
return 1;
}
-static int _text_read(struct labeller *l, struct device *dev, void *buf,
- struct label **label)
+static int _text_read(struct labeller *l, struct device *dev, void *buf, struct label **label)
{
struct label_header *lh = (struct label_header *) buf;
struct pv_header *pvhdr;
@@ -386,7 +392,8 @@ static int _text_read(struct labeller *l, struct device *dev, void *buf,
struct disk_locn *dlocn_xl;
uint64_t offset;
uint32_t ext_version;
- struct _update_mda_baton baton;
+ struct dm_pool *mem = l->fmt->cmd->mem;
+ struct update_mda_baton *umb;
/*
* PV header base
@@ -396,7 +403,7 @@ static int _text_read(struct labeller *l, struct device *dev, void *buf,
if (!(info = lvmcache_add(l, (char *)pvhdr->pv_uuid, dev,
FMT_TEXT_ORPHAN_VG_NAME,
FMT_TEXT_ORPHAN_VG_NAME, 0)))
- return_0;
+ goto_bad;
*label = lvmcache_get_label(info);
@@ -444,16 +451,27 @@ static int _text_read(struct labeller *l, struct device *dev, void *buf,
lvmcache_add_ba(info, offset, xlate64(dlocn_xl->size));
dlocn_xl++;
}
+
out:
- baton.info = info;
- baton.label = *label;
+ if (!(umb = dm_pool_zalloc(mem, sizeof(*umb)))) {
+ log_error("baton allocation failed");
+ goto_bad;
+ }
+
+ umb->info = info;
+ umb->label = *label;
+ umb->ret = 1;
- if (!lvmcache_foreach_mda(info, _update_mda, &baton))
+ if (!lvmcache_foreach_mda(info, _update_mda, umb))
return_0;
- lvmcache_make_valid(info);
+ if (umb->ret)
+ lvmcache_make_valid(info);
return 1;
+
+bad:
+ return 0;
}
static void _text_destroy_label(struct labeller *l __attribute__((unused)),
More information about the lvm-devel
mailing list