1
0
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:
Mike Snitzer 2010-01-15 22:58:25 +00:00
parent 7fef83d687
commit 6c1c02dc52
3 changed files with 15 additions and 9 deletions

View File

@ -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)
{

View File

@ -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,

View File

@ -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);