Module Name: src Committed By: jdolecek Date: Sun Feb 10 19:23:55 UTC 2019
Modified Files: src/sys/dev/usb: umass.c umass_isdata.c umass_scsipi.c umass_scsipi.h Log Message: move the deallocation of the protocol-specific softc into its own detach hook, so that calls to kmem_alloc() and kmem_free() would agree on the size fixes panic on umass detach reported by Tom Ivar Helbekkmo on current-users@ To generate a diff of this commit: cvs rdiff -u -r1.173 -r1.174 src/sys/dev/usb/umass.c cvs rdiff -u -r1.41 -r1.42 src/sys/dev/usb/umass_isdata.c cvs rdiff -u -r1.59 -r1.60 src/sys/dev/usb/umass_scsipi.c cvs rdiff -u -r1.3 -r1.4 src/sys/dev/usb/umass_scsipi.h 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/usb/umass.c diff -u src/sys/dev/usb/umass.c:1.173 src/sys/dev/usb/umass.c:1.174 --- src/sys/dev/usb/umass.c:1.173 Thu Feb 7 13:48:27 2019 +++ src/sys/dev/usb/umass.c Sun Feb 10 19:23:55 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: umass.c,v 1.173 2019/02/07 13:48:27 skrll Exp $ */ +/* $NetBSD: umass.c,v 1.174 2019/02/10 19:23:55 jdolecek Exp $ */ /* * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -124,7 +124,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.173 2019/02/07 13:48:27 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.174 2019/02/10 19:23:55 jdolecek Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -828,6 +828,24 @@ umass_detach(device_t self, int flags) rv = config_detach(scbus->sc_child, flags); switch (sc->sc_cmd) { + case UMASS_CPROTO_RBC: + case UMASS_CPROTO_SCSI: +#if NSCSIBUS > 0 + umass_scsi_detach(sc); +#else + aprint_error_dev(self, "scsibus not configured\n"); +#endif + break; + + case UMASS_CPROTO_UFI: + case UMASS_CPROTO_ATAPI: +#if NATAPIBUS > 0 + umass_atapi_detach(sc); +#else + aprint_error_dev(self, "atapibus not configured\n"); +#endif + break; + case UMASS_CPROTO_ISD_ATA: #if NWD > 0 umass_isdata_detach(sc); @@ -841,8 +859,8 @@ umass_detach(device_t self, int flags) break; } - kmem_free(scbus, sizeof(*scbus)); - sc->bus = NULL; + /* protocol detach is expected to free sc->bus */ + KASSERT(sc->bus == NULL); } if (rv != 0) Index: src/sys/dev/usb/umass_isdata.c diff -u src/sys/dev/usb/umass_isdata.c:1.41 src/sys/dev/usb/umass_isdata.c:1.42 --- src/sys/dev/usb/umass_isdata.c:1.41 Thu Feb 7 13:48:27 2019 +++ src/sys/dev/usb/umass_isdata.c Sun Feb 10 19:23:55 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: umass_isdata.c,v 1.41 2019/02/07 13:48:27 skrll Exp $ */ +/* $NetBSD: umass_isdata.c,v 1.42 2019/02/10 19:23:55 jdolecek Exp $ */ /* * TODO: @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: umass_isdata.c,v 1.41 2019/02/07 13:48:27 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: umass_isdata.c,v 1.42 2019/02/10 19:23:55 jdolecek Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -244,6 +244,9 @@ umass_isdata_detach(struct umass_softc * struct uisdata_softc *scbus = (struct uisdata_softc *)sc->bus; ata_channel_destroy(&scbus->sc_channel); + + kmem_free(scbus, sizeof(*scbus)); + sc->bus = NULL; } void Index: src/sys/dev/usb/umass_scsipi.c diff -u src/sys/dev/usb/umass_scsipi.c:1.59 src/sys/dev/usb/umass_scsipi.c:1.60 --- src/sys/dev/usb/umass_scsipi.c:1.59 Thu Feb 7 13:48:27 2019 +++ src/sys/dev/usb/umass_scsipi.c Sun Feb 10 19:23:55 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: umass_scsipi.c,v 1.59 2019/02/07 13:48:27 skrll Exp $ */ +/* $NetBSD: umass_scsipi.c,v 1.60 2019/02/10 19:23:55 jdolecek Exp $ */ /* * Copyright (c) 2001, 2003, 2012 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: umass_scsipi.c,v 1.59 2019/02/07 13:48:27 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: umass_scsipi.c,v 1.60 2019/02/10 19:23:55 jdolecek Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -151,6 +151,15 @@ umass_scsi_attach(struct umass_softc *sc return 0; } + +void +umass_scsi_detach(struct umass_softc *sc) +{ + struct umass_scsipi_softc *scbus = (struct umass_scsipi_softc *)sc->bus; + + kmem_free(scbus, sizeof(*scbus)); + sc->bus = NULL; +} #endif #if NATAPIBUS > 0 @@ -183,6 +192,15 @@ umass_atapi_attach(struct umass_softc *s return 0; } + +void +umass_atapi_detach(struct umass_softc *sc) +{ + struct umass_scsipi_softc *scbus = (struct umass_scsipi_softc *)sc->bus; + + kmem_free(scbus, sizeof(*scbus)); + sc->bus = NULL; +} #endif Static struct umass_scsipi_softc * Index: src/sys/dev/usb/umass_scsipi.h diff -u src/sys/dev/usb/umass_scsipi.h:1.3 src/sys/dev/usb/umass_scsipi.h:1.4 --- src/sys/dev/usb/umass_scsipi.h:1.3 Sat Apr 23 10:15:32 2016 +++ src/sys/dev/usb/umass_scsipi.h Sun Feb 10 19:23:55 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: umass_scsipi.h,v 1.3 2016/04/23 10:15:32 skrll Exp $ */ +/* $NetBSD: umass_scsipi.h,v 1.4 2019/02/10 19:23:55 jdolecek Exp $ */ /* * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -31,4 +31,7 @@ */ int umass_scsi_attach(struct umass_softc *); +void umass_scsi_detach(struct umass_softc *); + int umass_atapi_attach(struct umass_softc *); +void umass_atapi_detach(struct umass_softc *);