summaryrefslogtreecommitdiffstats
path: root/src/kernel/blk.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/blk.h')
-rw-r--r--src/kernel/blk.h91
1 files changed, 90 insertions, 1 deletions
diff --git a/src/kernel/blk.h b/src/kernel/blk.h
index 2410fe1..2da84bc 100644
--- a/src/kernel/blk.h
+++ b/src/kernel/blk.h
@@ -24,7 +24,96 @@
#include "dnbd3_main.h"
-#define REQ_TYPE_SPECIAL REQ_TYPE_DRV_PRIV
+/* define blkdev file system operation type */
+#define DNBD3_REQ_OP_FS REQ_TYPE_FS
+
+/* define blkdev special operation type */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define DNBD3_REQ_OP_SPECIAL REQ_OP_DRV_IN
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) || \
+ RHEL_CHECK_VERSION(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 3))
+#define DNBD3_REQ_OP_SPECIAL REQ_TYPE_DRV_PRIV
+#else
+#define DNBD3_REQ_OP_SPECIAL REQ_TYPE_SPECIAL
+#endif
+
+/* define blkdev read operation type */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define DNBD3_DEV_READ REQ_OP_READ
+#else
+#define DNBD3_DEV_READ DNBD3_REQ_OP_FS
+#endif
+
+/* define blkdev write operation type */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define DNBD3_DEV_WRITE REQ_OP_WRITE
+#else
+#define DNBD3_DEV_WRITE DNBD3_REQ_OP_FS
+#endif
+
+/* define command and blkdev operation access macros */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define DNBD3_REQ_FLAG_BITS REQ_FLAG_BITS
+/* cmd_flags and cmd_type are merged into cmd_flags now */
+/* sanity check to avoid overriding of request bits */
+#if DNBD3_REQ_FLAG_BITS > 24
+#error "Fix CMD bitshift"
+#endif
+/* pack command into cmd_flags field by shifting CMD_* into unused bits of cmd_flags */
+#define dnbd3_cmd_to_priv(req, cmd) \
+ ((req)->cmd_flags = DNBD3_REQ_OP_SPECIAL | ((cmd) << DNBD3_REQ_FLAG_BITS))
+#define dnbd3_priv_to_cmd(req) \
+ ((req)->cmd_flags >> DNBD3_REQ_FLAG_BITS)
+#define dnbd3_req_op(req) \
+ req_op(req)
+#else
+/* pack command into cmd_type and cmd_flags field separated */
+#define dnbd3_cmd_to_priv(req, cmd) \
+ do { \
+ (req)->cmd_type = DNBD3_REQ_OP_SPECIAL; \
+ (req)->cmd_flags = (cmd); \
+ } while (0)
+#define dnbd3_priv_to_cmd(req) \
+ ((req)->cmd_flags)
+#define dnbd3_req_op(req) \
+ ((req)->cmd_type)
+#endif
+
+/* define dnbd3_req_read(req) boolean expression */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define dnbd3_req_read(req) \
+ (req_op(req) == DNBD3_DEV_READ)
+#else
+#define dnbd3_req_read(req) \
+ (rq_data_dir(req) == READ)
+#endif
+
+/* define dnbd3_req_write(req) boolean expression */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define dnbd3_req_write(req) \
+ (req_op(req) == DNBD3_DEV_WRITE)
+#else
+#define dnbd3_req_write(req) \
+ (rq_data_dir(req) == WRITE)
+#endif
+
+/* define dnbd3_req_fs(req) boolean expression */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define dnbd3_req_fs(req) \
+ (dnbd3_req_read(req) || dnbd3_req_write(req))
+#else
+#define dnbd3_req_fs(req) \
+ (dnbd3_req_op(req) == DNBD3_REQ_OP_FS)
+#endif
+
+/* define dnbd3_req_special(req) boolean expression */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#define dnbd3_req_special(req) \
+ blk_rq_is_private(req)
+#else
+#define dnbd3_req_special(req) \
+ (dnbd3_req_op(req) == DNBD3_REQ_OP_SPECIAL)
+#endif
int dnbd3_blk_add_device(dnbd3_device_t *dev, int minor);