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
|