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));
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to