Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Mar 1999 03:00:04 -0800 (PST)
From:      Doug Rabson <dfr@nlsystems.com>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/10653: cdevsw_module_handler MOD_UNLOAD problem
Message-ID:  <199903191100.DAA07188@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/10653; it has been noted by GNATS.

From: Doug Rabson <dfr@nlsystems.com>
To: M.Indlekofer@fz-juelich.de
Cc: freebsd-gnats-submit@freebsd.org
Subject: Re: kern/10653: cdevsw_module_handler MOD_UNLOAD problem
Date: Fri, 19 Mar 1999 10:58:05 +0000 (GMT)

 On Thu, 18 Mar 1999 M.Indlekofer@fz-juelich.de wrote:
 
 > In my case: A program used a device and kldunload was called.
 > xxx_handler returned EBUSY and kldunload said: can't unload, device busy.
 > The next time the program issued a ioctl for the still open device
 > the system crashed in spec_ioctl (gdb -k ...) with an invalid
 > entry in the cdevsw for MYMAJOR: Fatal trap 12: page fault in kernel mode.
 > >How-To-Repeat:
 > see example above
 > >Fix:
 > /sys/kern/kern_conf.c:???devsw_module_handler should consult the
 > module handler (data->chainevh) FIRST in the case of MOD_UNLOAD
 > whether the module want's to unload before it "kills" the devsw!
 
 Could you test this patch:
 
 Index: kern_conf.c
 ===================================================================
 RCS file: /home/ncvs/src/sys/kern/kern_conf.c,v
 retrieving revision 1.30
 diff -u -r1.30 kern_conf.c
 --- kern_conf.c	1999/01/27 21:49:55	1.30
 +++ kern_conf.c	1999/03/19 10:22:40
 @@ -173,14 +173,18 @@
  
  	switch (what) {
  	case MOD_LOAD:
 -		if ((error = cdevsw_add(&data->dev, data->cdevsw, NULL)) != 0)
 -			return error;
 -		break;
 +		error = cdevsw_add(&data->dev, data->cdevsw, NULL);
 +		if (!error && data->chainevh)
 +			error = data->chainevh(mod, what, data->chainarg);
 +		return error;
  
  	case MOD_UNLOAD:
 -		if ((error = cdevsw_add(&data->dev, NULL, NULL)) != 0)
 -			return error;
 -		break;
 +		if (data->chainevh) {
 +			error = data->chainevh(mod, what, data->chainarg);
 +			if (error)
 +				return error;
 +		}
 +		return cdevsw_add(&data->dev, NULL, NULL);
  	}
  
  	if (data->chainevh)
 @@ -197,20 +201,23 @@
  
  	switch (what) {
  	case MOD_LOAD:
 -		if ((error = cdevsw_add(&data->cdev, data->cdevsw, NULL)) != 0)
 -			return error;
 -		if ((error = bdevsw_add(&data->bdev, data->cdevsw, NULL)) != 0) {
 -			cdevsw_add(&data->bdev, NULL, NULL);
 -			return error;
 -		}
 -		break;
 +		error = cdevsw_add(&data->cdev, data->cdevsw, NULL);
 +		if (!error)
 +			error = bdevsw_add(&data->bdev, data->cdevsw, NULL);
 +		if (!error && data->chainevh)
 +			error = data->chainevh(mod, what, data->chainarg);
 +		return error;
  
  	case MOD_UNLOAD:
 -		if ((error = bdevsw_add(&data->bdev, NULL, NULL)) != 0)
 -			return error;
 -		if ((error = cdevsw_add(&data->cdev, NULL, NULL)) != 0)
 -			return error;
 -		break;
 +		if (data->chainevh) {
 +			error = data->chainevh(mod, what, data->chainarg);
 +			if (error)
 +				return error;
 +		}
 +		error = bdevsw_add(&data->bdev, NULL, NULL);
 +		if (!error)
 +			error = cdevsw_add(&data->cdev, NULL, NULL);
 +		return error;
  	}
  
  	if (data->chainevh)
 
 --
 Doug Rabson				Mail:  dfr@nlsystems.com
 Nonlinear Systems Ltd.			Phone: +44 181 442 9037
 
 
 
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903191100.DAA07188>