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

Fix reading of released memory

lvseg_segtype_dup used memory pool vg memory pool for strind duplication.
However this one gets released before reporting happens so the command like:

pvs -o segtype

prints data from already released memory pool. Thanks to the fact there
is not much allocation happing after the VG is released, the memory
stays unmodified and correct result is printed.

Fix adds support for mempool passed parameter (like other similar
query commands) and uses dm_report memory pool for string duplication.
This commit is contained in:
Zdenek Kabelac 2011-03-05 12:14:00 +00:00
parent e7f77b36f5
commit 55f6627427
5 changed files with 11 additions and 6 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.85 -
===================================
Fix reading of released memory for printing segment type.
Fix syslog initialisation in clvmd to respect lvm.conf setting.
Fix possible overflow in maximum stripe size and physical extent size.
Add test for failed allocation from dm_task_set_uuid() in dmeventd.

View File

@ -26,13 +26,13 @@ char *lvseg_tags_dup(const struct lv_segment *seg)
return tags_format_and_copy(seg->lv->vg->vgmem, &seg->tags);
}
char *lvseg_segtype_dup(const struct lv_segment *seg)
char *lvseg_segtype_dup(struct dm_pool *mem, const struct lv_segment *seg)
{
if (seg->area_count == 1) {
return (char *)"linear";
}
return dm_pool_strdup(seg->lv->vg->vgmem, seg->segtype->ops->name(seg));
return dm_pool_strdup(mem, seg->segtype->ops->name(seg));
}
uint64_t lvseg_chunksize(const struct lv_segment *seg)

View File

@ -66,7 +66,7 @@ uint32_t lv_kernel_read_ahead(const struct logical_volume *lv);
uint64_t lvseg_start(const struct lv_segment *seg);
uint64_t lvseg_size(const struct lv_segment *seg);
uint64_t lvseg_chunksize(const struct lv_segment *seg);
char *lvseg_segtype_dup(const struct lv_segment *seg);
char *lvseg_segtype_dup(struct dm_pool *mem, const struct lv_segment *seg);
char *lvseg_tags_dup(const struct lv_segment *seg);
#endif /* _LVM_LV_H */

View File

@ -225,7 +225,7 @@ GET_VG_NUM_PROPERTY_FN(vg_mda_copies, (vg_mda_copies(vg)))
SET_VG_NUM_PROPERTY_FN(vg_mda_copies, vg_set_mda_copies)
/* LVSEG */
GET_LVSEG_STR_PROPERTY_FN(segtype, lvseg_segtype_dup(lvseg))
GET_LVSEG_STR_PROPERTY_FN(segtype, lvseg_segtype_dup(lvseg->lv->vg->vgmem, lvseg))
#define _segtype_set _not_implemented_set
GET_LVSEG_NUM_PROPERTY_FN(stripes, lvseg->area_count)
#define _stripes_set _not_implemented_set

View File

@ -278,9 +278,13 @@ static int _segtype_disp(struct dm_report *rh __attribute__((unused)),
const void *data, void *private __attribute__((unused)))
{
const struct lv_segment *seg = (const struct lv_segment *) data;
char *name;
name = lvseg_segtype_dup(seg);
if (!(name = lvseg_segtype_dup(mem, seg))) {
log_error("Failed to get segtype.");
return 0;
}
dm_report_field_set_value(field, name, NULL);
return 1;
}