Module Name: src Committed By: jakllsch Date: Sun Apr 23 01:21:04 UTC 2017
Modified Files: src/sys/dev/ata [jdolecek-ncq]: wd.c wdvar.h Log Message: Simplify wi_find() with container_of(). No need to search a list of wd_ioctls when the *bp is always going to be within the wd_ioctl structure. Correctly initialize wi->wi_bp.b_dev in the non-data case anyway. Fixes ATAIOCCOMMAND procesing on driver instances other than wd0. To generate a diff of this commit: cvs rdiff -u -r1.428.2.10 -r1.428.2.11 src/sys/dev/ata/wd.c cvs rdiff -u -r1.43.4.4 -r1.43.4.5 src/sys/dev/ata/wdvar.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/ata/wd.c diff -u src/sys/dev/ata/wd.c:1.428.2.10 src/sys/dev/ata/wd.c:1.428.2.11 --- src/sys/dev/ata/wd.c:1.428.2.10 Sat Apr 22 20:07:54 2017 +++ src/sys/dev/ata/wd.c Sun Apr 23 01:21:04 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: wd.c,v 1.428.2.10 2017/04/22 20:07:54 jakllsch Exp $ */ +/* $NetBSD: wd.c,v 1.428.2.11 2017/04/23 01:21:04 jakllsch Exp $ */ /* * Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved. @@ -54,7 +54,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.428.2.10 2017/04/22 20:07:54 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.428.2.11 2017/04/23 01:21:04 jakllsch Exp $"); #include "opt_ata.h" @@ -306,7 +306,6 @@ wdattach(device_t parent, device_t self, #ifdef WD_SOFTBADSECT SLIST_INIT(&wd->sc_bslist); #endif - LIST_INIT(&wd->wi_head); STAILQ_INIT(&wd->xfer_restart); wd->atabus = adev->adev_bustype; wd->drvp = adev->adev_drv_data; @@ -509,7 +508,6 @@ wddetach(device_t self, int flags) } sc->sc_bscount = 0; #endif - KASSERT(LIST_EMPTY(&sc->wi_head)); pmf_device_deregister(self); @@ -1555,7 +1553,7 @@ wdioctl(dev_t dev, u_long xfer, void *ad wi->wi_bp.b_flags = 0; wi->wi_bp.b_data = 0; wi->wi_bp.b_bcount = 0; - wi->wi_bp.b_dev = 0; + wi->wi_bp.b_dev = dev; wi->wi_bp.b_proc = l->l_proc; wdioctlstrategy(&wi->wi_bp); error1 = wi->wi_bp.b_error; @@ -2148,10 +2146,6 @@ wi_get(struct wd_softc *wd) wi->wi_softc = wd; buf_init(&wi->wi_bp); - mutex_enter(&wd->sc_lock); - LIST_INSERT_HEAD(&wd->wi_head, wi, wi_list); - mutex_exit(&wd->sc_lock); - return (wi); } @@ -2162,11 +2156,6 @@ wi_get(struct wd_softc *wd) void wi_free(struct wd_ioctl *wi) { - struct wd_softc *wd = wi->wi_softc; - - mutex_enter(&wd->sc_lock); - LIST_REMOVE(wi, wi_list); - mutex_exit(&wd->sc_lock); buf_destroy(&wi->wi_bp); free(wi, M_TEMP); } @@ -2178,17 +2167,7 @@ wi_free(struct wd_ioctl *wi) struct wd_ioctl * wi_find(struct buf *bp) { - struct wd_softc *wd = - device_lookup_private(&wd_cd, WDUNIT(bp->b_dev)); - struct wd_ioctl *wi; - - mutex_enter(&wd->sc_lock); - LIST_FOREACH(wi, &wd->wi_head, wi_list) { - if (bp == &wi->wi_bp) - break; - } - mutex_exit(&wd->sc_lock); - return (wi); + return container_of(bp, struct wd_ioctl, wi_bp); } static uint Index: src/sys/dev/ata/wdvar.h diff -u src/sys/dev/ata/wdvar.h:1.43.4.4 src/sys/dev/ata/wdvar.h:1.43.4.5 --- src/sys/dev/ata/wdvar.h:1.43.4.4 Wed Apr 19 20:49:17 2017 +++ src/sys/dev/ata/wdvar.h Sun Apr 23 01:21:04 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: wdvar.h,v 1.43.4.4 2017/04/19 20:49:17 jdolecek Exp $ */ +/* $NetBSD: wdvar.h,v 1.43.4.5 2017/04/23 01:21:04 jakllsch Exp $ */ /* * Copyright (c) 1998, 2001 Manuel Bouyer. @@ -69,8 +69,6 @@ struct wd_softc { #endif krndsource_t rnd_source; - LIST_HEAD(, wd_ioctl) wi_head; - STAILQ_HEAD(, ata_xfer) xfer_restart; };