kern/104777: [kernel] [patch] Driver not unset properly after kldunload

Iasen Kostov ikostov at otel.net
Mon Dec 11 05:10:13 PST 2006


The following reply was made to PR kern/104777; it has been noted by GNATS.

From: Iasen Kostov <ikostov at otel.net>
To: bug-followup at FreeBSD.org, tbyte at 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--
 


More information about the freebsd-bugs mailing list