[lvm-devel] [PATCH] lvconvert should not allow creating a snapshot of a mirror

Mikulas Patocka mpatocka at redhat.com
Wed Mar 26 18:34:22 UTC 2008


Hi

lvconvert allows creating snapshots of mirrors --- and it shouldn't.

lvconvert -s vg1/mirror vg1/snap
will create snapshot of a mirrored image. It should fail.

lvconvert -s vg1/lv vg1/mirror
writes "Logical volume mirror converted." and does nothing. It should 
return an error.

This patch fixes both scenarios.

Mikulas
-------------- next part --------------
This patch fixes bugs in lvconvert regarding mixing snapshots and mirrors.

Assume that you have two independent LVs: vg1/lv and vg1/lv_mirror.
vg1/lv is a simple linear storage, vg1/lv_mirror is a mirror.

1. lvconvert -s vg1/lv vg1/lv_mirror writes this output:
	vg1/lv_mirror: Converted: 100.0%
	Logical volume lv_mirror converted.
and it really does nothing. It should write an error message.

2. lvconvert -s vg1/lv_mirror vg1/lv creates a snapshot of a mirrored volume,
which is unsupported and may cause problems with other tools.
(lvcreate doesn't allow creating snapshots of mirrors)
lvconvert should fail with an error message in this situation.

Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>

---
 tools/lvconvert.c |   18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

Index: LVM2.2.02.33/tools/lvconvert.c
===================================================================
--- LVM2.2.02.33.orig/tools/lvconvert.c	2008-03-26 18:57:29.000000000 +0100
+++ LVM2.2.02.33/tools/lvconvert.c	2008-03-26 19:03:13.000000000 +0100
@@ -627,10 +627,12 @@ static int lvconvert_snapshot(struct cmd
 		return 0;
 	}
 
-	if (org->status & (LOCKED|PVMOVE) || lv_is_cow(org)) {
+	if (org->status & (LOCKED|PVMOVE|MIRRORED) || lv_is_cow(org)) {
 		log_error("Unable to create a snapshot of a %s LV.",
 			  org->status & LOCKED ? "locked" :
-			  org->status & PVMOVE ? "pvmove" : "snapshot");
+			  org->status & PVMOVE ? "pvmove" :
+			  org->status & MIRRORED ? "mirrored" :
+			  "snapshot");
 		return 0;
 	}
 
@@ -705,15 +707,19 @@ static int lvconvert_single(struct cmd_c
 		return ECMD_FAILED;
 	}
 
-	if (arg_count(cmd, mirrors_ARG) || (lv->status & MIRRORED)) {
+	if (lp->snapshot) {
+		if (lv->status & MIRRORED) {
+			log_error("Unable to convert mirrored LV \"%s\" into a snapshot.", lv->name);
+			return ECMD_FAILED;
+		}
 		if (!archive(lv->vg))
 			return ECMD_FAILED;
-		if (!lvconvert_mirrors(cmd, lv, lp))
+		if (!lvconvert_snapshot(cmd, lv, lp))
 			return ECMD_FAILED;
-	} else if (lp->snapshot) {
+	} else if (arg_count(cmd, mirrors_ARG) || (lv->status & MIRRORED)) {
 		if (!archive(lv->vg))
 			return ECMD_FAILED;
-		if (!lvconvert_snapshot(cmd, lv, lp))
+		if (!lvconvert_mirrors(cmd, lv, lp))
 			return ECMD_FAILED;
 	}
 


More information about the lvm-devel mailing list