NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/52814: WD_SOFTBADSECT option cause build error
On Wed, 13 Dec 2017, Paul Goyette wrote:
Looks like (based on WD_SOFTBADSECT code elsewhere), the sc in this block
should really be the wdsc.
Perhaps try the following?
Here is a more complete patch which should help:
Index: wd.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ata/wd.c,v
retrieving revision 1.436
diff -u -p -r1.436 wd.c
--- wd.c 7 Nov 2017 04:09:08 -0000 1.436
+++ wd.c 13 Dec 2017 10:10:21 -0000
@@ -535,9 +535,9 @@ wddetach(device_t self, int flags)
#ifdef WD_SOFTBADSECT
/* Clean out the bad sector list */
- while (!SLIST_EMPTY(&sc->sc_bslist)) {
- void *head = SLIST_FIRST(&sc->sc_bslist);
- SLIST_REMOVE_HEAD(&sc->sc_bslist, dbs_next);
+ while (!SLIST_EMPTY(&wd->sc_bslist)) {
+ void *head = SLIST_FIRST(&wd->sc_bslist);
+ SLIST_REMOVE_HEAD(&wd->sc_bslist, dbs_next);
free(head, M_TEMP);
}
sc->sc_bscount = 0;
@@ -586,11 +586,13 @@ wdstrategy(struct buf *bp)
*/
if (__predict_false(!SLIST_EMPTY(&wd->sc_bslist))) {
struct disk_badsectors *dbs;
- daddr_t maxblk = blkno + (bp->b_bcount / wd->sc_blksize) - 1;
+ daddr_t maxblk = bp->b_rawblkno +
+ (bp->b_bcount / wd->sc_blksize) - 1;
mutex_enter(&wd->sc_lock);
SLIST_FOREACH(dbs, &wd->sc_bslist, dbs_next)
- if ((dbs->dbs_min <= blkno && blkno <= dbs->dbs_max) ||
+ if ((dbs->dbs_min <= bp->b_rawblkno &&
+ bp->b_rawblkno <= dbs->dbs_max) ||
(dbs->dbs_min <= maxblk && maxblk <= dbs->dbs_max)){
mutex_exit(&wd->sc_lock);
goto err;
+------------------+--------------------------+----------------------------+
| Paul Goyette | PGP Key fingerprint: | E-mail addresses: |
| (Retired) | FA29 0E3B 35AF E8AE 6651 | paul at whooppee dot com |
| Kernel Developer | 0786 F758 55DE 53BA 7731 | pgoyette at netbsd dot org |
+------------------+--------------------------+----------------------------+
Home |
Main Index |
Thread Index |
Old Index