[linux-lvm] Problem with 2.5.x DM + LVM1 metadata

Christophe Saout christophe at saout.de
Thu Jun 12 08:11:01 UTC 2003


Hi!

> I'm running a machine since quite some time with DM-patches 2.4.x and
> LVM1 metadata PVs/VGs/LVs. It's a Debian box with lvm2-1.95.15 intalled.
> 
> Today, I tried to boot this machine with 2.5.70-bk16. Everything went
> well (most of my machines run 2.5.x since some time, so I'm used to the
> gotchas like modutils<-> module-init-tools etc.), but the 2.5.x DM seems
> so cause problems. During "vgchange -a y" (called by init scripts), one
> of my LVs cannot be activated. Here's the transcript of "/etc/init.d/lvm2
> start" (which basically only consists of the vgchange call):
> ---------------------------------------------------------------------
> Initializing LVM:   /dev/hdc2: open failed: No such device or address
> [...]
>  device-mapper ioctl cmd 2 failed: No such device or address

A cleanup patch somewhere in the -bk kernels introduced a problem.
Either go back to an older kernel or fix it.

Joe Thornber posted a repair fix for this yesterday on the lkml list:

From:	Joe Thornber <thornber at sistina.com>
To:	Linus Torvalds <torvalds at transmeta.com>, Linux Mailing List
<linux-kernel at vger.kernel.org>
Subject: [PATCH 1/1] dm: Repair persistent minors

Split the dm_create() function into two variants, depending on whether
you want the device to have a specific minor number.  This avoids
the broken overloading of the minor argument to the old dm_create().

--- diff/drivers/md/dm-ioctl.c	2003-06-11 10:31:17.000000000 +0100
+++ source/drivers/md/dm-ioctl.c	2003-06-11 10:32:11.000000000 +0100
@@ -560,7 +560,6 @@
 	int r;
 	struct dm_table *t;
 	struct mapped_device *md;
-	unsigned int minor = 0;
 
 	r = check_name(param->name);
 	if (r)
@@ -577,9 +576,10 @@
 	}
 
 	if (param->flags & DM_PERSISTENT_DEV_FLAG)
-		minor = minor(to_kdev_t(param->dev));
+		r = dm_create_with_minor(minor(to_kdev_t(param->dev)), t, &md);
+	else
+		r = dm_create(t, &md);
 
-	r = dm_create(minor, t, &md);
 	if (r) {
 		dm_table_put(t);
 		return r;
--- diff/drivers/md/dm.c	2003-06-11 10:31:41.000000000 +0100
+++ source/drivers/md/dm.c	2003-06-11 10:32:54.000000000 +0100
@@ -569,7 +569,7 @@
 /*
  * Allocate and initialise a blank device with a given minor.
  */
-static struct mapped_device *alloc_dev(unsigned int minor)
+static struct mapped_device *alloc_dev(unsigned int minor, int
persistent)
 {
 	int r;
 	struct mapped_device *md = kmalloc(sizeof(*md), GFP_KERNEL);
@@ -580,7 +580,7 @@
 	}
 
 	/* get a minor number for the dev */
-	r = (minor < 0) ? next_free_minor(&minor) : specific_minor(minor);
+	r = persistent ? specific_minor(minor) : next_free_minor(&minor);
 	if (r < 0) {
 		kfree(md);
 		return NULL;
@@ -660,13 +660,13 @@
 /*
  * Constructor for a new device.
  */
-int dm_create(unsigned int minor, struct dm_table *table,
-	      struct mapped_device **result)
+static int create_aux(unsigned int minor, int persistent,
+		      struct dm_table *table, struct mapped_device **result)
 {
 	int r;
 	struct mapped_device *md;
 
-	md = alloc_dev(minor);
+	md = alloc_dev(minor, persistent);
 	if (!md)
 		return -ENXIO;
 
@@ -681,6 +681,17 @@
 	return 0;
 }
 
+int dm_create(struct dm_table *table, struct mapped_device **result)
+{
+	return create_aux(0, 0, table, result);
+}
+
+int dm_create_with_minor(unsigned int minor,
+			 struct dm_table *table, struct mapped_device **result)
+{
+	return create_aux(minor, 1, table, result);
+}
+
 void dm_get(struct mapped_device *md)
 {
 	atomic_inc(&md->holders);
--- diff/drivers/md/dm.h	2003-06-11 10:31:27.000000000 +0100
+++ source/drivers/md/dm.h	2003-06-11 10:32:11.000000000 +0100
@@ -51,8 +51,9 @@
  * Functions for manipulating a struct mapped_device.
  * Drop the reference with dm_put when you finish with the object.
  *---------------------------------------------------------------*/
-int dm_create(unsigned int minor, struct dm_table *table,
-	      struct mapped_device **md);
+int dm_create(struct dm_table *table, struct mapped_device **md);
+int dm_create_with_minor(unsigned int minor, struct dm_table *table,
+			 struct mapped_device **md);
 
 /*
  * Reference counting for md.

-- 
Christophe Saout <christophe at saout.de>





More information about the linux-lvm mailing list