+++ /dev/null
-From: plc@novell.com
-Subject: add support for new operation type BLKIF_OP_PACKET
-Patch-mainline: obsolete
-References: fate#300964
-
---- sle11-2009-06-04.orig/drivers/xen/blkback/blkback.c 2009-06-04 10:20:39.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/blkback/blkback.c 2009-06-04 10:46:54.000000000 +0200
-@@ -192,13 +192,15 @@ static void fast_flush_area(pending_req_
-
- static void print_stats(blkif_t *blkif)
- {
-- printk(KERN_DEBUG "%s: oo %3d | rd %4d | wr %4d | br %4d\n",
-+ printk(KERN_DEBUG "%s: oo %3d | rd %4d | wr %4d | br %4d | pk %4d\n",
- current->comm, blkif->st_oo_req,
-- blkif->st_rd_req, blkif->st_wr_req, blkif->st_br_req);
-+ blkif->st_rd_req, blkif->st_wr_req, blkif->st_br_req,
-+ blkif->st_pk_req);
- blkif->st_print = jiffies + msecs_to_jiffies(10 * 1000);
- blkif->st_rd_req = 0;
- blkif->st_wr_req = 0;
- blkif->st_oo_req = 0;
-+ blkif->st_pk_req = 0;
- }
-
- int blkif_schedule(void *arg)
-@@ -358,6 +360,13 @@ static int do_block_io_op(blkif_t *blkif
- blkif->st_wr_req++;
- dispatch_rw_block_io(blkif, &req, pending_req);
- break;
-+ case BLKIF_OP_PACKET:
-+ DPRINTK("error: block operation BLKIF_OP_PACKET not implemented\n");
-+ blkif->st_pk_req++;
-+ make_response(blkif, req.id, req.operation,
-+ BLKIF_RSP_ERROR);
-+ free_req(pending_req);
-+ break;
- default:
- /* A good sign something is wrong: sleep for a while to
- * avoid excessive CPU consumption by a bad guest. */
---- sle11-2009-06-04.orig/drivers/xen/blkback/common.h 2009-06-04 10:46:52.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/blkback/common.h 2009-06-04 10:46:54.000000000 +0200
-@@ -87,6 +87,7 @@ typedef struct blkif_st {
- int st_wr_req;
- int st_oo_req;
- int st_br_req;
-+ int st_pk_req;
- int st_rd_sect;
- int st_wr_sect;
-
---- sle11-2009-06-04.orig/drivers/xen/blkfront/blkfront.c 2009-06-04 10:21:09.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/blkfront/blkfront.c 2009-06-04 10:46:54.000000000 +0200
-@@ -626,6 +626,8 @@ static int blkif_queue_request(struct re
- BLKIF_OP_WRITE : BLKIF_OP_READ;
- if (blk_barrier_rq(req))
- ring_req->operation = BLKIF_OP_WRITE_BARRIER;
-+ if (blk_pc_request(req))
-+ ring_req->operation = BLKIF_OP_PACKET;
-
- ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg);
- BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST);
-@@ -677,7 +679,7 @@ void do_blkif_request(struct request_que
-
- while ((req = elv_next_request(rq)) != NULL) {
- info = req->rq_disk->private_data;
-- if (!blk_fs_request(req)) {
-+ if (!blk_fs_request(req) && !blk_pc_request(req)) {
- end_request(req, 0);
- continue;
- }
-@@ -754,6 +756,7 @@ static irqreturn_t blkif_int(int irq, vo
- /* fall through */
- case BLKIF_OP_READ:
- case BLKIF_OP_WRITE:
-+ case BLKIF_OP_PACKET:
- if (unlikely(bret->status != BLKIF_RSP_OKAY))
- DPRINTK("Bad return from blkdev data "
- "request: %x\n", bret->status);
---- sle11-2009-06-04.orig/drivers/xen/blktap/blktap.c 2009-06-04 10:46:52.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/blktap/blktap.c 2009-06-04 10:46:54.000000000 +0200
-@@ -1087,13 +1087,14 @@ static void fast_flush_area(pending_req_
-
- static void print_stats(blkif_t *blkif)
- {
-- printk(KERN_DEBUG "%s: oo %3d | rd %4d | wr %4d\n",
-+ printk(KERN_DEBUG "%s: oo %3d | rd %4d | wr %4d | pk %4d\n",
- current->comm, blkif->st_oo_req,
-- blkif->st_rd_req, blkif->st_wr_req);
-+ blkif->st_rd_req, blkif->st_wr_req, blkif->st_pk_req);
- blkif->st_print = jiffies + msecs_to_jiffies(10 * 1000);
- blkif->st_rd_req = 0;
- blkif->st_wr_req = 0;
- blkif->st_oo_req = 0;
-+ blkif->st_pk_req = 0;
- }
-
- int tap_blkif_schedule(void *arg)
-@@ -1329,6 +1330,11 @@ static int do_block_io_op(blkif_t *blkif
- dispatch_rw_block_io(blkif, &req, pending_req);
- break;
-
-+ case BLKIF_OP_PACKET:
-+ blkif->st_pk_req++;
-+ dispatch_rw_block_io(blkif, &req, pending_req);
-+ break;
-+
- default:
- /* A good sign something is wrong: sleep for a while to
- * avoid excessive CPU consumption by a bad guest. */
-@@ -1368,6 +1374,8 @@ static void dispatch_rw_block_io(blkif_t
- struct mm_struct *mm;
-
- switch (req->operation) {
-+ case BLKIF_OP_PACKET:
-+ /* Fall through */
- case BLKIF_OP_READ:
- operation = READ;
- break;
---- sle11-2009-06-04.orig/drivers/xen/blktap/common.h 2009-06-04 10:20:18.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/blktap/common.h 2009-06-04 10:46:54.000000000 +0200
-@@ -75,6 +75,7 @@ typedef struct blkif_st {
- int st_rd_req;
- int st_wr_req;
- int st_oo_req;
-+ int st_pk_req;
- int st_rd_sect;
- int st_wr_sect;
-
---- sle11-2009-06-04.orig/include/xen/interface/io/blkif.h 2009-06-04 10:18:38.000000000 +0200
-+++ sle11-2009-06-04/include/xen/interface/io/blkif.h 2009-06-04 10:46:54.000000000 +0200
-@@ -76,6 +76,10 @@
- * "feature-flush-cache" node!
- */
- #define BLKIF_OP_FLUSH_DISKCACHE 3
-+/*
-+ * Device specific command packet contained within the request
-+ */
-+#define BLKIF_OP_PACKET 4
-
- /*
- * Maximum scatter/gather segments per request.