From 70cc4fddbf822c50152f99b7ddac261cb93d9992 Mon Sep 17 00:00:00 2001 From: Martin Pieuchot Date: Wed, 16 Dec 2015 14:50:27 +0000 Subject: Refactor umass_detach() in order to pass a size to free(9). Based on a diff from Mathieu . --- sys/dev/usb/umass.c | 13 ++----------- sys/dev/usb/umass_scsi.c | 30 ++++++++++++++++++++++-------- sys/dev/usb/umass_scsi.h | 3 ++- sys/dev/usb/umassvar.h | 8 +++----- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/sys/dev/usb/umass.c b/sys/dev/usb/umass.c index 8afd1efc0d4..86fb691f5d2 100644 --- a/sys/dev/usb/umass.c +++ b/sys/dev/usb/umass.c @@ -1,4 +1,4 @@ -/* $OpenBSD: umass.c,v 1.70 2015/03/14 03:38:50 jsg Exp $ */ +/* $OpenBSD: umass.c,v 1.71 2015/12/16 14:50:26 mpi Exp $ */ /* $NetBSD: umass.c,v 1.116 2004/06/30 05:53:46 mycroft Exp $ */ /* @@ -129,7 +129,6 @@ #include #include #include -#include #include #include #undef KASSERT @@ -616,7 +615,6 @@ int umass_detach(struct device *self, int flags) { struct umass_softc *sc = (struct umass_softc *)self; - struct umassbus_softc *scbus; int rv = 0, i, s; DPRINTF(UDMASS_USB, ("%s: detached\n", sc->sc_dev.dv_xname)); @@ -647,14 +645,7 @@ umass_detach(struct device *self, int flags) } splx(s); - scbus = sc->bus; - if (scbus != NULL) { - if (scbus->sc_child != NULL) - rv = config_detach(scbus->sc_child, flags); - free(scbus, M_DEVBUF, 0); - sc->bus = NULL; - } - + rv = umass_scsi_detach(sc, flags); if (rv != 0) return (rv); diff --git a/sys/dev/usb/umass_scsi.c b/sys/dev/usb/umass_scsi.c index 7753cf72a2a..3c37d036afe 100644 --- a/sys/dev/usb/umass_scsi.c +++ b/sys/dev/usb/umass_scsi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: umass_scsi.c,v 1.42 2015/03/14 03:38:50 jsg Exp $ */ +/* $OpenBSD: umass_scsi.c,v 1.43 2015/12/16 14:50:26 mpi Exp $ */ /* $NetBSD: umass_scsipi.c,v 1.9 2003/02/16 23:14:08 augustss Exp $ */ /* * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -52,7 +52,7 @@ #include struct umass_scsi_softc { - struct umassbus_softc base; + struct device *sc_child; struct scsi_link sc_link; struct scsi_iopool sc_iopool; int sc_open; @@ -103,8 +103,7 @@ umass_scsi_attach(struct umass_softc *sc) sc->sc_dev.dv_xname, sc, scbus)); sc->sc_refcnt++; - scbus->base.sc_child = - config_found((struct device *)sc, &saa, scsiprint); + scbus->sc_child = config_found((struct device *)sc, &saa, scsiprint); if (--sc->sc_refcnt < 0) usb_detach_wakeup(&sc->sc_dev); @@ -131,8 +130,7 @@ umass_atapi_attach(struct umass_softc *sc) sc->sc_dev.dv_xname, sc, scbus)); sc->sc_refcnt++; - scbus->base.sc_child = config_found((struct device *)sc, - &saa, scsiprint); + scbus->sc_child = config_found((struct device *)sc, &saa, scsiprint); if (--sc->sc_refcnt < 0) usb_detach_wakeup(&sc->sc_dev); @@ -146,7 +144,7 @@ umass_scsi_setup(struct umass_softc *sc) scbus = malloc(sizeof(*scbus), M_DEVBUF, M_WAITOK | M_ZERO); - sc->bus = (struct umassbus_softc *)scbus; + sc->bus = scbus; scsi_iopool_init(&scbus->sc_iopool, scbus, umass_io_get, umass_io_put); @@ -161,6 +159,22 @@ umass_scsi_setup(struct umass_softc *sc) return (scbus); } +int +umass_scsi_detach(struct umass_softc *sc, int flags) +{ + struct umass_scsi_softc *scbus = sc->bus; + int rv = 0; + + if (scbus != NULL) { + if (scbus->sc_child != NULL) + rv = config_detach(scbus->sc_child, flags); + free(scbus, M_DEVBUF, sizeof(*scbus)); + sc->bus = NULL; + } + + return (rv); +} + int umass_scsi_probe(struct scsi_link *link) { @@ -289,7 +303,7 @@ umass_scsi_minphys(struct buf *bp, struct scsi_link *sl) void umass_scsi_cb(struct umass_softc *sc, void *priv, int residue, int status) { - struct umass_scsi_softc *scbus = (struct umass_scsi_softc *)sc->bus; + struct umass_scsi_softc *scbus = sc->bus; struct scsi_xfer *xs = priv; struct scsi_link *link = xs->sc_link; int cmdlen; diff --git a/sys/dev/usb/umass_scsi.h b/sys/dev/usb/umass_scsi.h index 37d1897a1b0..321eb675e3b 100644 --- a/sys/dev/usb/umass_scsi.h +++ b/sys/dev/usb/umass_scsi.h @@ -1,4 +1,4 @@ -/* $OpenBSD: umass_scsi.h,v 1.4 2008/06/26 05:42:19 ray Exp $ */ +/* $OpenBSD: umass_scsi.h,v 1.5 2015/12/16 14:50:26 mpi Exp $ */ /* $NetBSD: umass_scsipi.h,v 1.1 2001/12/24 13:25:53 augustss Exp $ */ /* @@ -33,3 +33,4 @@ int umass_scsi_attach(struct umass_softc *sc); int umass_atapi_attach(struct umass_softc *sc); +int umass_scsi_detach(struct umass_softc *sc, int flags); diff --git a/sys/dev/usb/umassvar.h b/sys/dev/usb/umassvar.h index 9280f8f54bc..d55b671a025 100644 --- a/sys/dev/usb/umassvar.h +++ b/sys/dev/usb/umassvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: umassvar.h,v 1.14 2013/11/06 14:37:31 pirofti Exp $ */ +/* $OpenBSD: umassvar.h,v 1.15 2015/12/16 14:50:26 mpi Exp $ */ /* $NetBSD: umassvar.h,v 1.20 2003/09/08 19:31:01 mycroft Exp $ */ /*- * Copyright (c) 1999 MAEKAWA Masahide , @@ -144,9 +144,7 @@ struct umass_wire_methods { umass_wire_state wire_state; }; -struct umassbus_softc { - struct device *sc_child; /* child device, for detach */ -}; +struct umass_scsi_softc; /* the per device structure */ struct umass_softc { @@ -261,7 +259,7 @@ struct umass_softc { int sc_refcnt; int sc_sense; - struct umassbus_softc *bus; /* bus dependent data */ + struct umass_scsi_softc *bus; /* bus dependent data */ /* For polled transfers */ int polling_depth; -- cgit v1.2.3