[lvm-devel] LVM2 ./WHATS_NEW lib/metadata/lv_manip.c

agk at sourceware.org agk at sourceware.org
Fri Oct 17 10:57:16 UTC 2008


CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	agk at sourceware.org	2008-10-17 10:57:15

Modified files:
	.              : WHATS_NEW 
	lib/metadata   : lv_manip.c 

Log message:
	Use temp table to set device size when converting mirrors.
	
	(Avoids having same mirror table loaded twice concurrently by first
	using a 'zero' table to set the size of the device so when mirror
	table is preloaded it doesn't have to be activated immediately.)

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.976&r2=1.977
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/lv_manip.c.diff?cvsroot=lvm2&r1=1.156&r2=1.157

--- LVM2/WHATS_NEW	2008/10/17 10:50:14	1.976
+++ LVM2/WHATS_NEW	2008/10/17 10:57:14	1.977
@@ -1,5 +1,6 @@
 Version 2.02.41 -
 =====================================
+  Use temp table to set device size when converting mirrors.
   In resume_mirror_images replace activate_lv with resume_lv as workaround.
   Avoid overwriting in-use on-disk text metadata by forgetting MDA_HEADER_SIZE.
   Fix snapshot monitoring library to not cancel monitoring invalid snapshot.
--- LVM2/lib/metadata/lv_manip.c	2008/09/29 09:59:10	1.156
+++ LVM2/lib/metadata/lv_manip.c	2008/10/17 10:57:15	1.157
@@ -2360,11 +2360,7 @@
 	struct segment_type *segtype;
 	struct lv_segment *mapseg;
 
-	if (!(segtype = get_segtype_from_string(cmd, "striped")))
-		return_NULL;
-
 	/* create an empty layer LV */
-
 	len = strlen(lv_where->name) + 32;
 	if (!(name = alloca(len))) {
 		log_error("layer name allocation failed. "
@@ -2384,12 +2380,43 @@
 		return NULL;
 	}
 
+	if (strstr(name, "_mimagetmp")) {
+		log_very_verbose("Creating transient 'zero' LV"
+				 " for Mirror -> mirror up-convert.");
+
+		segtype = get_segtype_from_string(cmd, "zero");
+
+		if (!lv_add_virtual_segment(layer_lv, 0, lv_where->le_count, segtype)) {
+			log_error("Creation of intermediate layer LV failed.");
+			return NULL;
+		}
+
+		if (!vg_write(lv_where->vg)) {
+			log_error("Failed to write intermediate VG metadata");
+			return NULL;
+		}
+
+		if (!vg_commit(lv_where->vg)) {
+			log_error("Failed to commit intermediate VG metadata");
+			vg_revert(lv_where->vg);
+			return NULL;
+		}
+
+		if (!activate_lv(cmd, layer_lv)) {
+			log_error("Failed to resume intermediate 'zero' LV, %s", name);
+			return NULL;
+		}
+	}
+
 	log_very_verbose("Inserting layer %s for %s",
 			 layer_lv->name, lv_where->name);
 
 	if (!_move_lv_segments(layer_lv, lv_where, 0, 0))
 		return_NULL;
 
+	if (!(segtype = get_segtype_from_string(cmd, "striped")))
+		return_NULL;
+
 	/* allocate a new linear segment */
 	if (!(mapseg = alloc_lv_segment(cmd->mem, segtype,
 					lv_where, 0, layer_lv->le_count,




More information about the lvm-devel mailing list