From 928cdb2a034572d29cda884b927cca293baae211 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Wed, 4 Apr 2018 17:47:01 +0200 Subject: [KERNEL] Pre/post 4.11 handling of request ops --- src/kernel/blk.c | 24 ++++++++++++++++++++---- src/kernel/net.c | 17 ++++++++++------- 2 files changed, 30 insertions(+), 11 deletions(-) (limited to 'src/kernel') 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 +#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); -- cgit v1.2.3-55-g7522