Module Name: src Committed By: jdolecek Date: Tue Apr 14 14:06:24 UTC 2020
Modified Files: src/sys/arch/xen/xen: xbd_xenbus.c Log Message: rearrange slightly to do proper b_resid accounting, to prepare for partial transfers To generate a diff of this commit: cvs rdiff -u -r1.111 -r1.112 src/sys/arch/xen/xen/xbd_xenbus.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/xen/xen/xbd_xenbus.c diff -u src/sys/arch/xen/xen/xbd_xenbus.c:1.111 src/sys/arch/xen/xen/xbd_xenbus.c:1.112 --- src/sys/arch/xen/xen/xbd_xenbus.c:1.111 Tue Apr 14 13:10:43 2020 +++ src/sys/arch/xen/xen/xbd_xenbus.c Tue Apr 14 14:06:24 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xbd_xenbus.c,v 1.111 2020/04/14 13:10:43 jdolecek Exp $ */ +/* $NetBSD: xbd_xenbus.c,v 1.112 2020/04/14 14:06:24 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -50,7 +50,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.111 2020/04/14 13:10:43 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.112 2020/04/14 14:06:24 jdolecek Exp $"); #include "opt_xen.h" @@ -745,6 +745,23 @@ again: continue; } + bp = xbdreq->req_bp; + KASSERT(bp != NULL && bp->b_data != NULL); + DPRINTF(("%s(%p): b_bcount = %ld\n", __func__, + bp, (long)bp->b_bcount)); + + if (rep->status != BLKIF_RSP_OKAY) { + bp->b_error = EIO; + bp->b_resid = bp->b_bcount; + } else { + KASSERTMSG(xbdreq->req_dmamap->dm_mapsize <= + bp->b_resid, "mapsize %d > b_resid %d", + (int)xbdreq->req_dmamap->dm_mapsize, + (int)bp->b_resid); + bp->b_resid -= xbdreq->req_dmamap->dm_mapsize; + KASSERT(bp->b_resid == 0); + } + for (seg = 0; seg < xbdreq->req_dmamap->dm_nsegs; seg++) { /* * We are not allowing persistent mappings, so @@ -757,21 +774,10 @@ again: bus_dmamap_unload(sc->sc_xbusd->xbusd_dmat, xbdreq->req_dmamap); - bp = xbdreq->req_bp; - KASSERT(bp != NULL && bp->b_data != NULL); - DPRINTF(("%s(%p): b_bcount = %ld\n", __func__, - bp, (long)bp->b_bcount)); - if (__predict_false(bp->b_data != xbdreq->req_data)) xbd_unmap_align(sc, xbdreq, true); xbdreq->req_bp = xbdreq->req_data = NULL; - /* b_resid was set in dk_start, only override on error */ - if (rep->status != BLKIF_RSP_OKAY) { - bp->b_error = EIO; - bp->b_resid = bp->b_bcount; - } - dk_done(&sc->sc_dksc, bp); SLIST_INSERT_HEAD(&sc->sc_xbdreq_head, xbdreq, req_next); @@ -1067,7 +1073,7 @@ xbd_diskstart(device_t self, struct buf req->sector_number = bp->b_rawblkno; req->handle = sc->sc_handle; - bp->b_resid = 0; + bp->b_resid = bp->b_bcount; for (seg = 0; seg < xbdreq->req_dmamap->dm_nsegs; seg++) { bus_dma_segment_t *dmaseg = &xbdreq->req_dmamap->dm_segs[seg];