WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 10/10] blktap: Add BLKTAP_OP_FLUSH command option.

To: Xen <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 10/10] blktap: Add BLKTAP_OP_FLUSH command option.
From: Daniel Stodden <daniel.stodden@xxxxxxxxxx>
Date: Tue, 8 Mar 2011 16:42:57 -0800
Cc: Jeremy Fitzhardinge <jeremy@xxxxxxxx>, Daniel Stodden <daniel.stodden@xxxxxxxxxx>
Delivery-date: Tue, 08 Mar 2011 16:52:59 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <1299631377-7853-1-git-send-email-daniel.stodden@xxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <1299631377-7853-1-git-send-email-daniel.stodden@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Wants to be enabled by userspace with a device flag. Semantics equal a
cache flush, i.e. durability for completed I/O but no particular
ordering constraints of in-flight requests.

Signed-off-by: Daniel Stodden <daniel.stodden@xxxxxxxxxx>
---
 drivers/block/blktap/blktap.h |    1 +
 drivers/block/blktap/device.c |   30 ++++++++++++++++++++++++++----
 drivers/block/blktap/ring.c   |    7 +++++++
 include/linux/blktap.h        |    2 ++
 4 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/drivers/block/blktap/blktap.h b/drivers/block/blktap/blktap.h
index e0f7d99..1b63d0e 100644
--- a/drivers/block/blktap/blktap.h
+++ b/drivers/block/blktap/blktap.h
@@ -62,6 +62,7 @@ struct blktap_statistics {
        int                            st_rd_req;
        int                            st_wr_req;
        int                            st_oo_req;
+       int                            st_fl_req;
        int                            st_rd_sect;
        int                            st_wr_sect;
        s64                            st_rd_cnt;
diff --git a/drivers/block/blktap/device.c b/drivers/block/blktap/device.c
index 2379643..74c3daf 100644
--- a/drivers/block/blktap/device.c
+++ b/drivers/block/blktap/device.c
@@ -161,6 +161,15 @@ blktap_device_end_request(struct blktap *tap,
        blktap_end_rq(rq, error);
 }
 
+static void
+blktap_device_prepare_flush(struct request_queue *q, struct request *rq)
+{
+       rq->cmd_type = REQ_TYPE_BLOCK_PC;
+       rq->timeout  = q->rq_timeout;
+       rq->cmd[0]   = BLKTAP_OP_FLUSH;
+       rq->cmd_len  = 1;
+}
+
 int
 blktap_device_make_request(struct blktap *tap, struct request *rq)
 {
@@ -180,6 +189,12 @@ blktap_device_make_request(struct blktap *tap, struct 
request *rq)
                goto fail;
        }
 
+       if (blk_pc_request(rq)) {
+               request->operation = rq->cmd[0];
+               request->nr_pages  = 0;
+               goto submit;
+       }
+
        if (!blk_fs_request(rq)) {
                err = -EOPNOTSUPP;
                goto fail;
@@ -200,6 +215,7 @@ blktap_device_make_request(struct blktap *tap, struct 
request *rq)
        if (err)
                goto fail;
 
+submit:
        request->rq = rq;
        blktap_ring_submit_request(tap, request);
 
@@ -303,8 +319,12 @@ blktap_device_configure(struct blktap *tap,
        /* Make sure buffer addresses are sector-aligned. */
        blk_queue_dma_alignment(rq, 511);
 
-       /* We are reordering, but cacheless. */
-       blk_queue_ordered(rq, QUEUE_ORDERED_DRAIN, NULL);
+       /* Enable cache control */
+       if (info->flags & BLKTAP_DEVICE_FLAG_FLUSH)
+               blk_queue_ordered(rq, QUEUE_ORDERED_DRAIN_FLUSH,
+                                 blktap_device_prepare_flush);
+       else
+               blk_queue_ordered(rq, QUEUE_ORDERED_DRAIN, NULL);
 }
 
 static int
@@ -502,11 +522,13 @@ blktap_device_create(struct blktap *tap, struct 
blktap_device_info *info)
        set_bit(BLKTAP_DEVICE, &tap->dev_inuse);
 
        dev_info(disk_to_dev(gd),
-                "sector-size: %u/%u phys-offset: %d capacity: %llu\n",
+                "sector-size: %u/%u phys-offset: %d capacity: %llu"
+                " ordered: %#x\n",
                 queue_logical_block_size(rq),
                 queue_physical_block_size(rq),
                 queue_alignment_offset(rq),
-                (unsigned long long)get_capacity(gd));
+                (unsigned long long)get_capacity(gd),
+                rq->ordered);
 
        return 0;
 
diff --git a/drivers/block/blktap/ring.c b/drivers/block/blktap/ring.c
index 25bd311..9a7696e 100644
--- a/drivers/block/blktap/ring.c
+++ b/drivers/block/blktap/ring.c
@@ -299,6 +299,12 @@ blktap_ring_submit_request(struct blktap *tap,
                tap->stats.st_wr_sect += nsecs;
                tap->stats.st_wr_req++;
                break;
+
+       case BLKTAP_OP_FLUSH:
+               breq->sector_number = 0;
+               tap->stats.st_fl_req++;
+               break;
+
        default:
                BUG();
        }
@@ -447,6 +453,7 @@ blktap_ring_ioctl(struct inode *inode, struct file *filp,
 
                mask  = BLKTAP_DEVICE_FLAG_RO;
                mask |= BLKTAP_DEVICE_FLAG_PSZ;
+               mask |= BLKTAP_DEVICE_FLAG_FLUSH;
 
                memset(&info, 0, sizeof(info));
                sz = base_sz = BLKTAP_INFO_SIZE_AT(flags);
diff --git a/include/linux/blktap.h b/include/linux/blktap.h
index 9a280d9..4739320 100644
--- a/include/linux/blktap.h
+++ b/include/linux/blktap.h
@@ -18,6 +18,7 @@
 
 #define BLKTAP_DEVICE_FLAG_RO       0x00000001UL /* disk is R/O */
 #define BLKTAP_DEVICE_FLAG_PSZ      0x00000002UL /* physical sector size */
+#define BLKTAP_DEVICE_FLAG_FLUSH    0x00000004UL /* supports FLUSH */
 
 struct blktap_info {
        unsigned int            ring_major;
@@ -54,6 +55,7 @@ struct blktap_segment {
 
 #define BLKTAP_OP_READ          0
 #define BLKTAP_OP_WRITE         1
+#define BLKTAP_OP_FLUSH         2
 
 #define BLKTAP_SEGMENT_MAX      11
 
-- 
1.7.0.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>