summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Bauer2018-04-04 17:47:01 +0200
committerSimon Rettberg2018-04-05 12:28:13 +0200
commit928cdb2a034572d29cda884b927cca293baae211 (patch)
tree756d260b89628e18079302293b2a8f45a556d59c
parent[KERNEL] #ifs and #defines for timer pre/post 4.15 (diff)
downloaddnbd3-928cdb2a034572d29cda884b927cca293baae211.tar.gz
dnbd3-928cdb2a034572d29cda884b927cca293baae211.tar.xz
dnbd3-928cdb2a034572d29cda884b927cca293baae211.zip
[KERNEL] Pre/post 4.11 handling of request ops
-rw-r--r--src/kernel/blk.c24
-rw-r--r--src/kernel/net.c17
2 files changed, 30 insertions, 11 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c
index 6f2523c..511d349 100644
--- a/src/kernel/blk.c
+++ b/src/kernel/blk.c
@@ -25,6 +25,22 @@
#include <linux/pagemap.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define dnbd3_req_read(req) \
+ req_op(req) == REQ_OP_READ
+#define dnbd3_req_fs(req) \
+ dnbd3_req_read(req) || req_op(req) == REQ_OP_WRITE
+#define dnbd3_req_special(req) \
+ blk_rq_is_private(req)
+#else
+#define dnbd3_req_read(req) \
+ rq_data_dir(req) == READ
+#define dnbd3_req_fs(req) \
+ req->cmd_type == REQ_TYPE_FS
+#define dnbd3_req_special(req) \
+ req->cmd_type == REQ_TYPE_SPECIAL
+#endif
+
int dnbd3_blk_add_device(dnbd3_device_t *dev, int minor)
{
struct gendisk *disk;
@@ -267,7 +283,7 @@ void dnbd3_blk_request(struct request_queue *q)
continue;
}
- if (req_op(req) != REQ_OP_READ && req_op(req) != REQ_OP_WRITE)
+ if (!(dnbd3_req_fs(req)))
{
__blk_end_request_all(req, 0);
continue;
@@ -279,7 +295,7 @@ void dnbd3_blk_request(struct request_queue *q)
continue;
}
- if (req_op(req) != REQ_OP_READ)
+ if (!(dnbd3_req_read(req)))
{
__blk_end_request_all(req, -EACCES);
continue;
@@ -341,13 +357,13 @@ void dnbd3_blk_fail_all_requests(dnbd3_device_t *dev)
list_for_each_entry_safe(blk_request, tmp_request, &local_copy, queuelist)
{
list_del_init(&blk_request->queuelist);
- if (req_op(blk_request) == REQ_OP_READ || req_op(blk_request) == REQ_OP_WRITE)
+ if (dnbd3_req_fs(blk_request))
{
spin_lock_irqsave(&dev->blk_lock, flags);
__blk_end_request_all(blk_request, -EIO);
spin_unlock_irqrestore(&dev->blk_lock, flags);
}
- else if (blk_rq_is_private(blk_request))
+ else if (dnbd3_req_special(blk_request))
{
kfree(blk_request);
}
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 1609258..0b2098d 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -46,6 +46,9 @@
// Pack into cmd_flags field by shifting CMD_* into unused bits of cmd_flags
#define dnbd3_cmd_to_priv(req, cmd) (req)->cmd_flags = REQ_OP_DRV_IN | ((cmd) << REQ_FLAG_BITS)
#define dnbd3_priv_to_cmd(req) ((req)->cmd_flags >> REQ_FLAG_BITS)
+#define dnbd3_req_op(req) req_op(req)
+#define DNBD3_DEV_READ REQ_OP_READ
+#define DNBD3_REQ_OP_SPECIAL REQ_OP_DRV_IN
#else
// Old way with type and flags separated
#define dnbd3_cmd_to_priv(req, cmd) do { \
@@ -53,6 +56,9 @@
(req)->cmd_flags = (cmd); \
} while (0)
#define dnbd3_priv_to_cmd(req) (req)->cmd_flags
+#define dnbd3_req_op(req) (req)->cmd_type
+#define DNBD3_DEV_READ REQ_TYPE_FS
+#define DNBD3_REQ_OP_SPECIAL REQ_TYPE_SPECIAL
#endif
/**
@@ -875,10 +881,9 @@ int dnbd3_net_send(void *data)
spin_unlock_irqrestore(&dev->blk_lock, irqflags);
// what to do?
- switch (req_op(blk_request))
+ switch (dnbd3_req_op(blk_request))
{
- case REQ_OP_READ:
- case REQ_OP_WRITE:
+ case DNBD3_DEV_READ:
dnbd3_request.cmd = CMD_GET_BLOCK;
dnbd3_request.offset = blk_rq_pos(blk_request) << 9; // *512
dnbd3_request.size = blk_rq_bytes(blk_request); // bytes left to complete entire request
@@ -888,9 +893,7 @@ int dnbd3_net_send(void *data)
list_add_tail(&blk_request->queuelist, &dev->request_queue_receive);
spin_unlock_irqrestore(&dev->blk_lock, irqflags);
break;
-
- case REQ_OP_DRV_IN:
- case REQ_OP_DRV_OUT:
+ case DNBD3_REQ_OP_SPECIAL:
dnbd3_request.cmd = dnbd3_priv_to_cmd(blk_request);
dnbd3_request.size = 0;
spin_lock_irqsave(&dev->blk_lock, irqflags);
@@ -899,7 +902,7 @@ int dnbd3_net_send(void *data)
break;
default:
- printk("ERROR: Unknown command (send %u %u)\n", (int)blk_request->cmd_flags, (int)req_op(blk_request));
+ printk("ERROR: Unknown command (send %u %u)\n", (int)blk_request->cmd_flags, (int)dnbd3_req_op(blk_request));
spin_lock_irqsave(&dev->blk_lock, irqflags);
list_del_init(&blk_request->queuelist);
spin_unlock_irqrestore(&dev->blk_lock, irqflags);