summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlasdair G Kergon <agk@redhat.com>2018-01-11 02:39:30 +0000
committerAlasdair G Kergon <agk@redhat.com>2018-01-11 02:54:00 +0000
commit35cdd9cf48a8ec4e4e02fe62eec90dcce4fc8970 (patch)
tree5cfff766df9237e1893a1cb9985ed99c39c9c0de
parentf771d3f870a3e0b86b729a730b1ef7797e35aec6 (diff)
downloadlvm2-35cdd9cf48a8ec4e4e02fe62eec90dcce4fc8970.tar.gz
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().
-rw-r--r--lib/cache/lvmcache.c15
-rw-r--r--lib/format1/lvm1-label.c7
-rw-r--r--lib/format_pool/pool_label.c7
-rw-r--r--lib/format_text/text_label.c19
-rw-r--r--lib/label/label.c29
-rw-r--r--lib/label/label.h4
-rw-r--r--lib/metadata/metadata-liblvm.c3
7 files changed, 40 insertions, 44 deletions
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index a24fd0a98..bc7456247 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 84d6f4edf..1452dea78 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 451d7d082..320cef290 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 7f3b2d308..44d43f135 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 27b72d33a..be05285c3 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 7f365f27e..c56687031 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 a4284bc89..d192b1597 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);