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 */