Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=35cdd9cf48a8ec4e4e02fe... Commit: 35cdd9cf48a8ec4e4e02fe62eec90dcce4fc8970 Parent: f771d3f870a3e0b86b729a730b1ef7797e35aec6 Author: Alasdair G Kergon agk@redhat.com AuthorDate: Thu Jan 11 02:39:30 2018 +0000 Committer: Alasdair G Kergon agk@redhat.com CommitterDate: Thu Jan 11 02:54:00 2018 +0000
label: Clean up storing of device and label sector.
No longer use the external 'result' pointer internally to set up the cached label. The callback _set_label_read_result() is now given the internal label pointer directly
Callers that don't need the result are no longer required to pass a label pointer into label_read(). --- lib/cache/lvmcache.c | 15 +++++---------- lib/format1/lvm1-label.c | 7 ++++--- lib/format_pool/pool_label.c | 7 ++++--- lib/format_text/text_label.c | 19 ++++++++++--------- lib/label/label.c | 29 ++++++++++++++--------------- lib/label/label.h | 4 ++-- lib/metadata/metadata-liblvm.c | 3 +-- 7 files changed, 40 insertions(+), 44 deletions(-)
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c index a24fd0a..bc74562 100644 --- a/lib/cache/lvmcache.c +++ b/lib/cache/lvmcache.c @@ -548,7 +548,6 @@ const struct format_type *lvmcache_fmt_from_vgname(struct cmd_context *cmd, { struct lvmcache_vginfo *vginfo; struct lvmcache_info *info; - struct label *label; struct dm_list *devh, *tmp; struct dm_list devs; struct device_list *devl; @@ -593,7 +592,7 @@ const struct format_type *lvmcache_fmt_from_vgname(struct cmd_context *cmd,
dm_list_iterate_safe(devh, tmp, &devs) { devl = dm_list_item(devh, struct device_list); - (void) label_read(devl->dev, &label, UINT64_C(0)); + (void) label_read(devl->dev, NULL, UINT64_C(0)); dm_list_del(&devl->list); dm_free(devl); } @@ -776,10 +775,8 @@ char *lvmcache_vgname_from_pvid(struct cmd_context *cmd, const char *pvid)
static void _rescan_entry(struct lvmcache_info *info) { - struct label *label; - if (info->status & CACHE_INVALID) - (void) label_read(info->dev, &label, UINT64_C(0)); + (void) label_read(info->dev, NULL, UINT64_C(0)); }
static int _scan_invalid(void) @@ -1115,7 +1112,6 @@ int lvmcache_label_scan(struct cmd_context *cmd) struct dm_list add_cache_devs; struct lvmcache_info *info; struct device_list *devl; - struct label *label; struct dev_iter *iter; struct device *dev; struct format_type *fmt; @@ -1160,7 +1156,7 @@ int lvmcache_label_scan(struct cmd_context *cmd)
while ((dev = dev_iter_get(iter))) { nr_labels_outstanding++; - if (!label_read_callback(cmd->mem, dev, UINT64_C(0), _process_label_data, &nr_labels_outstanding)) + if (!label_read_callback(dev, UINT64_C(0), _process_label_data, &nr_labels_outstanding)) nr_labels_outstanding--; dev_count++; } @@ -1201,7 +1197,7 @@ int lvmcache_label_scan(struct cmd_context *cmd)
dm_list_iterate_items(devl, &add_cache_devs) { log_debug_cache("Rescan preferred device %s for lvmcache", dev_name(devl->dev)); - (void) label_read(devl->dev, &label, UINT64_C(0)); + (void) label_read(devl->dev, NULL, UINT64_C(0)); }
dm_list_splice(&_unused_duplicate_devs, &del_cache_devs); @@ -1522,7 +1518,6 @@ const char *lvmcache_pvid_from_devname(struct cmd_context *cmd, const char *devname) { struct device *dev; - struct label *label;
if (!(dev = dev_cache_get(devname, cmd->filter))) { log_error("%s: Couldn't find device. Check your filters?", @@ -1530,7 +1525,7 @@ const char *lvmcache_pvid_from_devname(struct cmd_context *cmd, return NULL; }
- if (!(label_read(dev, &label, UINT64_C(0)))) + if (!(label_read(dev, NULL, UINT64_C(0)))) return NULL;
return dev->pvid; diff --git a/lib/format1/lvm1-label.c b/lib/format1/lvm1-label.c index 84d6f4e..1452dea 100644 --- a/lib/format1/lvm1-label.c +++ b/lib/format1/lvm1-label.c @@ -54,12 +54,13 @@ static int _lvm1_write(struct label *label __attribute__((unused)), void *buf __ return 0; }
-static int _lvm1_read(struct labeller *l, struct device *dev, void *buf, struct label **label, +static int _lvm1_read(struct labeller *l, struct device *dev, void *buf, lvm_callback_fn_t read_label_callback_fn, void *read_label_callback_context) { struct pv_disk *pvd = (struct pv_disk *) buf; struct vg_disk vgd; struct lvmcache_info *info; + struct label *label; const char *vgid = FMT_LVM1_ORPHAN_VG_NAME; const char *vgname = FMT_LVM1_ORPHAN_VG_NAME; unsigned exported = 0; @@ -79,7 +80,7 @@ static int _lvm1_read(struct labeller *l, struct device *dev, void *buf, struct exported))) goto_out;
- *label = lvmcache_get_label(info); + label = lvmcache_get_label(info);
lvmcache_set_device_size(info, ((uint64_t)xlate32(pvd->pv_size)) << SECTOR_SHIFT); lvmcache_set_ext_version(info, 0); @@ -92,7 +93,7 @@ static int _lvm1_read(struct labeller *l, struct device *dev, void *buf, struct
out: if (read_label_callback_fn) - read_label_callback_fn(!r, read_label_callback_context, NULL); + read_label_callback_fn(!r, read_label_callback_context, label);
return r; } diff --git a/lib/format_pool/pool_label.c b/lib/format_pool/pool_label.c index 451d7d0..320cef2 100644 --- a/lib/format_pool/pool_label.c +++ b/lib/format_pool/pool_label.c @@ -55,16 +55,17 @@ static int _pool_write(struct label *label __attribute__((unused)), void *buf __ return 0; }
-static int _pool_read(struct labeller *l, struct device *dev, void *buf, struct label **label, +static int _pool_read(struct labeller *l, struct device *dev, void *buf, lvm_callback_fn_t read_label_callback_fn, void *read_label_callback_context) { struct pool_list pl; + struct label *label; int r;
- r = read_pool_label(&pl, l, dev, buf, label); + r = read_pool_label(&pl, l, dev, buf, &label);
if (read_label_callback_fn) - read_label_callback_fn(!r, read_label_callback_context, NULL); + read_label_callback_fn(!r, read_label_callback_context, label);
return r; } diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c index 7f3b2d3..44d43f1 100644 --- a/lib/format_text/text_label.c +++ b/lib/format_text/text_label.c @@ -321,7 +321,7 @@ static int _text_initialise_label(struct labeller *l __attribute__((unused)),
struct update_mda_baton { struct lvmcache_info *info; - struct label *label; + struct labeller *labeller; int nr_outstanding_mdas; lvm_callback_fn_t read_label_callback_fn; void *read_label_callback_context; @@ -362,7 +362,7 @@ static void _process_mda_header(int failed, void *context, const void *data) struct process_mda_header_params *pmp = context; const struct mda_header *mdah = data; struct update_mda_baton *umb = pmp->umb; - const struct format_type *fmt = umb->label->labeller->fmt; + const struct format_type *fmt = umb->labeller->fmt; struct metadata_area *mda = pmp->mda; struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
@@ -394,8 +394,8 @@ static int _update_mda(struct metadata_area *mda, void *baton) { struct process_mda_header_params *pmp; struct update_mda_baton *umb = baton; - const struct format_type *fmt = umb->label->labeller->fmt; - struct dm_pool *mem = umb->label->labeller->fmt->cmd->mem; + const struct format_type *fmt = umb->labeller->fmt; + struct dm_pool *mem = umb->labeller->fmt->cmd->mem; struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
if (!(pmp = dm_pool_zalloc(mem, sizeof(*pmp)))) { @@ -434,7 +434,7 @@ static int _update_mda(struct metadata_area *mda, void *baton) return pmp->ret; }
-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, lvm_callback_fn_t read_label_callback_fn, void *read_label_callback_context) { struct label_header *lh = (struct label_header *) buf; @@ -446,6 +446,7 @@ static int _text_read(struct labeller *l, struct device *dev, void *buf, struct uint32_t ext_version; struct dm_pool *mem = l->fmt->cmd->mem; struct update_mda_baton *umb; + struct label *label = NULL;
/* * PV header base @@ -457,7 +458,7 @@ static int _text_read(struct labeller *l, struct device *dev, void *buf, struct FMT_TEXT_ORPHAN_VG_NAME, 0))) goto_bad;
- *label = lvmcache_get_label(info); + label = lvmcache_get_label(info);
lvmcache_set_device_size(info, xlate64(pvhdr->device_size_xl));
@@ -511,7 +512,7 @@ out: }
umb->info = info; - umb->label = *label; + umb->labeller = label->labeller; umb->read_label_callback_fn = read_label_callback_fn; umb->read_label_callback_context = read_label_callback_context; umb->nr_outstanding_mdas = 1; @@ -526,13 +527,13 @@ out: lvmcache_make_valid(info);
if (umb->read_label_callback_fn) - umb->read_label_callback_fn(!umb->ret, umb->read_label_callback_context, NULL); + umb->read_label_callback_fn(!umb->ret, umb->read_label_callback_context, label);
return 1;
bad: if (read_label_callback_fn) - read_label_callback_fn(1, read_label_callback_context, NULL); + read_label_callback_fn(1, read_label_callback_context, label);
return 0; } diff --git a/lib/label/label.c b/lib/label/label.c index 27b72d3..be05285 100644 --- a/lib/label/label.c +++ b/lib/label/label.c @@ -135,17 +135,22 @@ static void _set_label_read_result(int failed, void *context, const void *data) { struct find_labeller_params *flp = context; struct label **result = flp->result; + struct label *label = (struct label *) data;
if (failed) { flp->ret = 0; goto_out; }
- if (result && *result) { - (*result)->dev = flp->dev; - (*result)->sector = flp->label_sector; + /* Fix up device and label sector which the low-level code doesn't set */ + if (label) { + label->dev = flp->dev; + label->sector = flp->label_sector; }
+ if (result) + *result = (struct label *) label; + out: if (!dev_close(flp->dev)) stack; @@ -160,7 +165,6 @@ static void _find_labeller(int failed, void *context, const void *data) const char *readbuf = data; struct device *dev = flp->dev; uint64_t scan_sector = flp->scan_sector; - struct label **result = flp->result; char labelbuf[LABEL_SIZE] __attribute__((aligned(8))); struct labeller_i *li; struct labeller *l = NULL; /* Set when a labeller claims the label */ @@ -233,7 +237,7 @@ static void _find_labeller(int failed, void *context, const void *data) flp->ret = 0; _set_label_read_result(1, flp, NULL); } else - (void) (l->ops->read)(l, dev, labelbuf, result, &_set_label_read_result, flp); + (void) (l->ops->read)(l, dev, labelbuf, &_set_label_read_result, flp); }
/* FIXME Also wipe associated metadata area headers? */ @@ -318,7 +322,8 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label **
if ((info = lvmcache_info_from_pvid(dev->pvid, dev, 1))) { log_debug_devs("Reading label from lvmcache for %s", dev_name(dev)); - *result = lvmcache_get_label(info); + if (result) + *result = lvmcache_get_label(info); if (process_label_data_fn) process_label_data_fn(0, process_label_data_context, NULL); return 1; @@ -360,22 +365,16 @@ static int _label_read(struct device *dev, uint64_t scan_sector, struct label ** return flp->ret; }
+/* result may be NULL if caller doesn't need it */ int label_read(struct device *dev, struct label **result, uint64_t scan_sector) { return _label_read(dev, scan_sector, result, NULL, NULL); }
-int label_read_callback(struct dm_pool *mem, struct device *dev, uint64_t scan_sector, +int label_read_callback(struct device *dev, uint64_t scan_sector, lvm_callback_fn_t process_label_data_fn, void *process_label_data_context) { - struct label **result; /* FIXME Eliminate this */ - - if (!(result = dm_pool_zalloc(mem, sizeof(*result)))) { - log_error("Couldn't allocate memory for internal result pointer."); - return 0; - } - - return _label_read(dev, scan_sector, result, process_label_data_fn, process_label_data_context); + return _label_read(dev, scan_sector, NULL, process_label_data_fn, process_label_data_context); }
/* Caller may need to use label_get_handler to create label struct! */ diff --git a/lib/label/label.h b/lib/label/label.h index 7f365f2..c566870 100644 --- a/lib/label/label.h +++ b/lib/label/label.h @@ -62,7 +62,7 @@ struct label_ops { /* * Read a label from a volume. */ - int (*read) (struct labeller *l, struct device *dev, void *buf, struct label **label, + int (*read) (struct labeller *l, struct device *dev, void *buf, lvm_callback_fn_t label_read_callback_fn, void *label_read_callback_context);
/* @@ -96,7 +96,7 @@ struct labeller *label_get_handler(const char *name); int label_remove(struct device *dev); int label_read(struct device *dev, struct label **result, uint64_t scan_sector); -int label_read_callback(struct dm_pool *mem, struct device *dev, uint64_t scan_sector, +int label_read_callback(struct device *dev, uint64_t scan_sector, lvm_callback_fn_t process_label_data_fn, void *process_label_data_context); int label_write(struct device *dev, struct label *label); struct label *label_create(struct labeller *labeller); diff --git a/lib/metadata/metadata-liblvm.c b/lib/metadata/metadata-liblvm.c index a4284bc..d192b15 100644 --- a/lib/metadata/metadata-liblvm.c +++ b/lib/metadata/metadata-liblvm.c @@ -491,7 +491,6 @@ static int _pvremove_check(struct cmd_context *cmd, const char *name, { static const char really_wipe_msg[] = "Really WIPE LABELS from physical volume"; struct device *dev; - struct label *label; struct pv_list *pvl; struct physical_volume *pv = NULL; int used; @@ -506,7 +505,7 @@ static int _pvremove_check(struct cmd_context *cmd, const char *name,
/* Is there a pv here already? */ /* If not, this is an error unless you used -f. */ - if (!label_read(dev, &label, 0)) { + if (!label_read(dev, NULL, 0)) { if (force_count) return 1; log_error("No PV label found on %s.", name);
lvm2-commits@lists.fedorahosted.org