Module Name:    src
Committed By:   jakllsch
Date:           Thu Feb 25 20:48:59 UTC 2010

Modified Files:
        src/sys/dev/dm: device-mapper.c dm_ioctl.c

Log Message:
Be sure to config_cfattach_attach() in dmattach().
Loosely based on patch from Brian Brombacher,
with other inspriation from vnd(4).

This should fix PR kern/42799.

While here, a few prototype, style and namespace pollution-related changes.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/dm/device-mapper.c
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/dm/dm_ioctl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/dm/device-mapper.c
diff -u src/sys/dev/dm/device-mapper.c:1.15 src/sys/dev/dm/device-mapper.c:1.16
--- src/sys/dev/dm/device-mapper.c:1.15	Fri Jan  8 00:27:48 2010
+++ src/sys/dev/dm/device-mapper.c	Thu Feb 25 20:48:58 2010
@@ -1,4 +1,4 @@
-/*        $NetBSD: device-mapper.c,v 1.15 2010/01/08 00:27:48 pooka Exp $ */
+/*        $NetBSD: device-mapper.c,v 1.16 2010/02/25 20:48:58 jakllsch Exp $ */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -59,9 +59,10 @@
 static dev_type_size(dmsize);
 
 /* attach and detach routines */
-int dmattach(void);
-int dmdestroy(void);
+void dmattach(int);
+void dmdestroy(void);
 
+static void dm_init(void);
 static int dm_cmd_to_fun(prop_dictionary_t);
 static int disk_ioctl_switch(dev_t, u_long, void *);
 static int dm_ioctl_switch(u_long);
@@ -112,7 +113,7 @@
 
 extern struct cfdriver dm_cd;
 
-extern uint64_t dev_counter;
+extern uint64_t dm_dev_counter;
 
 /*
  * This array is used to translate cmd to function pointer.
@@ -149,15 +150,15 @@
 dm_modcmd(modcmd_t cmd, void *arg)
 {
 #ifdef _MODULE
-	int bmajor = -1, cmajor = -1;
 	int error;
+	int bmajor, cmajor;
 
 	error = 0;
+	bmajor = -1;
+	cmajor = -1;
 
 	switch (cmd) {
 	case MODULE_CMD_INIT:
-		dmattach();
-
 		error = config_cfdriver_attach(&dm_cd);
 		if (error)
 			break;
@@ -165,13 +166,21 @@
 		error = config_cfattach_attach(dm_cd.cd_name, &dm_ca);
 		if (error) {
 			config_cfdriver_detach(&dm_cd);
-			aprint_error("Unable to register cfattach for dm driver\n");
-
+			aprint_error("%s: unable to register cfattach\n",
+			    dm_cd.cd_name);
 			break;
 		}
 
-		error =  devsw_attach("dm", &dm_bdevsw, &bmajor,
+		error = devsw_attach(dm_cd.cd_name, &dm_bdevsw, &bmajor,
 		    &dm_cdevsw, &cmajor);
+		if (error) {
+			config_cfattach_detach(dm_cd.cd_name, &dm_ca);
+			config_cfdriver_detach(&dm_cd);
+			break;
+		}
+
+		dm_init();
+
 		break;
 
 	case MODULE_CMD_FINI:
@@ -181,7 +190,7 @@
 		 * to disable auto-unload only if there is mounted dm device
 		 * present.
 		 */ 
-		if (dev_counter > 0)
+		if (dm_dev_counter > 0)
 			return EBUSY;
 		dmdestroy();
 
@@ -270,25 +279,29 @@
 	(void)dm_dev_free(dmv);
 
 	/* Decrement device counter After removing device */
-	atomic_dec_64(&dev_counter);
+	atomic_dec_64(&dm_dev_counter);
 
 	return 0;
 }
 
 /* attach routine */
-int
-dmattach(void)
+void
+dmattach(int num)
 {
+	int error;
 
-	dm_target_init();
-	dm_dev_init();
-	dm_pdev_init();
+	error = config_cfattach_attach(dm_cd.cd_name, &dm_ca);
+	if (error) {
+		aprint_error("%s: unable to register cfattach\n",
+		    dm_cd.cd_name);
+		return;
+	}
 
-	return 0;
+	dm_init();
 }
 
 /* Destroy routine */
-int
+void
 dmdestroy(void)
 {
 
@@ -296,7 +309,6 @@
 	dm_pdev_destroy();
 	dm_target_destroy();
 
-	return 0;
 }
 
 static int
@@ -354,6 +366,14 @@
 	return r;
 }
 
+static void
+dm_init(void)
+{
+	dm_target_init();
+	dm_dev_init();
+	dm_pdev_init();
+}
+
 /*
  * Translate command sent from libdevmapper to func.
  */

Index: src/sys/dev/dm/dm_ioctl.c
diff -u src/sys/dev/dm/dm_ioctl.c:1.20 src/sys/dev/dm/dm_ioctl.c:1.21
--- src/sys/dev/dm/dm_ioctl.c:1.20	Mon Jan  4 00:19:08 2010
+++ src/sys/dev/dm/dm_ioctl.c	Thu Feb 25 20:48:58 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: dm_ioctl.c,v 1.20 2010/01/04 00:19:08 haad Exp $      */
+/* $NetBSD: dm_ioctl.c,v 1.21 2010/02/25 20:48:58 jakllsch Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -95,7 +95,7 @@
 
 static uint64_t sc_minor_num;
 extern const struct dkdriver dmdkdriver;
-uint64_t dev_counter;
+uint64_t dm_dev_counter;
 
 /* Generic cf_data for device-mapper driver */
 static struct cfdata dm_cfdata = {
@@ -266,7 +266,7 @@
 	DM_REMOVE_FLAG(flags, DM_INACTIVE_PRESENT_FLAG);
 
 	/* Increment device counter After creating device */
-	atomic_inc_64(&dev_counter);
+	atomic_inc_64(&dm_dev_counter);
 
 	return r;
 }

Reply via email to