2010-07-07 11:12:45 +00:00
|
|
|
From: kwolf@suse.de
|
|
|
|
Subject: blktap: Write Barriers
|
|
|
|
Patch-mainline: obsolete
|
|
|
|
|
2011-04-19 20:09:59 +00:00
|
|
|
--- head-2011-02-17.orig/drivers/xen/blktap/blktap.c 2011-02-28 14:15:27.000000000 +0100
|
|
|
|
+++ head-2011-02-17/drivers/xen/blktap/blktap.c 2011-02-28 14:21:49.000000000 +0100
|
|
|
|
@@ -1374,6 +1374,9 @@ static int do_block_io_op(blkif_t *blkif
|
2010-07-07 11:12:45 +00:00
|
|
|
dispatch_rw_block_io(blkif, &req, pending_req);
|
|
|
|
break;
|
|
|
|
|
|
|
|
+ case BLKIF_OP_WRITE_BARRIER:
|
|
|
|
+ /* TODO Some counter? */
|
|
|
|
+ /* Fall through */
|
|
|
|
case BLKIF_OP_WRITE:
|
|
|
|
blkif->st_wr_req++;
|
|
|
|
dispatch_rw_block_io(blkif, &req, pending_req);
|
2011-04-19 20:09:59 +00:00
|
|
|
@@ -1432,7 +1435,7 @@ static void dispatch_rw_block_io(blkif_t
|
2010-07-07 11:12:45 +00:00
|
|
|
|
2011-04-19 20:09:59 +00:00
|
|
|
/* Check that number of segments is sane. */
|
|
|
|
nseg = req->nr_segments;
|
|
|
|
- if ( unlikely(nseg == 0) ||
|
|
|
|
+ if (unlikely(nseg == 0 && req->operation != BLKIF_OP_WRITE_BARRIER) ||
|
|
|
|
unlikely(nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST) ) {
|
|
|
|
WPRINTK("Bad number of segments in request (%d)\n", nseg);
|
|
|
|
goto fail_response;
|
|
|
|
@@ -1458,8 +1461,13 @@ static void dispatch_rw_block_io(blkif_t
|
|
|
|
pending_req->nr_pages = nseg;
|
|
|
|
|
|
|
|
flags = GNTMAP_host_map;
|
|
|
|
- if (req->operation == BLKIF_OP_WRITE)
|
2010-07-07 11:12:45 +00:00
|
|
|
+ switch (req->operation) {
|
|
|
|
+ case BLKIF_OP_WRITE:
|
|
|
|
+ case BLKIF_OP_WRITE_BARRIER:
|
2011-04-19 20:09:59 +00:00
|
|
|
flags |= GNTMAP_readonly;
|
2010-07-07 11:12:45 +00:00
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
op = 0;
|
2011-04-19 20:09:59 +00:00
|
|
|
mm = info->mm;
|
|
|
|
if (!xen_feature(XENFEAT_auto_translated_physmap))
|
|
|
|
@@ -1622,6 +1630,7 @@ static void dispatch_rw_block_io(blkif_t
|
|
|
|
blkif->st_rd_sect += nr_sects;
|
|
|
|
break;
|
|
|
|
case BLKIF_OP_WRITE:
|
|
|
|
+ case BLKIF_OP_WRITE_BARRIER:
|
|
|
|
blkif->st_wr_sect += nr_sects;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
--- head-2011-02-17.orig/drivers/xen/blktap/xenbus.c 2010-11-25 10:57:14.000000000 +0100
|
|
|
|
+++ head-2011-02-17/drivers/xen/blktap/xenbus.c 2010-11-25 10:57:21.000000000 +0100
|
|
|
|
@@ -418,7 +418,28 @@ static void connect(struct backend_info
|
2010-07-07 11:12:45 +00:00
|
|
|
int err;
|
|
|
|
|
|
|
|
struct xenbus_device *dev = be->dev;
|
|
|
|
+ struct xenbus_transaction xbt;
|
|
|
|
|
|
|
|
+ /* Write feature-barrier to xenstore */
|
|
|
|
+again:
|
|
|
|
+ err = xenbus_transaction_start(&xbt);
|
|
|
|
+ if (err) {
|
|
|
|
+ xenbus_dev_fatal(dev, err, "starting transaction");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = xenbus_printf(xbt, dev->nodename, "feature-barrier", "1");
|
|
|
|
+ if (err) {
|
|
|
|
+ xenbus_dev_fatal(dev, err, "writing feature-barrier");
|
|
|
|
+ xenbus_transaction_end(xbt, 1);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = xenbus_transaction_end(xbt, 0);
|
|
|
|
+ if (err == -EAGAIN)
|
|
|
|
+ goto again;
|
|
|
|
+
|
|
|
|
+ /* Switch state */
|
|
|
|
err = xenbus_switch_state(dev, XenbusStateConnected);
|
|
|
|
if (err)
|
|
|
|
xenbus_dev_fatal(dev, err, "switching to Connected state",
|