From owner-freebsd-current@FreeBSD.ORG Sat Jan 21 07:07:10 2006 Return-Path: X-Original-To: freebsd-current@freebsd.org Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3E12C16A41F for ; Sat, 21 Jan 2006 07:07:10 +0000 (GMT) (envelope-from PeterJeremy@optushome.com.au) Received: from mail03.syd.optusnet.com.au (mail03.syd.optusnet.com.au [211.29.132.184]) by mx1.FreeBSD.org (Postfix) with ESMTP id 92AC843D45 for ; Sat, 21 Jan 2006 07:07:09 +0000 (GMT) (envelope-from PeterJeremy@optushome.com.au) Received: from cirb503493.alcatel.com.au (c220-239-19-236.belrs4.nsw.optusnet.com.au [220.239.19.236]) by mail03.syd.optusnet.com.au (8.12.11/8.12.11) with ESMTP id k0L777s3002927 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Sat, 21 Jan 2006 18:07:07 +1100 Received: from cirb503493.alcatel.com.au (localhost.alcatel.com.au [127.0.0.1]) by cirb503493.alcatel.com.au (8.12.10/8.12.10) with ESMTP id k0L777Hh032493 for ; Sat, 21 Jan 2006 18:07:07 +1100 (EST) (envelope-from pjeremy@cirb503493.alcatel.com.au) Received: (from pjeremy@localhost) by cirb503493.alcatel.com.au (8.12.10/8.12.9/Submit) id k0L776E1032492 for freebsd-current@freebsd.org; Sat, 21 Jan 2006 18:07:06 +1100 (EST) (envelope-from pjeremy) Date: Sat, 21 Jan 2006 18:07:06 +1100 From: Peter Jeremy To: freebsd-current@freebsd.org Message-ID: <20060121070706.GA32444@cirb503493.alcatel.com.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-PGP-Key: http://members.optusnet.com.au/peterjeremy/pubkey.asc User-Agent: Mutt/1.5.11 Subject: Panic due to deleting devices twice X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Jan 2006 07:07:10 -0000 When deleting a device (using device_delete_child()), all its child devices are recursively deleted and then device_detach() is called. In the case of iicsmb, this causes a panic because iicsmb_detach() also calls device_delete_child() on the smbus child it has cached in its softc. By this time that child has been destroyed. Looking at device_detach(), it appears that the solution is to create a bus_child_detached method to inform the parent that a child is being destroyed so it can invalidate cached pointers to that child. In practice, there are only 5 bus_child_detached methods (isa, ed, pccard, cbb and usb), though there are far more device types attached as children. Looking at the iicsmb code, it appears that iicbb and iicsmb both cache and explicitly delete child devices and therefore both need bus_child_detached methods. Is this correct? Is there a simpler alternative? -- Peter Jeremy