Index: ld_sdmmc.c =================================================================== RCS file: /cvsroot/src/sys/dev/sdmmc/ld_sdmmc.c,v retrieving revision 1.16 diff -u -p -r1.16 ld_sdmmc.c --- ld_sdmmc.c 20 May 2015 13:09:34 -0000 1.16 +++ ld_sdmmc.c 25 May 2015 09:28:40 -0000 @@ -181,6 +181,15 @@ ld_sdmmc_start(struct ld_softc *ld, stru struct ld_sdmmc_softc *sc = device_private(ld->sc_dv); struct ld_sdmmc_task *task = &sc->sc_task; + /* is everything done in terms of blocks? */ + if (bp->b_rawblkno >= sc->sc_sf->csd.capacity) { + /* trying to read or write past end of device */ + aprint_error_dev(sc->sc_ld.sc_dv, + "blkno 0x%" PRIu64 " exceeds capacity %d\n", + bp->b_rawblkno, sc->sc_sf->csd.capacity); + return EINVAL; + } + task->task_sc = sc; task->task_bp = bp; sdmmc_init_task(&task->task, ld_sdmmc_dobio, task); @@ -208,20 +217,6 @@ ld_sdmmc_dobio(void *arg) device_xname(sc->sc_ld.sc_dv), bp->b_flags & B_READ ? "IN" : "OUT", bp->b_rawblkno, bp->b_bcount)); - /* is everything done in terms of blocks? */ - if (bp->b_rawblkno >= sc->sc_sf->csd.capacity) { - /* trying to read or write past end of device */ - aprint_error_dev(sc->sc_ld.sc_dv, - "blkno 0x%" PRIu64 " exceeds capacity %d\n", - bp->b_rawblkno, sc->sc_sf->csd.capacity); - bp->b_error = EINVAL; - bp->b_resid = bp->b_bcount; - s = splbio(); - lddone(&sc->sc_ld, bp); - splx(s); - return; - } - s = splbio(); if (bp->b_flags & B_READ) error = sdmmc_mem_read_block(sc->sc_sf, bp->b_rawblkno,