master - report: update report_object API
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=ae8b9baa04d8d2...
Commit: ae8b9baa04d8d24133ec7a2e80762ae5c7b6490f
Parent: b3a348c03c67b490ad1a8517168454dc6d5563da
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jan 20 13:16:41 2015 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 20 14:58:43 2015 +0100
report: update report_object API
Internal API change - pass single struct for both info & seg_status.
---
lib/activate/activate.c | 6 +++---
lib/activate/activate.h | 2 +-
lib/report/report.h | 2 +-
lib/report/values.h | 1 +
tools/reporter.c | 32 +++++++++++++++++---------------
5 files changed, 23 insertions(+), 20 deletions(-)
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index ed41058..20c7c98 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -246,7 +246,7 @@ int lv_info_with_seg_status(struct cmd_context *cmd, const struct logical_volume
return 0;
}
int lv_status(struct cmd_context *cmd, const struct lv_segment *lv_seg,
- struct lv_seg_status *lv_seg_status)
+ int use_layer, struct lv_seg_status *lv_seg_status)
{
return 0;
}
@@ -716,12 +716,12 @@ int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s, int use_layer,
* else 0 on failure or if device not active locally.
*/
int lv_status(struct cmd_context *cmd, const struct lv_segment *lv_seg,
- struct lv_seg_status *lv_seg_status)
+ int use_layer, struct lv_seg_status *lv_seg_status)
{
if (!activation())
return 0;
- return _lv_info(cmd, lv_seg->lv, 1, NULL, lv_seg, lv_seg_status, 0, 0);
+ return _lv_info(cmd, lv_seg->lv, use_layer, NULL, lv_seg, lv_seg_status, 0, 0);
}
/*
diff --git a/lib/activate/activate.h b/lib/activate/activate.h
index 306ebd8..01d6444 100644
--- a/lib/activate/activate.h
+++ b/lib/activate/activate.h
@@ -132,7 +132,7 @@ int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s, int use_layer,
* else 0 on failure or if device not active locally.
*/
int lv_status(struct cmd_context *cmd, const struct lv_segment *lv_seg,
- struct lv_seg_status *lv_seg_status);
+ int use_layer, struct lv_seg_status *lv_seg_status);
/*
* Returns 1 if lv_info_and_seg_status structure has been populated,
diff --git a/lib/report/report.h b/lib/report/report.h
index a8e7405..8ff3454 100644
--- a/lib/report/report.h
+++ b/lib/report/report.h
@@ -47,7 +47,7 @@ void report_free(void *handle);
int report_object(void *handle, const struct volume_group *vg,
const struct logical_volume *lv, const struct physical_volume *pv,
const struct lv_segment *seg, const struct pv_segment *pvseg,
- const struct lvinfo *lvinfo, const struct lv_seg_status *lv_seg_status,
+ const struct lv_with_info_and_seg_status *lvdm,
const struct label *label);
int report_devtypes(void *handle);
int report_output(void *handle);
diff --git a/lib/report/values.h b/lib/report/values.h
index 4323c17..2b2a4d3 100644
--- a/lib/report/values.h
+++ b/lib/report/values.h
@@ -88,6 +88,7 @@ FIELD_RESERVED_VALUE(lv_read_ahead, lv_read_ahead_auto, "", &GET_TYPE_RESERVED_V
/* Reserved values for SEG fields */
FIELD_RESERVED_VALUE(cache_policy, cache_policy_undef, "", "", "", "undefined")
+FIELD_RESERVED_VALUE(lv_health_status, health_undef, "", "", "", "undefined")
/* TODO the following 2 need STR_LIST support for reserved values
FIELD_RESERVED_VALUE(cache_settings, cache_settings_default, "", "default", "default")
FIELD_RESERVED_VALUE(cache_settings, cache_settings_undef, "", "undefined", "undefined") */
diff --git a/tools/reporter.c b/tools/reporter.c
index 6c278cb..b5edfa6 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -31,7 +31,7 @@ static int _vgs_single(struct cmd_context *cmd __attribute__((unused)),
const char *vg_name, struct volume_group *vg,
void *handle)
{
- if (!report_object(handle, vg, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+ if (!report_object(handle, vg, NULL, NULL, NULL, NULL, NULL, NULL))
return_ECMD_FAILED;
check_current_backup(vg);
@@ -83,7 +83,9 @@ static int _do_lvs_with_info_and_status_single(struct cmd_context *cmd,
int do_info, int do_status,
void *handle)
{
- struct lv_with_info_and_seg_status status;
+ struct lv_with_info_and_seg_status status = {
+ .seg_status.type = SEG_STATUS_NONE
+ };
int r = ECMD_FAILED;
if (!_do_info_and_status(cmd, lv, NULL, &status, do_info, do_status)) {
@@ -92,9 +94,7 @@ static int _do_lvs_with_info_and_status_single(struct cmd_context *cmd,
}
if (!report_object(handle, lv->vg, lv, NULL, NULL, NULL,
- do_info ? &status.info : NULL,
- do_status ? &status.seg_status : NULL,
- NULL))
+ &status, NULL))
goto_out;
r = ECMD_PROCESSED;
@@ -134,7 +134,9 @@ static int _do_segs_with_info_and_status_single(struct cmd_context *cmd,
int do_info, int do_status,
void *handle)
{
- struct lv_with_info_and_seg_status status;
+ struct lv_with_info_and_seg_status status = {
+ .seg_status.type = SEG_STATUS_NONE
+ };
int r = ECMD_FAILED;
if (!_do_info_and_status(cmd, seg->lv, seg, &status, do_info, do_status)) {
@@ -143,9 +145,7 @@ static int _do_segs_with_info_and_status_single(struct cmd_context *cmd,
}
if (!report_object(handle, seg->lv->vg, seg->lv, NULL, seg, NULL,
- do_info ? &status.info : NULL,
- do_status ? &status.seg_status : NULL,
- NULL))
+ &status, NULL))
goto_out;
r = ECMD_PROCESSED;
@@ -225,9 +225,6 @@ static int _do_pvsegs_sub_single(struct cmd_context *cmd,
{
int ret = ECMD_PROCESSED;
struct lv_segment *seg = pvseg->lvseg;
- struct lv_with_info_and_seg_status status = {
- .seg_status.type = SEG_STATUS_NONE
- };
struct segment_type _freeseg_type = {
.name = "free",
@@ -262,11 +259,16 @@ static int _do_pvsegs_sub_single(struct cmd_context *cmd,
.origin_list = DM_LIST_HEAD_INIT(_free_lv_segment.origin_list),
};
+ struct lv_with_info_and_seg_status status = {
+ .seg_status.type = SEG_STATUS_NONE,
+ .lv = &_free_logical_volume
+ };
+
if (seg)
_do_info_and_status(cmd, seg->lv, seg, &status, do_info, do_status);
if (!report_object(handle, vg, seg ? seg->lv : &_free_logical_volume, pvseg->pv,
- seg ? : &_free_lv_segment, pvseg, &status.info, &status.seg_status,
+ seg ? : &_free_lv_segment, pvseg, &status,
pv_label(pvseg->pv))) {
ret = ECMD_FAILED;
goto_out;
@@ -346,7 +348,7 @@ static int _pvsegs_with_lv_info_and_status_single(struct cmd_context *cmd,
static int _pvs_single(struct cmd_context *cmd, struct volume_group *vg,
struct physical_volume *pv, void *handle)
{
- if (!report_object(handle, vg, NULL, pv, NULL, NULL, NULL, NULL, NULL))
+ if (!report_object(handle, vg, NULL, pv, NULL, NULL, NULL, NULL))
return_ECMD_FAILED;
return ECMD_PROCESSED;
@@ -355,7 +357,7 @@ static int _pvs_single(struct cmd_context *cmd, struct volume_group *vg,
static int _label_single(struct cmd_context *cmd, struct label *label,
void *handle)
{
- if (!report_object(handle, NULL, NULL, NULL, NULL, NULL, NULL, NULL, label))
+ if (!report_object(handle, NULL, NULL, NULL, NULL, NULL, NULL, label))
return_ECMD_FAILED;
return ECMD_PROCESSED;
9 years, 3 months
master - report: use same info also for lv_attr
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=b3a348c03c67b4...
Commit: b3a348c03c67b490ad1a8517168454dc6d5563da
Parent: e34b004422f0d51263e0d34f4064556cfc9148f6
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jan 20 13:14:16 2015 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 20 14:58:41 2015 +0100
report: use same info also for lv_attr
Recently the single 'status' code has been used for number of cache
features.
Extend the API a little bit to allow usage also for lv_attr_dup.
As the function itself is used in lvm2api - add a new function:
lv_attr_dup_with_info_and_seg_status() that is able to use
grabbed info & status information.
report_init() is now using directly passed lvdm struct pointer
which holds the infomation whether lv_info() was correctly obtained or
there was some error when trying to read it.
Move 'healt' attribute to status.
TODO convert raid function to use the already known status.
---
lib/activate/activate.h | 8 ++++++-
lib/activate/dev_manager.c | 21 ++++++++---------
lib/metadata/lv.c | 50 +++++++++++++++++++++++++++----------------
lib/metadata/lv.h | 3 ++
lib/report/columns.h | 4 +-
lib/report/report.c | 35 ++++++++++++------------------
6 files changed, 67 insertions(+), 54 deletions(-)
diff --git a/lib/activate/activate.h b/lib/activate/activate.h
index 7cb8271..306ebd8 100644
--- a/lib/activate/activate.h
+++ b/lib/activate/activate.h
@@ -44,7 +44,13 @@ struct lv_seg_status {
struct dm_pool *mem; /* input */
const struct lv_segment *seg; /* input */
lv_seg_status_type_t type; /* output */
- const void *status; /* struct dm_status_* */ /* output */
+ union {
+ struct dm_status_cache *cache;
+ struct dm_status_raid *raid;
+ struct dm_status_snapshot *snapshot;
+ struct dm_status_thin *thin;
+ struct dm_status_thin_pool *thin_pool;
+ };
};
struct lv_with_info_and_seg_status {
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index f310a67..015af5b 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -121,6 +121,7 @@ static int _get_segment_status_from_target_params(const char *target_name,
{
struct segment_type *segtype;
+ seg_status->type = SEG_STATUS_UNKNOWN;
/*
* TODO: Add support for other segment types too!
* The segment to report status for must be properly
@@ -142,30 +143,28 @@ static int _get_segment_status_from_target_params(const char *target_name,
}
if (!strcmp(segtype->name, "cache")) {
- if (!dm_get_status_cache(seg_status->mem, params,
- (struct dm_status_cache **) &seg_status->status))
- return_0;
+ if (!dm_get_status_cache(seg_status->mem, params, &(seg_status->cache)))
+ return_0;
seg_status->type = SEG_STATUS_CACHE;
} else if (!strcmp(segtype->name, "raid")) {
- if (!dm_get_status_raid(seg_status->mem, params,
- (struct dm_status_raid **) &seg_status->status))
+ if (!dm_get_status_raid(seg_status->mem, params, &seg_status->raid))
return_0;
seg_status->type = SEG_STATUS_RAID;
} else if (!strcmp(segtype->name, "thin")) {
- if (!dm_get_status_thin(seg_status->mem, params,
- (struct dm_status_thin **) &seg_status->status))
+ if (!dm_get_status_thin(seg_status->mem, params, &seg_status->thin))
return_0;
seg_status->type = SEG_STATUS_THIN;
} else if (!strcmp(segtype->name, "thin-pool")) {
- if (!dm_get_status_thin_pool(seg_status->mem, params,
- (struct dm_status_thin_pool **) &seg_status->status))
+ if (!dm_get_status_thin_pool(seg_status->mem, params, &seg_status->thin_pool))
return_0;
seg_status->type = SEG_STATUS_THIN_POOL;
} else if (!strcmp(segtype->name, "snapshot")) {
- if (!dm_get_status_snapshot(seg_status->mem, params,
- (struct dm_status_snapshot **) &seg_status->status))
+ if (!dm_get_status_snapshot(seg_status->mem, params, &seg_status->snapshot))
return_0;
seg_status->type = SEG_STATUS_SNAPSHOT;
+ } else {
+ log_error(INTERNAL_ERROR "Unsupported segment type %s.", segtype->name);
+ return 0;
}
return 1;
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 8682535..cb6577d 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -644,12 +644,11 @@ int lv_raid_healthy(const struct logical_volume *lv)
return 1;
}
-char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv)
+char *lv_attr_dup_with_info_and_seg_status(struct dm_pool *mem, const struct lv_with_info_and_seg_status *lvdm)
{
dm_percent_t snap_percent;
- struct lvinfo info;
+ const struct logical_volume *lv = lvdm->lv;
struct lv_segment *seg;
- struct lv_seg_status seg_status;
char *repstr;
if (!(repstr = dm_pool_zalloc(mem, 11))) {
@@ -722,30 +721,30 @@ char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv)
repstr[3] = (lv->status & FIXED_MINOR) ? 'm' : '-';
- if (!activation() || !lv_info(lv->vg->cmd, lv, 0, &info, 1, 0)) {
+ if (!activation() || !lvdm->info_ok) {
repstr[4] = 'X'; /* Unknown */
repstr[5] = 'X'; /* Unknown */
- } else if (info.exists) {
- if (info.suspended)
+ } else if (lvdm->info.exists) {
+ if (lvdm->info.suspended)
repstr[4] = 's'; /* Suspended */
- else if (info.live_table)
+ else if (lvdm->info.live_table)
repstr[4] = 'a'; /* Active */
- else if (info.inactive_table)
+ else if (lvdm->info.inactive_table)
repstr[4] = 'i'; /* Inactive with table */
else
repstr[4] = 'd'; /* Inactive without table */
/* Snapshot dropped? */
- if (info.live_table && lv_is_cow(lv)) {
+ if (lvdm->info.live_table && lv_is_cow(lv)) {
if (!lv_snapshot_percent(lv, &snap_percent) ||
snap_percent == DM_PERCENT_INVALID) {
- if (info.suspended)
+ if (lvdm->info.suspended)
repstr[4] = 'S'; /* Susp Inv snapshot */
else
repstr[4] = 'I'; /* Invalid snapshot */
}
else if (snap_percent == LVM_PERCENT_MERGE_FAILED) {
- if (info.suspended)
+ if (lvdm->info.suspended)
repstr[4] = 'M'; /* Susp snapshot merge failed */
else
repstr[4] = 'm'; /* snapshot merge failed */
@@ -756,10 +755,10 @@ char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv)
* 'R' indicates read-only activation of a device that
* does not have metadata flagging it as read-only.
*/
- if (repstr[1] != 'r' && info.read_only)
+ if (repstr[1] != 'r' && lvdm->info.read_only)
repstr[1] = 'R';
- repstr[5] = (info.open_count) ? 'o' : '-';
+ repstr[5] = (lvdm->info.open_count) ? 'o' : '-';
} else {
repstr[4] = '-';
repstr[5] = '-';
@@ -803,15 +802,15 @@ char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv)
repstr[8] = 'm'; /* RAID has 'm'ismatches */
} else if (lv->status & LV_WRITEMOSTLY)
repstr[8] = 'w'; /* sub-LV has 'w'ritemostly */
- } else if (lv_is_thin_pool(lv)) {
- seg_status.mem = lv->vg->cmd->mem;
- if (!lv_status(lv->vg->cmd, first_seg(lv), &seg_status))
+ } else if (lv_is_thin_pool(lv) &&
+ (lvdm->seg_status.type != SEG_STATUS_NONE)) {
+ if (lvdm->seg_status.type == SEG_STATUS_UNKNOWN)
repstr[8] = 'X'; /* Unknown */
- else if (((struct dm_status_thin_pool *)seg_status.status)->fail)
+ else if (lvdm->seg_status.thin_pool->fail)
repstr[8] = 'F';
- else if (((struct dm_status_thin_pool *)seg_status.status)->out_of_data_space)
+ else if (lvdm->seg_status.thin_pool->out_of_data_space)
repstr[8] = 'D';
- else if (((struct dm_status_thin_pool *)seg_status.status)->read_only)
+ else if (lvdm->seg_status.thin_pool->read_only)
repstr[8] = 'M';
}
@@ -824,6 +823,19 @@ out:
return repstr;
}
+/* backward compatible internal API for lvm2api, TODO improve it */
+char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv)
+{
+ struct lv_with_info_and_seg_status status = {
+ .seg_status.type = SEG_STATUS_NONE
+ };
+
+ if (!lv_info_with_seg_status(lv->vg->cmd, lv, first_seg(lv), 1, &status, 1, 1))
+ return_NULL;
+
+ return lv_attr_dup_with_info_and_seg_status(mem, &status);
+}
+
int lv_set_creation(struct logical_volume *lv,
const char *hostname, uint64_t timestamp)
{
diff --git a/lib/metadata/lv.h b/lib/metadata/lv.h
index 6c6df73..cb5885d 100644
--- a/lib/metadata/lv.h
+++ b/lib/metadata/lv.h
@@ -54,8 +54,11 @@ struct logical_volume {
const char *hostname;
};
+struct lv_with_info_and_seg_status;
+
uint64_t lv_size(const struct logical_volume *lv);
uint64_t lv_metadata_size(const struct logical_volume *lv);
+char *lv_attr_dup_with_info_and_seg_status(struct dm_pool *mem, const struct lv_with_info_and_seg_status *lvdm);
char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv);
char *lv_uuid_dup(const struct logical_volume *lv);
char *lv_tags_dup(const struct logical_volume *lv);
diff --git a/lib/report/columns.h b/lib/report/columns.h
index 9f64ac8..fbbbe9d 100644
--- a/lib/report/columns.h
+++ b/lib/report/columns.h
@@ -38,7 +38,7 @@ FIELD(LVS, lv, STR, "LV", lvid, 4, lvfullname, lv_full_name, "Full name of LV in
FIELD(LVS, lv, STR, "Path", lvid, 4, lvpath, lv_path, "Full pathname for LV. Blank for internal LVs.", 0)
FIELD(LVS, lv, STR, "DMPath", lvid, 6, lvdmpath, lv_dm_path, "Internal device-mapper pathname for LV (in /dev/mapper directory).", 0)
FIELD(LVS, lv, STR, "Parent", lvid, 6, lvparent, lv_parent, "For LVs that are components of another LV, the parent LV.", 0)
-FIELD(LVS, lv, STR, "Attr", lvid, 4, lvstatus, lv_attr, "Various attributes - see man page.", 0)
+FIELD(LVSSTATUS, lv, STR, "Attr", lvid, 4, lvstatus, lv_attr, "Various attributes - see man page.", 0)
FIELD(LVS, lv, STR_LIST, "Layout", lvid, 10, lvlayout, lv_layout, "LV layout.", 0)
FIELD(LVS, lv, STR_LIST, "Role", lvid, 10, lvrole, lv_role, "LV role.", 0)
FIELD(LVS, lv, BIN, "InitImgSync", lvid, 10, lvinitialimagesync, lv_initial_image_sync, "Set if mirror/RAID images underwent initial resynchronization.", 0)
@@ -50,7 +50,6 @@ FIELD(LVS, lv, BIN, "AllocLock", lvid, 10, lvallocationlocked, lv_allocation_loc
FIELD(LVS, lv, BIN, "FixMin", lvid, 10, lvfixedminor, lv_fixed_minor, "Set if LV has fixed minor number assigned.", 0)
FIELD(LVS, lv, BIN, "MergeFailed", lvid, 15, lvmergefailed, lv_merge_failed, "Set if snapshot merge failed.", 0)
FIELD(LVS, lv, BIN, "SnapInvalid", lvid, 15, lvsnapshotinvalid, lv_snapshot_invalid, "Set if snapshot LV is invalid.", 0)
-FIELD(LVS, lv, STR, "Health", lvid, 15, lvhealthstatus, lv_health_status, "LV health status.", 0)
FIELD(LVS, lv, BIN, "SkipAct", lvid, 15, lvskipactivation, lv_skip_activation, "Set if LV is skipped on activation.", 0)
FIELD(LVS, lv, BIN, "WhenFull", lvid, 15, lverrorwhenfull, lv_error_when_full, "For thin pools, behavior when full.", 0)
FIELD(LVS, lv, STR, "Active", lvid, 6, lvactive, lv_active, "Active state of the LV.", 0)
@@ -103,6 +102,7 @@ FIELD(LVSSTATUS, lv, NUM, "CacheReadHits", lvid, 16, cache_read_hits, cache_read
FIELD(LVSSTATUS, lv, NUM, "CacheReadMisses", lvid, 16, cache_read_misses, cache_read_misses, "Cache read misses.", 0)
FIELD(LVSSTATUS, lv, NUM, "CacheWriteHits", lvid, 16, cache_write_hits, cache_write_hits, "Cache write hits.", 0)
FIELD(LVSSTATUS, lv, NUM, "CacheWriteMisses", lvid, 16, cache_write_misses, cache_write_misses, "Cache write misses.", 0)
+FIELD(LVSSTATUS, lv, STR, "Health", lvid, 15, lvhealthstatus, lv_health_status, "LV health status.", 0)
FIELD(LABEL, label, STR, "Fmt", type, 3, pvfmt, pv_fmt, "Type of metadata.", 0)
FIELD(LABEL, label, STR, "PV UUID", type, 38, pvuuid, pv_uuid, "Unique identifier.", 0)
diff --git a/lib/report/report.c b/lib/report/report.c
index 1b1ccca..4338190 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -415,10 +415,10 @@ static int _lvstatus_disp(struct dm_report *rh __attribute__((unused)), struct d
struct dm_report_field *field,
const void *data, void *private __attribute__((unused)))
{
- const struct logical_volume *lv = (const struct logical_volume *) data;
+ const struct lv_with_info_and_seg_status *lvdm = (const struct lv_with_info_and_seg_status *) data;
char *repstr;
- if (!(repstr = lv_attr_dup(mem, lv)))
+ if (!(repstr = lv_attr_dup_with_info_and_seg_status(mem, lvdm)))
return_0;
return _field_set_value(field, repstr, NULL);
@@ -1770,8 +1770,8 @@ static int _lvhealthstatus_disp(struct dm_report *rh, struct dm_pool *mem,
struct dm_report_field *field,
const void *data, void *private)
{
- const struct logical_volume *lv = (const struct logical_volume *) data;
- struct lv_seg_status seg_status;
+ const struct lv_with_info_and_seg_status *lvdm = (const struct lv_with_info_and_seg_status *) data;
+ const struct logical_volume *lv = lvdm->lv;
const char *health = "";
uint64_t n;
@@ -1787,15 +1787,15 @@ static int _lvhealthstatus_disp(struct dm_report *rh, struct dm_pool *mem,
health = "mismatches exist";
} else if (lv->status & LV_WRITEMOSTLY)
health = "writemostly";
- } else if (lv_is_thin_pool(lv)) {
- seg_status.mem = lv->vg->cmd->mem;
- if (!lv_status(lv->vg->cmd, first_seg(lv), &seg_status))
- health = "unknown";
- else if (((struct dm_status_thin_pool *)seg_status.status)->fail)
+ } else if (lv_is_thin_pool(lv) && (lvdm->seg_status.type != SEG_STATUS_NONE)) {
+ if (lvdm->seg_status.type != SEG_STATUS_THIN_POOL)
+ return _field_set_value(field, GET_FIRST_RESERVED_NAME(health_undef),
+ GET_FIELD_RESERVED_VALUE(health_undef));
+ else if (lvdm->seg_status.thin_pool->fail)
health = "failed";
- else if (((struct dm_status_thin_pool *)seg_status.status)->out_of_data_space)
+ else if (lvdm->seg_status.thin_pool->out_of_data_space)
health = "out_of_data";
- else if (((struct dm_status_thin_pool *)seg_status.status)->read_only)
+ else if (lvdm->seg_status.thin_pool->read_only)
health = "metadata_read_only";
}
@@ -1824,7 +1824,7 @@ static int _cache_ ## cache_status_field_name ## _disp (struct dm_report *rh, \
const struct lv_with_info_and_seg_status *lvdm = (const struct lv_with_info_and_seg_status *) data; \
if (lvdm->seg_status.type != SEG_STATUS_CACHE) \
return _field_set_value(field, "", &GET_TYPE_RESERVED_VALUE(num_undef_64)); \
- return dm_report_field_uint64(rh, field, (void *) ((char *) lvdm->seg_status.status + offsetof(struct dm_status_cache, cache_status_field_name))); \
+ return dm_report_field_uint64(rh, field, &lvdm->seg_status.cache->cache_status_field_name); \
}
GENERATE_CACHE_STATUS_DISP_FN(total_blocks)
@@ -1997,27 +1997,20 @@ void *report_init(struct cmd_context *cmd, const char *format, const char *keys,
int report_object(void *handle, const struct volume_group *vg,
const struct logical_volume *lv, const struct physical_volume *pv,
const struct lv_segment *seg, const struct pv_segment *pvseg,
- const struct lvinfo *lvinfo, const struct lv_seg_status *lv_seg_status,
+ const struct lv_with_info_and_seg_status *lvdm,
const struct label *label)
{
struct device dummy_device = { .dev = 0 };
struct label dummy_label = { .dev = &dummy_device };
- struct lv_with_info_and_seg_status lvdm = { .lv = lv };
struct lvm_report_object obj = {
.vg = (struct volume_group *) vg,
- .lvdm = &lvdm,
+ .lvdm = (struct lv_with_info_and_seg_status *) lvdm,
.pv = (struct physical_volume *) pv,
.seg = (struct lv_segment *) seg,
.pvseg = (struct pv_segment *) pvseg,
.label = (struct label *) (label ? : (pv ? pv_label(pv) : NULL))
};
- if (lvinfo)
- lvdm.info = *lvinfo;
-
- if (lv_seg_status)
- lvdm.seg_status = *lv_seg_status;
-
/* FIXME workaround for pv_label going through cache; remove once struct
* physical_volume gains a proper "label" pointer */
if (!obj.label) {
9 years, 3 months
master - report: reporting unknown status
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e34b004422f0d5...
Commit: e34b004422f0d51263e0d34f4064556cfc9148f6
Parent: 64d8ed502d29a1f19416280bb0e3f346e7f2668c
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jan 20 12:38:38 2015 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 20 14:53:07 2015 +0100
report: reporting unknown status
Add SEG_STATUS_UNKNOWN when status cannot be parsed.
Also add 'info_ok' variable when info was correctly obtained.
---
lib/activate/activate.h | 4 +++-
tools/reporter.c | 20 ++++++++------------
2 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/lib/activate/activate.h b/lib/activate/activate.h
index 1376ce5..7cb8271 100644
--- a/lib/activate/activate.h
+++ b/lib/activate/activate.h
@@ -36,7 +36,8 @@ typedef enum {
SEG_STATUS_RAID,
SEG_STATUS_SNAPSHOT,
SEG_STATUS_THIN,
- SEG_STATUS_THIN_POOL
+ SEG_STATUS_THIN_POOL,
+ SEG_STATUS_UNKNOWN
} lv_seg_status_type_t;
struct lv_seg_status {
@@ -48,6 +49,7 @@ struct lv_seg_status {
struct lv_with_info_and_seg_status {
const struct logical_volume *lv; /* input */
+ int info_ok;
struct lvinfo info; /* output */
int seg_part_of_lv; /* output */
struct lv_seg_status seg_status; /* input/output, see lv_seg_status */
diff --git a/tools/reporter.c b/tools/reporter.c
index f803dd8..6c278cb 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -57,27 +57,23 @@ static int _do_info_and_status(struct cmd_context *cmd,
struct lv_with_info_and_seg_status *status,
int do_info, int do_status)
{
- status->seg_status.mem = NULL;
+ unsigned use_layer = lv_is_thin_pool(lv) ? 1 : 0;
+ status->lv = lv;
if (do_status) {
if (!(status->seg_status.mem = dm_pool_create("reporter_pool", 1024)))
return_0;
if (!lv_seg)
_choose_lv_segment_for_status_report(lv, &lv_seg);
- if (do_info) {
+ if (do_info)
/* both info and status */
- if (!lv_info_with_seg_status(cmd, lv, lv_seg, 0, status, 1, 1))
- status->info.exists = 0;
- } else {
+ status->info_ok = lv_info_with_seg_status(cmd, lv, lv_seg, use_layer, status, 1, 1);
+ else
/* status only */
- if (!lv_status(cmd, lv_seg, &status->seg_status))
- status->info.exists = 0;
- }
- } else if (do_info) {
+ status->info_ok = lv_status(cmd, lv_seg, use_layer, &status->seg_status);
+ } else if (do_info)
/* info only */
- if (!lv_info(cmd, lv, 0, &status->info, 1, 1))
- status->info.exists = 0;
- }
+ status->info_ok = lv_info(cmd, lv, use_layer, &status->info, 1, 1);
return 1;
}
9 years, 3 months
master - thin: lvchange support for errorwhenfull
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=64d8ed502d29a1...
Commit: 64d8ed502d29a1f19416280bb0e3f346e7f2668c
Parent: 07eb1c7dc897fe75e45f1284301f0673a90ad70a
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Jan 15 15:20:08 2015 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 20 14:53:03 2015 +0100
thin: lvchange support for errorwhenfull
Support lvchange --errorwhenfull y|n for thin pools.
---
WHATS_NEW | 1 +
tools/commands.h | 4 +++-
tools/lvchange.c | 36 ++++++++++++++++++++++++++++++++++++
3 files changed, 40 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 4261801..0c96d5b 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.115 -
=====================================
+ Support lvchange --errorwhenfull for thin pools.
Improve the processing and reporting of duplicate PVs.
Report lv_health_status and health attribute also for thin pool.
Add lv_error_when_full reporting field.
diff --git a/tools/commands.h b/tools/commands.h
index 6eb8cc5..7bfc800 100644
--- a/tools/commands.h
+++ b/tools/commands.h
@@ -111,6 +111,7 @@ xx(lvchange,
"\t[-d|--debug]\n"
"\t[--deltag Tag]\n"
"\t[--detachprofile]\n"
+ "\t[--errorwhenfull {y|n}]\n"
"\t[-f|--force]\n"
"\t[-h|--help]\n"
"\t[--discards {ignore|nopassdown|passdown}]\n"
@@ -144,7 +145,8 @@ xx(lvchange,
activationmode_ARG, addtag_ARG, alloc_ARG, autobackup_ARG, activate_ARG,
available_ARG,
- cachepolicy_ARG, cachesettings_ARG, contiguous_ARG, deltag_ARG, discards_ARG, detachprofile_ARG, force_ARG,
+ cachepolicy_ARG, cachesettings_ARG, contiguous_ARG, deltag_ARG, discards_ARG,
+ detachprofile_ARG, errorwhenfull_ARG, force_ARG,
ignorelockingfailure_ARG, ignoremonitoring_ARG, ignoreactivationskip_ARG,
ignoreskippedcluster_ARG, major_ARG, metadataprofile_ARG, minor_ARG,
monitor_ARG, minrecoveryrate_ARG, maxrecoveryrate_ARG, noudevsync_ARG,
diff --git a/tools/lvchange.c b/tools/lvchange.c
index d9003b4..8a175e0 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -487,6 +487,28 @@ static int lvchange_alloc(struct cmd_context *cmd, struct logical_volume *lv)
return 1;
}
+static int lvchange_errorwhenfull(struct cmd_context *cmd,
+ struct logical_volume *lv)
+{
+ unsigned ewf = arg_int_value(cmd, errorwhenfull_ARG, 0);
+
+ if (ewf == lv_is_error_when_full(lv)) {
+ log_error("Error when full is already %sset for %s.",
+ (ewf) ? "" : "un", display_lvname(lv));
+ return 0;
+ }
+
+ if (ewf)
+ lv->status |= LV_ERROR_WHEN_FULL;
+ else
+ lv->status &= ~LV_ERROR_WHEN_FULL;
+
+ if (!lv_update_and_reload(lv))
+ return_0;
+
+ return 1;
+}
+
static int lvchange_readahead(struct cmd_context *cmd,
struct logical_volume *lv)
{
@@ -910,6 +932,11 @@ static int _lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
}
}
+ if (arg_is_set(cmd, errorwhenfull_ARG) && !lv_is_thin_pool(lv)) {
+ log_error("Option --errorwhenfull is only supported with thin pools.");
+ return ECMD_FAILED;
+ }
+
/*
* FIXME: DEFAULT_BACKGROUND_POLLING should be "unspecified".
* If --poll is explicitly provided use it; otherwise polling
@@ -939,6 +966,14 @@ static int _lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
docmds++;
}
+ /* error when full change */
+ if (arg_count(cmd, errorwhenfull_ARG)) {
+ if (!archive(lv->vg))
+ return_ECMD_FAILED;
+ doit += lvchange_errorwhenfull(cmd, lv);
+ docmds++;
+ }
+
/* read ahead sector change */
if (arg_count(cmd, readahead_ARG)) {
if (!archive(lv->vg))
@@ -1076,6 +1111,7 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
int update_partial_unsafe =
arg_count(cmd, alloc_ARG) ||
arg_count(cmd, discards_ARG) ||
+ arg_count(cmd, errorwhenfull_ARG) ||
arg_count(cmd, minrecoveryrate_ARG) ||
arg_count(cmd, maxrecoveryrate_ARG) ||
arg_count(cmd, resync_ARG) ||
9 years, 3 months
master - cleanup: add lv_is_error_when_full() macro
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=07eb1c7dc897fe...
Commit: 07eb1c7dc897fe75e45f1284301f0673a90ad70a
Parent: 8f90f632f565f9796603e6fef081ab9ecd0f9e49
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Jan 15 15:19:00 2015 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 20 14:52:06 2015 +0100
cleanup: add lv_is_error_when_full() macro
Like with other status bits use macro for testing.
(in-release update)
---
lib/metadata/merge.c | 2 +-
lib/metadata/metadata-exported.h | 1 +
lib/thin/thin.c | 4 ++--
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c
index 6d661f8..7fd5a07 100644
--- a/lib/metadata/merge.c
+++ b/lib/metadata/merge.c
@@ -147,7 +147,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
inc_error_count;
}
- if ((lv->status & LV_ERROR_WHEN_FULL) &&
+ if (lv_is_error_when_full(lv) &&
!seg_can_error_when_full(seg)) {
log_error("LV %s: segment %u (%s) does not support flag "
"ERROR_WHEN_FULL.", lv->name, seg_count, seg->segtype->name);
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 94e8ebf..0ab97fa 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -195,6 +195,7 @@
#define lv_is_mirror_type(lv) (((lv)->status & (MIRROR | MIRROR_LOG | MIRROR_IMAGE)) ? 1 : 0)
#define lv_is_pending_delete(lv) (((lv)->status & LV_PENDING_DELETE) ? 1 : 0)
+#define lv_is_error_when_full(lv) (((lv)->status & LV_ERROR_WHEN_FULL) ? 1 : 0)
#define lv_is_pvmove(lv) (((lv)->status & PVMOVE) ? 1 : 0)
#define lv_is_raid(lv) (((lv)->status & RAID) ? 1 : 0)
diff --git a/lib/thin/thin.c b/lib/thin/thin.c
index 377d6ad..e250603 100644
--- a/lib/thin/thin.c
+++ b/lib/thin/thin.c
@@ -316,8 +316,8 @@ static int _thin_pool_add_target_line(struct dev_manager *dm,
"not support discards (needs kernel >= 3.4).");
if (attr & THIN_FEATURE_ERROR_IF_NO_SPACE)
- dm_tree_node_set_thin_pool_error_if_no_space(node, (seg->lv->status & LV_ERROR_WHEN_FULL) ? 1 : 0);
- else if (seg->lv->status & LV_ERROR_WHEN_FULL)
+ dm_tree_node_set_thin_pool_error_if_no_space(node, lv_is_error_when_full(seg->lv));
+ else if (lv_is_error_when_full(seg->lv))
log_warn_suppress(_no_error_if_no_space++, "WARNING: Thin pool target does "
"not support error if no space (needs version >= 1.10).");
9 years, 3 months
master - vgimportclone: Say safe to ignore lvmetad message.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=8f90f632f565f9...
Commit: 8f90f632f565f9796603e6fef081ab9ecd0f9e49
Parent: e5ffacc43440d5aef5ec84d4c9df62faca103fe6
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Sat Jan 17 11:29:38 2015 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Sat Jan 17 11:29:38 2015 +0000
vgimportclone: Say safe to ignore lvmetad message.
---
scripts/vgimportclone.sh | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/scripts/vgimportclone.sh b/scripts/vgimportclone.sh
index 719cd8d..9d319bd 100755
--- a/scripts/vgimportclone.sh
+++ b/scripts/vgimportclone.sh
@@ -369,6 +369,7 @@ then
if [ "$use_lvmetad" = "1" ]
then
echo "Notifying lvmetad about changes since it was disabled temporarily."
+ echo "(This resolves any WARNING message about restarting lvmetad that appears above.)"
LVM_OPTS="${LVM_OPTS} --cache"
fi
9 years, 3 months
master - man: Remove renamed writebehind field from lvs.8.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e5ffacc43440d5...
Commit: e5ffacc43440d5aef5ec84d4c9df62faca103fe6
Parent: 651549594ea24dd516538ca8ac1603b3b7c944f4
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Sat Jan 17 11:05:25 2015 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Sat Jan 17 11:05:25 2015 +0000
man: Remove renamed writebehind field from lvs.8.
---
man/lvs.8.in | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/man/lvs.8.in b/man/lvs.8.in
index f268584..3cb2ec0 100644
--- a/man/lvs.8.in
+++ b/man/lvs.8.in
@@ -134,7 +134,6 @@ stripe_size,
sync_percent,
thin_count,
transaction_id,
-writebehind,
zero.
.IP
With \fB\-\-segments\fP, any "seg_" prefixes are optional;
9 years, 3 months
master - libdm-report: Fix order of NULL dm_report check.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=651549594ea24d...
Commit: 651549594ea24dd516538ca8ac1603b3b7c944f4
Parent: 302b6c99a7c78e4f57b6afe4ef1007a1ba74e40b
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Sat Jan 17 10:50:54 2015 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Sat Jan 17 10:50:54 2015 +0000
libdm-report: Fix order of NULL dm_report check.
---
libdm/libdm-report.c | 8 ++++----
tools/reporter.c | 1 -
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 5ff6cda..2612f74 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -1705,15 +1705,15 @@ int dm_report_compact_fields(struct dm_report *rh)
struct field_properties *fp;
struct row *row;
- if (!(rh->flags & DM_REPORT_OUTPUT_BUFFERED) ||
- dm_list_empty(&rh->rows))
- return 1;
-
if (!rh) {
log_error("dm_report_enable_compact_output: dm report handler is NULL.");
return 0;
}
+ if (!(rh->flags & DM_REPORT_OUTPUT_BUFFERED) ||
+ dm_list_empty(&rh->rows))
+ return 1;
+
/*
* At first, mark all fields with FLD_HIDDEN flag.
* Also, mark field with FLD_COMPACTED flag, but only
diff --git a/tools/reporter.c b/tools/reporter.c
index 133ef39..f803dd8 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -418,7 +418,6 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
args_are_pvs = (report_type == PVS ||
report_type == LABEL ||
-
report_type == PVSEGS) ? 1 : 0;
/*
9 years, 3 months
master - raid_manip: v2 fix multi-segment misallocation on 'lvconvert --repair'
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=302b6c99a7c78e...
Commit: 302b6c99a7c78e4f57b6afe4ef1007a1ba74e40b
Parent: 0bcc0cf95dc85e41379de518b04ae2703858f118
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Fri Jan 16 13:44:16 2015 +0100
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Fri Jan 16 13:44:16 2015 +0100
raid_manip: v2 fix multi-segment misallocation on 'lvconvert --repair'
The previous patch felt short WRT disabling allocation on PVs holding other
legs of the RAID LV persistently; this patch introduces an internal,
transient PV flag PV_ALLOCATION_PROHIBITED to address this very problem.
General problem description for completeness:
An 'lvconvert --repair $RAID_LV" to replace a failed leg of a multi-segment
RAID10/4/5/6 logical volume can lead to allocation of (parts of) the replacement
image component pair on the physical volume of another image component
(e.g. image 0 allocated on the same PV as image 1 silently impeding resilience).
Patch fixes this severe resilince issue by prohibiting allocation on PVs
already holding other legs of the RAID set. It allows to allocate free space
on any operational PV already holding parts of the image component pair.
---
lib/metadata/metadata-exported.h | 6 ++++--
lib/metadata/pv_map.c | 5 ++++-
lib/metadata/raid_manip.c | 7 ++++---
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index a48aef2..94e8ebf 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -119,8 +119,10 @@
#define LV_PENDING_DELETE UINT64_C(0x0004000000000000) /* LV - Internal use only */
#define LV_ERROR_WHEN_FULL UINT64_C(0x0008000000000000) /* LV - error when full */
-
-/* Next unused flag: UINT64_C(0x0010000000000000) */
+#define PV_ALLOCATION_PROHIBITED UINT64_C(0x0010000000000000) /* PV - internal use only - allocation prohibited
+ e.g. to prohibit allocation of a RAID image
+ on a PV already holing an image of the RAID set */
+/* Next unused flag: UINT64_C(0x0020000000000000) */
/* Format features flags */
#define FMT_SEGMENTS 0x00000001U /* Arbitrary segment params? */
diff --git a/lib/metadata/pv_map.c b/lib/metadata/pv_map.c
index 4423a7d..b6cf31e 100644
--- a/lib/metadata/pv_map.c
+++ b/lib/metadata/pv_map.c
@@ -133,8 +133,11 @@ static int _create_maps(struct dm_pool *mem, struct dm_list *pvs, struct dm_list
struct pv_list *pvl;
dm_list_iterate_items(pvl, pvs) {
- if (!(pvl->pv->status & ALLOCATABLE_PV))
+ if (!(pvl->pv->status & ALLOCATABLE_PV) ||
+ (pvl->pv->status & PV_ALLOCATION_PROHIBITED)) {
+ pvl->pv->status &= ~PV_ALLOCATION_PROHIBITED;
continue;
+ }
if (is_missing_pv(pvl->pv))
continue;
assert(pvl->pv->dev);
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index cb0366f..d502379 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -1553,14 +1553,15 @@ static int _avoid_pvs_of_lv(struct logical_volume *lv, void *data)
dm_list_iterate_items(pvl, allocate_pvs)
if (!(lv->status & PARTIAL_LV) &&
lv_is_on_pv(lv, pvl->pv))
- pvl->pv->status &= ~ALLOCATABLE_PV;
+ pvl->pv->status |= PV_ALLOCATION_PROHIBITED;
return 1;
}
/*
- * Prevent any PVs holding other image components of @lv from being used for allocation,
- * I.e. reset ALLOCATABLE_PV on respective PVs listed on @allocatable_pvs
+ * Prevent any PVs holding other image components of @lv from being used for allocation
+ * by setting the internal PV_ALLOCATION_PROHIBITED flag to use it to avoid generating
+ * pv maps for those PVs.
*/
static void _avoid_pvs_with_other_images_of_lv(struct logical_volume *lv, struct dm_list *allocate_pvs)
{
9 years, 3 months
master - WHATS_NEW: previous commits related to duplicate PVs
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=0bcc0cf95dc85e...
Commit: 0bcc0cf95dc85e41379de518b04ae2703858f118
Parent: b64da4d8b52160be3ab5635b44d7bb06ef619f43
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Wed Jan 14 14:52:12 2015 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Wed Jan 14 14:52:12 2015 -0600
WHATS_NEW: previous commits related to duplicate PVs
---
WHATS_NEW | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 344aeb7..4261801 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.115 -
=====================================
+ Improve the processing and reporting of duplicate PVs.
Report lv_health_status and health attribute also for thin pool.
Add lv_error_when_full reporting field.
Add support for lvcreate --errorwhenfull y|n for thin pools.
9 years, 3 months