Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Sep 2013 23:32:49 +0000 (UTC)
From:      "Justin T. Gibbs" <gibbs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r255218 - head/sys/dev/xen/blkback
Message-ID:  <201309042332.r84NWndg040721@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gibbs
Date: Wed Sep  4 23:32:49 2013
New Revision: 255218
URL: http://svnweb.freebsd.org/changeset/base/255218

Log:
  Correct blkback handling of the BLKIF_OP_FLUSH_DISKCACHE opcode.
  
  Properly round-trip the "operation code" for client requests.
  
  sys/dev/xen/blkback/blkback.c:
  	In xbb_dispatch_dev() when processing a flush request,
  	correctly set bio->bio_caller1 to the request list (not
  	bare request) for the operation, as is expected by the
  	completion handler xbb_bio_done().
  
  	In xbb_get_resources(), initialize "operation" in the
  	driver's internal request object from the client's "ring
  	request", so it is correct when used to populate the reply
  	when this operation completes.
  
  Submitted by:	Roger Pau Monné
  Sponsored by:	Citrix Systems R&D
  Reviewed by:	gibbs

Modified:
  head/sys/dev/xen/blkback/blkback.c

Modified: head/sys/dev/xen/blkback/blkback.c
==============================================================================
--- head/sys/dev/xen/blkback/blkback.c	Wed Sep  4 23:31:29 2013	(r255217)
+++ head/sys/dev/xen/blkback/blkback.c	Wed Sep  4 23:32:49 2013	(r255218)
@@ -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,
 	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_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, 
 	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, 
 		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));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309042332.r84NWndg040721>