Date: Mon, 11 Dec 2006 13:10:11 GMT From: Iasen Kostov <ikostov@otel.net> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/104777: [kernel] [patch] Driver not unset properly after kldunload Message-ID: <200612111310.kBBDABlU037783@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/104777; it has been noted by GNATS.
From: Iasen Kostov <ikostov@otel.net>
To: bug-followup@FreeBSD.org, tbyte@otel.net
Cc:
Subject: Re: kern/104777: [kernel] [patch] Driver not unset properly after
kldunload
Date: Mon, 11 Dec 2006 15:07:19 +0200
--=-1Fy3i/CbiP2cB5LqrocQ
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Forgive me for being so lazy :). I've analized the problem as I
should
have done the first time and I hope I found the solution. First time I
was missleaded by sys/dev/pci/pci_user.c and the way it sets pd_name[]
in pci_devinfo struct (You actualy need to use pciconf atleast once
after loading the driver) ... It's only set when you use PCIOCGETCONF
ioctl on /dev/pci and it only sets it once (which is not very clever)
and never unset it. But one can unload the current driver and load
another (as in if_nfe, if_nve case) or just unload the driver and
pd_name[] will always show the first driver attached on that device.
So I hope this new patch is better one.
--=-1Fy3i/CbiP2cB5LqrocQ
Content-Disposition: attachment; filename=pci_user.c.diff
Content-Type: text/x-patch; name=pci_user.c.diff; charset=UTF-8
Content-Transfer-Encoding: 7bit
--- sys/dev/pci/pci_user.c.old Thu Dec 7 02:26:12 2006
+++ sys/dev/pci/pci_user.c Thu Dec 7 02:52:23 2006
@@ -303,14 +303,18 @@
/* Populate pd_name and pd_unit */
name = NULL;
- if (dinfo->cfg.dev && dinfo->conf.pd_name[0] == '\0')
+ if (dinfo->cfg.dev) {
name = device_get_name(dinfo->cfg.dev);
- if (name) {
- strncpy(dinfo->conf.pd_name, name,
- sizeof(dinfo->conf.pd_name));
- dinfo->conf.pd_name[PCI_MAXNAMELEN] = 0;
- dinfo->conf.pd_unit =
- device_get_unit(dinfo->cfg.dev);
+ if (name) {
+ strncpy(dinfo->conf.pd_name, name,
+ sizeof(dinfo->conf.pd_name));
+ dinfo->conf.pd_name[PCI_MAXNAMELEN] = 0;
+ dinfo->conf.pd_unit =
+ device_get_unit(dinfo->cfg.dev);
+ } else {
+ dinfo->conf.pd_name[0] = '\0';
+ dinfo->conf.pd_unit = 0;
+ }
}
if ((pattern_buf == NULL) ||
--=-1Fy3i/CbiP2cB5LqrocQ--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200612111310.kBBDABlU037783>
