Module Name:    src
Committed By:   pooka
Date:           Fri Dec 17 13:24:45 UTC 2010

Modified Files:
        src/sys/netsmb: smb_dev.c

Log Message:
Try to unbreak module a little.  It would be really nice to not
utterly break things in the name of modularization, especially if
avoiding breakage takes 2min.


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/netsmb/smb_dev.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/netsmb/smb_dev.c
diff -u src/sys/netsmb/smb_dev.c:1.37 src/sys/netsmb/smb_dev.c:1.38
--- src/sys/netsmb/smb_dev.c:1.37	Fri Dec 17 13:05:29 2010
+++ src/sys/netsmb/smb_dev.c	Fri Dec 17 13:24:45 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: smb_dev.c,v 1.37 2010/12/17 13:05:29 pooka Exp $	*/
+/*	$NetBSD: smb_dev.c,v 1.38 2010/12/17 13:24:45 pooka Exp $	*/
 
 /*
  * Copyright (c) 2000-2001 Boris Popov
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smb_dev.c,v 1.37 2010/12/17 13:05:29 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smb_dev.c,v 1.38 2010/12/17 13:24:45 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -90,11 +90,16 @@
 
 
 void nsmbattach(int);
+static bool nsmb_inited = false;
 
 void
 nsmbattach(int num)
 {
 
+	if (nsmb_inited)
+		return;
+	nsmb_inited = true;
+
 	if (num <= 0) {
 #ifdef DIAGNOSTIC
 		panic("nsmbattach: count <= 0");
@@ -124,6 +129,17 @@
 	smb_rqpool_init();
 }
 
+static void
+nsmbdetach(void)
+{
+
+	smb_iod_done();
+	smb_sm_done();
+	smb_rqpool_fini();
+	free(smb_devtbl, M_NSMBDEV);
+	nsmb_inited = false;
+}
+
 int
 nsmb_dev_open(dev_t dev, int oflags, int devtype,
     struct lwp *l)
@@ -358,24 +374,25 @@
 		nsmbattach(1);
 		error =
 		    devsw_attach("nsmb", NULL, &bmajor, &nsmb_cdevsw, &cmajor);
-		if (error)
-			return error;
+		if (error == EEXIST) /* builtin */
+			error = 0;
+		if (error) {
+			nsmbdetach();
+		}
 
 		break;
 	    case MODULE_CMD_FINI:
-		smb_iod_done();
-		smb_sm_done();
-		smb_rqpool_fini();
 		error = devsw_detach(NULL, &nsmb_cdevsw);
-		free(smb_devtbl, M_NSMBDEV);
+		if (error)
+			break;
+		nsmbdetach();
 		break;
 	    default:
 		error = ENOTTY;
 		break;
 	}
-	return error;
-	return 0;
 
+	return error;
 }
 #endif /* _MODULE */
 

Reply via email to