diff --git a/VERSION b/VERSION index 85949178f..07b56f1a2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.02.105(2)-git (2013-11-13) +2.02.105(2)-git (2014-01-20) diff --git a/VERSION_DM b/VERSION_DM index d36b8156d..23b8f70bd 100644 --- a/VERSION_DM +++ b/VERSION_DM @@ -1 +1 @@ -1.02.84-git (2013-11-13) +1.02.84-git (2014-01-20) diff --git a/WHATS_NEW b/WHATS_NEW index 284c92e41..26b63aeae 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,7 +1,7 @@ -Version 2.02.105 - -===================================== - Fix thin LV flagging for udev to skip scanning only if the LV is wiped - Replace use of xfs_check with xfs_reparir in fsadm. +Version 2.02.105 - 20th January 2014 +==================================== + Fix thin LV flagging for udev to skip scanning only if the LV is wiped. + Replace use of xfs_check with xfs_repair in fsadm. Mark lvm1 format metadata as FMT_OBSOLETE. Do not use it with lvmetad. Invalidate cached VG struct after a PV in it gets orphaned. (2.02.87) Mark pool format metadata as FMT_OBSOLETE. @@ -12,7 +12,7 @@ Version 2.02.105 - Optimize double call of stat() for cached devices. Enable support for thin provisioning for default configuration. Improve process_each_lv_in_vg() tag processing. - Reodered and simplified logging code. + Reordered and simplified logging code. Fix SYSTEMD_READY assignment for foreign devices in lvmetad udev rules. Disable online thin pool metadata resize for 1.9 kernel thin target. Shortened code for initialization of raid segment types. @@ -49,13 +49,19 @@ Version 2.02.105 - Check for failure of dev_get_size() when reporting device size. Drop extra unneeded '/' when scanning sysfs directory. Fix undef value if skipped clustered VG ignored for toollib PV seg. (2.02.103) - liblvm/python API Add ability to validate VG/LV names. - liblvm/python API Add ability to create PV with arguments. - liblvm/python API Fail VG reduce when insufficient metadata copies - Fix install of conf subdir when not building in srcdir. + Support validation of VG/LV names in liblvm/python. + Allow creation of PVs with arguments to liblvm/python. + Ensure sufficient metadata copies retained in liblvm/python vgreduce. + Fix installation of profiles from conf subdir when not building in srcdir. + Show UUIDs for missing PVs in reports. + Change dev_size/name, pv_fmt/mda_free/mda_size/uuid fields from pv to label. + Add struct device *dev to struct label. + Introduce process_each_label. + Change void *private to struct format_type *fmt in struct labeller. + Remove pv_read. Add reporting of thin_id device id for thin volumes. - Fix reporting of empty numerical values. - Simplify reporting code. + Fix reporting of empty numerical values for recently-added fields. + Use _field_set_percent/value in reporting code. Version 2.02.104 - 13th November 2013 ===================================== diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index af8209663..ce302f31e 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,8 +1,8 @@ -Version 1.02.84 - -==================================== - Deactive already actived nodes when node's preload callback fails. +Version 1.02.84 - 20th January 2014 +=================================== + Revert activation of activated nodes if a node preload callback fails. Avoid busy looping on CPU when dmeventd reads event DM_WAIT_RETRY. - Ensure global mutex is being hold when working with dmeventd thread. + Ensure global mutex is held when working with dmeventd thread. Drop taking timeout mutex for un/registering dmeventd monitor. Allow section names in config file data to be quoted strings. Close fifos before exiting in dmeventd restart() error path. diff --git a/lib/metadata/pv.c b/lib/metadata/pv.c index 6f5fca4ad..45acef4e9 100644 --- a/lib/metadata/pv.c +++ b/lib/metadata/pv.c @@ -88,6 +88,7 @@ uint64_t pv_dev_size(const struct physical_volume *pv) if (!dev_get_size(pv->dev, &size)) size = 0; + return size; } @@ -99,6 +100,7 @@ uint64_t pv_size_field(const struct physical_volume *pv) size = pv->size; else size = (uint64_t) pv->pe_count * pv->pe_size; + return size; } @@ -111,6 +113,7 @@ uint64_t pv_free(const struct physical_volume *pv) else freespace = (uint64_t) (pv->pe_count - pv->pe_alloc_count) * pv->pe_size; + return freespace; } @@ -154,14 +157,17 @@ uint32_t pv_mda_count(const struct physical_volume *pv) struct lvmcache_info *info; info = lvmcache_info_from_pvid((const char *)&pv->id.uuid, 0); + return info ? lvmcache_mda_count(info) : UINT64_C(0); } static int _count_unignored(struct metadata_area *mda, void *baton) { uint32_t *count = baton; + if (!mda_is_ignored(mda)) (*count) ++; + return 1; } @@ -174,6 +180,7 @@ uint32_t pv_mda_used_count(const struct physical_volume *pv) if (!info) return 0; lvmcache_foreach_mda(info, _count_unignored, &used_count); + return used_count; } @@ -228,7 +235,8 @@ uint64_t pv_mda_size(const struct physical_volume *pv) return min_mda_size; } -static int _pv_mda_free(struct metadata_area *mda, void *baton) { +static int _pv_mda_free(struct metadata_area *mda, void *baton) +{ uint64_t mda_free; uint64_t *freespace = baton; @@ -238,6 +246,7 @@ static int _pv_mda_free(struct metadata_area *mda, void *baton) { mda_free = mda->ops->mda_free_sectors(mda); if (mda_free < *freespace) *freespace = mda_free; + return 1; } @@ -258,8 +267,10 @@ uint64_t pv_mda_free(const struct physical_volume *pv) { const char *pvid = (const char *)&pv->id.uuid; struct lvmcache_info *info; + if ((info = lvmcache_info_from_pvid(pvid, 0))) return lvmcache_info_mda_free(info); + return 0; } @@ -271,6 +282,7 @@ uint64_t pv_used(const struct physical_volume *pv) used = 0LL; else used = (uint64_t) pv->pe_alloc_count * pv->pe_size; + return used; } @@ -299,6 +311,7 @@ static int _pv_mda_set_ignored_one(struct metadata_area *mda, void *baton) mda_set_ignored(vg_mda, b->mda_ignored); mda_set_ignored(mda, b->mda_ignored); + return 1; } @@ -355,12 +368,14 @@ struct label *pv_label(const struct physical_volume *pv) { struct lvmcache_info *info = lvmcache_info_from_pvid((const char *)&pv->id.uuid, 0); - if (!info) { - if (pv->vg && pv->dev) /* process_each_pv will create PVs that are dummy - * and that have no label associated */ - log_error(INTERNAL_ERROR "PV %s unexpectedly not in cache.", - dev_name(pv->dev)); - return NULL; - } - return lvmcache_get_label(info); + + if (info) + return lvmcache_get_label(info); + + /* process_each_pv() may create dummy PVs that have no label */ + if (pv->vg && pv->dev) + log_error(INTERNAL_ERROR "PV %s unexpectedly not in cache.", + dev_name(pv->dev)); + + return NULL; } diff --git a/lib/report/report.c b/lib/report/report.c index bd4b725a0..3a5119dbe 100644 --- a/lib/report/report.c +++ b/lib/report/report.c @@ -55,7 +55,6 @@ static int _field_set_percent(struct dm_report_field *field, uint64_t *sortval; if (percent == PERCENT_INVALID) - // FIXME maybe use here '--'? return _field_set_value(field, "", &_minusone64); if (!(repstr = dm_pool_alloc(mem, 8)) ||