summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-07-13 19:36:59 +0000
committerphk <phk@FreeBSD.org>2004-07-13 19:36:59 +0000
commitb0e68741889ab66096103a2dec2219bbde3c21c6 (patch)
treed2eb15e6477b3d5e7e1f7c49c1e2eed3b85ec318 /sbin
parent7b891087ed78b2c7943c2503f0bfdd7678a6d65c (diff)
downloadFreeBSD-src-b0e68741889ab66096103a2dec2219bbde3c21c6.zip
FreeBSD-src-b0e68741889ab66096103a2dec2219bbde3c21c6.tar.gz
Give kldunload a -f(orce) argument.
Add a MOD_QUIESCE event for modules. This should return error (EBUSY) of the module is in use. MOD_UNLOAD should now only fail if it is impossible (as opposed to inconvenient) to unload the module. Valid reasons are memory references into the module which cannot be tracked down and eliminated. When kldunloading, we abandon if MOD_UNLOAD fails, and if -force is not given, MOD_QUIESCE failing will also prevent the unload. For backwards compatibility, we treat EOPNOTSUPP from MOD_QUIESCE as success. Document that modules should return EOPNOTSUPP for unknown events.
Diffstat (limited to 'sbin')
-rw-r--r--sbin/kldunload/kldunload.87
-rw-r--r--sbin/kldunload/kldunload.c8
2 files changed, 13 insertions, 2 deletions
diff --git a/sbin/kldunload/kldunload.8 b/sbin/kldunload/kldunload.8
index f749656..935e5af 100644
--- a/sbin/kldunload/kldunload.8
+++ b/sbin/kldunload/kldunload.8
@@ -33,9 +33,11 @@
.Nd unload a file from the kernel
.Sh SYNOPSIS
.Nm
+.Op Fl f
.Op Fl v
.Fl i Ar id
.Nm
+.Op Fl f
.Op Fl v
.Op Fl n
.Ar name
@@ -47,6 +49,11 @@ utility unloads a file which was previously loaded with
.Pp
The following options are available:
.Bl -tag -width indentXX
+.It Fl f
+Force the unload.
+This ignores error returns to MOD_QUISCE from the module and implies
+that the module should be unloaded even if it is currently in use.
+The users are left to cope as best they can.
.It Fl v
Be more verbose.
.It Fl i Ar id
diff --git a/sbin/kldunload/kldunload.c b/sbin/kldunload/kldunload.c
index be86960..29da28d 100644
--- a/sbin/kldunload/kldunload.c
+++ b/sbin/kldunload/kldunload.c
@@ -48,10 +48,14 @@ main(int argc, char** argv)
int c;
int verbose = 0;
int fileid = 0;
+ int force = LINKER_UNLOAD_NORMAL;
char* filename = NULL;
- while ((c = getopt(argc, argv, "i:n:v")) != -1)
+ while ((c = getopt(argc, argv, "fi:n:v")) != -1)
switch (c) {
+ case 'f':
+ force = LINKER_UNLOAD_FORCE;
+ break;
case 'i':
fileid = atoi(optarg);
if (!fileid)
@@ -93,7 +97,7 @@ main(int argc, char** argv)
printf("Unloading %s, id=%d\n", stat.name, fileid);
}
- if (kldunload(fileid) < 0)
+ if (kldunloadf(fileid, force) < 0)
err(1, "can't unload file");
return 0;
OpenPOWER on IntegriCloud