1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

report: avoid passing NULL label

Internal reporting function cannot handle NULL reporting value,
so ensure there is at least dummy label.

So move dummy_lable from tools/reporter.c and use it for all
report_object() calls in lib/report/report.c.
(Fixes RHBZ 1108394)

Simlify lvm_report_object initialization.
This commit is contained in:
Zdenek Kabelac 2014-06-12 11:33:16 +02:00
parent c230ae95ab
commit 922f884abe
3 changed files with 26 additions and 27 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.107 - Version 2.02.107 -
================================== ==================================
Fix crash when reporting of empty labels on pvs.
Use retry_deactivation also when cleaning orphan devices. Use retry_deactivation also when cleaning orphan devices.
Prompt when setting the VG cluster attr if the cluster is not setup. Prompt when setting the VG cluster attr if the cluster is not setup.
Allow --yes to skip prompt in vgextend (worked only with -f). Allow --yes to skip prompt in vgextend (worked only with -f).

View File

@ -1274,19 +1274,35 @@ int report_object(void *handle, struct volume_group *vg,
struct lv_segment *seg, struct pv_segment *pvseg, struct lv_segment *seg, struct pv_segment *pvseg,
struct label *label) struct label *label)
{ {
struct lvm_report_object obj; struct device dummy_device = { .dev = 0 };
struct label dummy_label = { .dev = &dummy_device };
struct lvm_report_object obj = {
.vg = vg,
.lv = lv,
.pv = pv,
.seg = seg,
.pvseg = pvseg,
.label = label ? : (pv ? pv_label(pv) : NULL)
};
/* FIXME workaround for pv_label going through cache; remove once struct
* physical_volume gains a proper "label" pointer */
if (!obj.label) {
if (pv) {
if (pv->fmt)
dummy_label.labeller = pv->fmt->labeller;
if (pv->dev)
dummy_label.dev = pv->dev;
else
memcpy(dummy_device.pvid, &pv->id, ID_LEN);
}
obj.label = &dummy_label;
}
/* The two format fields might as well match. */ /* The two format fields might as well match. */
if (!vg && pv) if (!vg && pv)
_dummy_fid.fmt = pv->fmt; _dummy_fid.fmt = pv->fmt;
obj.vg = vg;
obj.lv = lv;
obj.pv = pv;
obj.seg = seg;
obj.pvseg = pvseg;
obj.label = label ? label : (pv ? pv_label(pv) : NULL);
return dm_report_object(handle, &obj); return dm_report_object(handle, &obj);
} }

View File

@ -140,9 +140,6 @@ static int _pvs_single(struct cmd_context *cmd, struct volume_group *vg,
const char *vg_name = NULL; const char *vg_name = NULL;
struct volume_group *old_vg = vg; struct volume_group *old_vg = vg;
char uuid[64] __attribute__((aligned(8))); char uuid[64] __attribute__((aligned(8)));
struct label *label;
struct label dummy_label = { .dev = 0 };
struct device dummy_device = { .dev = 0 };
if (is_pv(pv) && !is_orphan(pv) && !vg) { if (is_pv(pv) && !is_orphan(pv) && !vg) {
vg_name = pv_vg_name(pv); vg_name = pv_vg_name(pv);
@ -180,22 +177,7 @@ static int _pvs_single(struct cmd_context *cmd, struct volume_group *vg,
pv = pvl->pv; pv = pvl->pv;
} }
/* FIXME workaround for pv_label going through cache; remove once struct if (!report_object(handle, vg, NULL, pv, NULL, NULL, NULL)) {
* physical_volume gains a proper "label" pointer */
if (!(label = pv_label(pv))) {
if (pv->fmt)
dummy_label.labeller = pv->fmt->labeller;
if (pv->dev)
dummy_label.dev = pv->dev;
else {
dummy_label.dev = &dummy_device;
memcpy(dummy_device.pvid, &pv->id, ID_LEN);
}
label = &dummy_label;
}
if (!report_object(handle, vg, NULL, pv, NULL, NULL, label)) {
stack; stack;
ret = ECMD_FAILED; ret = ECMD_FAILED;
} }