Date: Wed, 4 Sep 2013 11:49:33 -0600 From: "Justin T. Gibbs" <gibbs@freebsd.org> To: =?iso-8859-1?Q?Roger_Pau_Monn=E9?= <roger.pau@citrix.com> Cc: "freebsd-xen@freebsd.org" <freebsd-xen@freebsd.org> Subject: Re: Another blkback issue related to flush Message-ID: <EAD57817-4430-41AA-B12A-DCDD07A61412@freebsd.org> In-Reply-To: <522768EA.6010809@citrix.com> References: <522768EA.6010809@citrix.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--Apple-Mail=_8FB0F9B6-B925-4672-AD4B-78D54204A510 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=iso-8859-1 On Sep 4, 2013, at 11:07 AM, Roger Pau Monn=E9 <roger.pau@citrix.com> = wrote: > Hello, >=20 > I've found another issue with blkback handling of flush operations, it > was incorrectly setting one of the bio parameters when using a block > device as backend. The attached patch fixes it, and also includes a > small fix to correctly set the operation when writing the response on > the ring (all responses written by FreeBSD blkback were of type > BLKIF_OP_READ, because nreq->operation was not set). It seems that the req's pendcnt is unused and can be culled. Otherwise, looks good to me. Here's the patch I have in my tree now. -- Justin --Apple-Mail=_8FB0F9B6-B925-4672-AD4B-78D54204A510 Content-Disposition: attachment; filename=blkback.diff Content-Type: application/octet-stream; name="blkback.diff" Content-Transfer-Encoding: 7bit Index: blkback.c =================================================================== --- blkback.c (revision 255179) +++ blkback.c (working copy) @@ -230,7 +230,7 @@ struct xbb_xen_reqlist { int num_children; /** - * Number of I/O requests dispatched to the backend. + * Number of I/O requests still pending on the backend. */ int pendcnt; @@ -327,13 +327,6 @@ struct xbb_xen_req { int nr_512b_sectors; /** - * The number of struct bio requests still outstanding for this - * request on the backend device. This field is only used for - * device (rather than file) backed I/O. - */ - int pendcnt; - - /** * BLKIF_OP code for this request. */ int operation; @@ -1240,6 +1233,7 @@ xbb_get_resources(struct xbb_softc *xbb, struct xb nreq->reqlist = *reqlist; nreq->req_ring_idx = ring_idx; nreq->id = ring_req->id; + nreq->operation = ring_req->operation; if (xbb->abi != BLKIF_PROTOCOL_NATIVE) { bcopy(ring_req, &nreq->ring_req_storage, sizeof(*ring_req)); @@ -2062,7 +2056,6 @@ xbb_dispatch_dev(struct xbb_softc *xbb, struct xbb { struct xbb_dev_data *dev_data; struct bio *bios[XBB_MAX_SEGMENTS_PER_REQLIST]; - struct xbb_xen_req *nreq; off_t bio_offset; struct bio *bio; struct xbb_sg *xbb_sg; @@ -2080,7 +2073,6 @@ xbb_dispatch_dev(struct xbb_softc *xbb, struct xbb bio_idx = 0; if (operation == BIO_FLUSH) { - nreq = STAILQ_FIRST(&reqlist->contig_req_list); bio = g_new_bio(); if (__predict_false(bio == NULL)) { DPRINTF("Unable to allocate bio for BIO_FLUSH\n"); @@ -2094,10 +2086,10 @@ xbb_dispatch_dev(struct xbb_softc *xbb, struct xbb bio->bio_offset = 0; bio->bio_data = 0; bio->bio_done = xbb_bio_done; - bio->bio_caller1 = nreq; + bio->bio_caller1 = reqlist; bio->bio_pblkno = 0; - nreq->pendcnt = 1; + reqlist->pendcnt = 1; SDT_PROBE1(xbb, kernel, xbb_dispatch_dev, flush, device_get_unit(xbb->dev)); --Apple-Mail=_8FB0F9B6-B925-4672-AD4B-78D54204A510 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=iso-8859-1 --Apple-Mail=_8FB0F9B6-B925-4672-AD4B-78D54204A510--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?EAD57817-4430-41AA-B12A-DCDD07A61412>