mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-08 08:58:50 +03:00
Change dev_manager_mirror_percent()'s 'struct logical_volume *' to be
'const'. Be consistent with its use (and dev_manager_snapshot_percent()). Pass 'lv' from dev_manager_snapshot_percent() to _percent() to _percent_run(). _percent_run() always dereferenced 'lv' (when initializing segh) even though it may have been NULL (as was the case until now for dev_manager_snapshot_percent()). If a "snapshot-origin" LV (snapshot-merge whose merge was deferred becuase it was open) was passed to _percent_run() it would always return 100%. Update _percent_run() to NOT return PERCENT_100 et. al. if ->target_percent() wasn't ever called and supplied 'lv' is a merging origin. A default return of 100% does not work for snapshot-merge. Also tweak a related lvconvert log_error() to include "Aborting merge."
This commit is contained in:
parent
7fef83d687
commit
6c1c02dc52
@ -393,7 +393,7 @@ static percent_range_t _combine_percent_ranges(percent_range_t a,
|
||||
static int _percent_run(struct dev_manager *dm, const char *name,
|
||||
const char *dlid,
|
||||
const char *target_type, int wait,
|
||||
struct logical_volume *lv, float *percent,
|
||||
const struct logical_volume *lv, float *percent,
|
||||
percent_range_t *overall_percent_range,
|
||||
uint32_t *event_nr)
|
||||
{
|
||||
@ -404,7 +404,7 @@ static int _percent_run(struct dev_manager *dm, const char *name,
|
||||
uint64_t start, length;
|
||||
char *type = NULL;
|
||||
char *params = NULL;
|
||||
struct dm_list *segh = &lv->segments;
|
||||
const struct dm_list *segh = &lv->segments;
|
||||
struct lv_segment *seg = NULL;
|
||||
struct segment_type *segtype;
|
||||
percent_range_t percent_range = 0, combined_percent_range = 0;
|
||||
@ -484,9 +484,15 @@ static int _percent_run(struct dev_manager *dm, const char *name,
|
||||
*overall_percent_range = combined_percent_range;
|
||||
} else {
|
||||
*percent = 100;
|
||||
if (first_time)
|
||||
if (first_time) {
|
||||
/* above ->target_percent() was not executed! */
|
||||
/* FIXME why return PERCENT_100 et. al. in this case? */
|
||||
*overall_percent_range = PERCENT_100;
|
||||
else
|
||||
if (lv && lv_is_merging_origin(lv)) {
|
||||
/* must fail in snapshot-merge case */
|
||||
goto_out;
|
||||
}
|
||||
} else
|
||||
*overall_percent_range = combined_percent_range;
|
||||
}
|
||||
|
||||
@ -500,7 +506,7 @@ static int _percent_run(struct dev_manager *dm, const char *name,
|
||||
|
||||
static int _percent(struct dev_manager *dm, const char *name, const char *dlid,
|
||||
const char *target_type, int wait,
|
||||
struct logical_volume *lv, float *percent,
|
||||
const struct logical_volume *lv, float *percent,
|
||||
percent_range_t *overall_percent_range, uint32_t *event_nr)
|
||||
{
|
||||
if (dlid && *dlid) {
|
||||
@ -587,7 +593,7 @@ int dev_manager_snapshot_percent(struct dev_manager *dm,
|
||||
* Try and get some info on this device.
|
||||
*/
|
||||
log_debug("Getting device status percentage for %s", name);
|
||||
if (!(_percent(dm, name, dlid, "snapshot", 0, NULL, percent,
|
||||
if (!(_percent(dm, name, dlid, "snapshot", 0, lv, percent,
|
||||
percent_range, NULL)))
|
||||
return_0;
|
||||
|
||||
@ -600,7 +606,7 @@ int dev_manager_snapshot_percent(struct dev_manager *dm,
|
||||
/* FIXME Merge with snapshot_percent, auto-detecting target type */
|
||||
/* FIXME Cope with more than one target */
|
||||
int dev_manager_mirror_percent(struct dev_manager *dm,
|
||||
struct logical_volume *lv, int wait,
|
||||
const struct logical_volume *lv, int wait,
|
||||
float *percent, percent_range_t *percent_range,
|
||||
uint32_t *event_nr)
|
||||
{
|
||||
|
@ -49,7 +49,7 @@ int dev_manager_snapshot_percent(struct dev_manager *dm,
|
||||
float *percent,
|
||||
percent_range_t *percent_range);
|
||||
int dev_manager_mirror_percent(struct dev_manager *dm,
|
||||
struct logical_volume *lv, int wait,
|
||||
const struct logical_volume *lv, int wait,
|
||||
float *percent, percent_range_t *percent_range,
|
||||
uint32_t *event_nr);
|
||||
int dev_manager_suspend(struct dev_manager *dm, struct logical_volume *lv,
|
||||
|
@ -402,7 +402,7 @@ static progress_t _poll_merge_progress(struct cmd_context *cmd,
|
||||
percent_range_t percent_range;
|
||||
|
||||
if (!lv_snapshot_percent(lv, &percent, &percent_range)) {
|
||||
log_error("%s: Failed query for merging percentage", lv->name);
|
||||
log_error("%s: Failed query for merging percentage. Aborting merge.", lv->name);
|
||||
return PROGRESS_CHECK_FAILED;
|
||||
} else if (percent_range == PERCENT_INVALID) {
|
||||
log_error("%s: Merging snapshot invalidated. Aborting merge.", lv->name);
|
||||
|
Loading…
x
Reference in New Issue
Block a user