[lvm-devel] LVM2 lib/activate/dev_manager.c lib/activate/d ...

snitzer at sourceware.org snitzer at sourceware.org
Fri Jan 15 22:58:25 UTC 2010


CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	snitzer at sourceware.org	2010-01-15 22:58:25

Modified files:
	lib/activate   : dev_manager.c dev_manager.h 
	tools          : lvconvert.c 

Log message:
	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."

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/activate/dev_manager.c.diff?cvsroot=lvm2&r1=1.174&r2=1.175
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/activate/dev_manager.h.diff?cvsroot=lvm2&r1=1.30&r2=1.31
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvconvert.c.diff?cvsroot=lvm2&r1=1.114&r2=1.115

--- LVM2/lib/activate/dev_manager.c	2010/01/15 16:35:26	1.174
+++ LVM2/lib/activate/dev_manager.c	2010/01/15 22:58:25	1.175
@@ -393,7 +393,7 @@
 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 @@
 	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 @@
 		*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(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 @@
 	 * 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 @@
 /* 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)
 {
--- LVM2/lib/activate/dev_manager.h	2009/10/01 00:35:29	1.30
+++ LVM2/lib/activate/dev_manager.h	2010/01/15 22:58:25	1.31
@@ -49,7 +49,7 @@
 				 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,
--- LVM2/tools/lvconvert.c	2010/01/13 01:55:44	1.114
+++ LVM2/tools/lvconvert.c	2010/01/15 22:58:25	1.115
@@ -402,7 +402,7 @@
 	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);




More information about the lvm-devel mailing list