Blob Blame History Raw
From: kwolf@suse.de
Subject: blktap: Write Barriers
Patch-mainline: obsolete

Index: head-2008-08-18/drivers/xen/blktap/blktap.c
===================================================================
--- head-2008-08-18.orig/drivers/xen/blktap/blktap.c	2008-08-20 11:21:34.000000000 +0200
+++ head-2008-08-18/drivers/xen/blktap/blktap.c	2008-08-20 11:25:37.000000000 +0200
@@ -1307,6 +1307,9 @@ static int do_block_io_op(blkif_t *blkif
 			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);
@@ -1338,7 +1341,7 @@ static void dispatch_rw_block_io(blkif_t
 				 pending_req_t *pending_req)
 {
 	extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]);
-	int op, operation = (req->operation == BLKIF_OP_WRITE) ? WRITE : READ;
+	int op, operation;
 	struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST*2];
 	unsigned int nseg;
 	int ret, i, nr_sects = 0;
@@ -1348,6 +1351,21 @@ static void dispatch_rw_block_io(blkif_t
 	int usr_idx;
 	uint16_t mmap_idx = pending_req->mem_idx;
 
+	switch (req->operation) {
+	case BLKIF_OP_READ:
+		operation = READ;
+		break;
+	case BLKIF_OP_WRITE:
+		operation = WRITE;
+		break;
+	case BLKIF_OP_WRITE_BARRIER:
+		operation = WRITE_BARRIER;
+		break;
+	default:
+		operation = 0; /* make gcc happy */
+		BUG();
+	}
+
 	if (blkif->dev_num < 0 || blkif->dev_num > MAX_TAP_DEV)
 		goto fail_response;
 
@@ -1386,7 +1404,7 @@ static void dispatch_rw_block_io(blkif_t
 
 	pending_req->blkif     = blkif;
 	pending_req->id        = req->id;
-	pending_req->operation = operation;
+	pending_req->operation = req->operation;
 	pending_req->status    = BLKIF_RSP_OKAY;
 	pending_req->nr_pages  = nseg;
 	op = 0;
@@ -1400,7 +1418,7 @@ static void dispatch_rw_block_io(blkif_t
 		kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i);
 
 		flags = GNTMAP_host_map;
-		if (operation == WRITE)
+		if (operation != READ)
 			flags |= GNTMAP_readonly;
 		gnttab_set_map_op(&map[op], kvaddr, flags,
 				  req->seg[i].gref, blkif->domid);
@@ -1417,7 +1435,7 @@ static void dispatch_rw_block_io(blkif_t
 
 			flags = GNTMAP_host_map | GNTMAP_application_map
 				| GNTMAP_contains_pte;
-			if (operation == WRITE)
+			if (operation != READ)
 				flags |= GNTMAP_readonly;
 			gnttab_set_map_op(&map[op], ptep, flags,
 					  req->seg[i].gref, blkif->domid);
Index: head-2008-08-18/drivers/xen/blktap/xenbus.c
===================================================================
--- head-2008-08-18.orig/drivers/xen/blktap/xenbus.c	2008-07-22 08:23:42.000000000 +0200
+++ head-2008-08-18/drivers/xen/blktap/xenbus.c	2008-07-22 08:26:18.000000000 +0200
@@ -393,7 +393,28 @@ static void connect(struct backend_info 
 	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",