Module Name: src Committed By: dyoung Date: Wed Jan 20 18:55:17 UTC 2010
Modified Files: src/sys/dev: cgd.c Log Message: Get out of cgd_detach() early on error. Do not call disk_destroy(9) on error, that leaves the cgd_softc in an inconsistent state. Fixes a crash during shutdown reported by Patrick Welche. Thanks to Patrick for reporting and for testing the fix. To generate a diff of this commit: cvs rdiff -u -r1.66 -r1.67 src/sys/dev/cgd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/cgd.c diff -u src/sys/dev/cgd.c:1.66 src/sys/dev/cgd.c:1.67 --- src/sys/dev/cgd.c:1.66 Tue Jan 12 23:49:34 2010 +++ src/sys/dev/cgd.c Wed Jan 20 18:55:17 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: cgd.c,v 1.66 2010/01/12 23:49:34 dyoung Exp $ */ +/* $NetBSD: cgd.c,v 1.67 2010/01/20 18:55:17 dyoung Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.66 2010/01/12 23:49:34 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.67 2010/01/20 18:55:17 dyoung Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -193,23 +193,21 @@ static int cgd_detach(device_t self, int flags) { - int ret = 0; - int pmask = 1 << RAW_PART; + int ret; + const int pmask = 1 << RAW_PART; struct cgd_softc *sc = device_private(self); - struct dk_softc *dksc; + struct dk_softc *dksc = &sc->sc_dksc; - dksc = &sc->sc_dksc; - if ((dksc->sc_flags & DKF_INITED) != 0) - { - if (DK_BUSY(&sc->sc_dksc, pmask)) - ret = EBUSY; - else - ret = cgd_ioctl_clr(sc, curlwp); - } + if (DK_BUSY(dksc, pmask)) + return EBUSY; - disk_destroy(&sc->sc_dksc.sc_dkdev); + if ((dksc->sc_flags & DKF_INITED) != 0 && + (ret = cgd_ioctl_clr(sc, curlwp)) != 0) + return ret; - return ret; + disk_destroy(&dksc->sc_dkdev); + + return 0; } void