From 47a8766f9c4b77ad1acc2a8b03813672d4ac15f3 Mon Sep 17 00:00:00 2001 From: Mike Snitzer Date: Wed, 18 Jan 2012 17:13:10 -0500 Subject: [PATCH 1/3] Differentiate between snapshot status of "Invalid" and "Merge failed" Introduces PERCENT_MERGE_FAILED. --- WHATS_NEW | 1 + lib/activate/dev_manager.c | 3 +++ lib/misc/lvm-percent.h | 3 ++- lib/report/report.c | 2 +- lib/snapshot/snapshot.c | 6 ++++-- liblvm/lvm2app.h | 3 ++- tools/lvconvert.c | 3 +++ 7 files changed, 16 insertions(+), 5 deletions(-) Index: lvm2/lib/activate/dev_manager.c =================================================================== --- lvm2.orig/lib/activate/dev_manager.c +++ lvm2/lib/activate/dev_manager.c @@ -482,6 +482,9 @@ int add_linear_area_to_dtree(struct dm_t static percent_range_t _combine_percent(percent_t a, percent_t b, uint32_t numerator, uint32_t denominator) { + if (a == PERCENT_MERGE_FAILED || b == PERCENT_MERGE_FAILED) + return PERCENT_MERGE_FAILED; + if (a == PERCENT_INVALID || b == PERCENT_INVALID) return PERCENT_INVALID; Index: lvm2/lib/misc/lvm-percent.h =================================================================== --- lvm2.orig/lib/misc/lvm-percent.h +++ lvm2/lib/misc/lvm-percent.h @@ -34,7 +34,8 @@ typedef enum { PERCENT_0 = 0, PERCENT_1 = 1000000, PERCENT_100 = 100 * PERCENT_1, - PERCENT_INVALID = -1 + PERCENT_INVALID = -1, + PERCENT_MERGE_FAILED = -2 } percent_range_t; float percent_to_float(percent_t v); Index: lvm2/lib/snapshot/snapshot.c =================================================================== --- lvm2.orig/lib/snapshot/snapshot.c +++ lvm2/lib/snapshot/snapshot.c @@ -136,9 +136,11 @@ static int _snap_target_percent(void **t *percent = PERCENT_100; else *percent = make_percent(*total_numerator, *total_denominator); - } else if (!strcmp(params, "Invalid") || - !strcmp(params, "Merge failed")) + } + else if (!strcmp(params, "Invalid")) *percent = PERCENT_INVALID; + else if (!strcmp(params, "Merge failed")) + *percent = PERCENT_MERGE_FAILED; else return 0; Index: lvm2/liblvm/lvm2app.h =================================================================== --- lvm2.orig/liblvm/lvm2app.h +++ lvm2/liblvm/lvm2app.h @@ -1591,7 +1591,8 @@ typedef enum { PERCENT_0 = 0, PERCENT_1 = 1000000, PERCENT_100 = 100 * PERCENT_1, - PERCENT_INVALID = -1 + PERCENT_INVALID = -1, + PERCENT_MERGE_FAILED = -2 } percent_range_t; typedef int32_t percent_t; Index: lvm2/tools/lvconvert.c =================================================================== --- lvm2.orig/tools/lvconvert.c +++ lvm2/tools/lvconvert.c @@ -461,6 +461,9 @@ static progress_t _poll_merge_progress(s } else if (percent == PERCENT_INVALID) { log_error("%s: Merging snapshot invalidated. Aborting merge.", lv->name); return PROGRESS_CHECK_FAILED; + } else if (percent == PERCENT_MERGE_FAILED) { + log_error("%s: Merge failed. Retry merge or inspect manually.", lv->name); + return PROGRESS_CHECK_FAILED; } if (parms->progress_display) Index: lvm2/lib/report/report.c =================================================================== --- lvm2.orig/lib/report/report.c +++ lvm2/lib/report/report.c @@ -836,7 +836,7 @@ static int _snpercent_disp(struct dm_rep } if (!lv_snapshot_percent(lv, &snap_percent) || - (snap_percent == PERCENT_INVALID)) { + (snap_percent == PERCENT_INVALID) || (snap_percent == PERCENT_MERGE_FAILED)) { if (!lv_is_merging_origin(lv)) { *sortval = UINT64_C(100); dm_report_field_set_value(field, "100.00", sortval); Index: lvm2/WHATS_NEW =================================================================== --- lvm2.orig/WHATS_NEW +++ lvm2/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.89 - ================================== + Differentiate between snapshot status of "Invalid" and "Merge failed". Lookup snapshot usage percent of origin volume when a snapshot is merging. Update lvdisplay with backward compat. config opt. lvm1_compatible_display. Do not report linear segtype for non-striped targets.