]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - include/linux/blk_types.h
Move c_src dirs back to toplevel
[bcachefs-tools-debian] / include / linux / blk_types.h
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
new file mode 100644 (file)
index 0000000..80560ab
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+ * Block data types and constants.  Directly include this file only to
+ * break include dependency loop.
+ */
+#ifndef __LINUX_BLK_TYPES_H
+#define __LINUX_BLK_TYPES_H
+
+#include <linux/atomic.h>
+#include <linux/types.h>
+#include <linux/bvec.h>
+#include <linux/kobject.h>
+
+struct bio_set;
+struct bio;
+typedef void (bio_end_io_t) (struct bio *);
+
+#define BDEVNAME_SIZE  32
+
+struct request_queue {
+       struct backing_dev_info *backing_dev_info;
+};
+
+struct gendisk {
+       struct backing_dev_info *bdi;
+       struct backing_dev_info __bdi;
+};
+
+struct hd_struct {
+       struct kobject          kobj;
+};
+
+struct block_device {
+       struct kobject          kobj;
+       dev_t                   bd_dev;
+       char                    name[BDEVNAME_SIZE];
+       struct inode            *bd_inode;
+       struct request_queue    queue;
+       void                    *bd_holder;
+       struct gendisk *        bd_disk;
+       struct gendisk          __bd_disk;
+       int                     bd_fd;
+};
+
+#define bdev_kobj(_bdev) (&((_bdev)->kobj))
+
+/*
+ * Block error status values.  See block/blk-core:blk_errors for the details.
+ */
+typedef u8 __bitwise blk_status_t;
+#define        BLK_STS_OK 0
+#define BLK_STS_NOTSUPP                ((__force blk_status_t)1)
+#define BLK_STS_TIMEOUT                ((__force blk_status_t)2)
+#define BLK_STS_NOSPC          ((__force blk_status_t)3)
+#define BLK_STS_TRANSPORT      ((__force blk_status_t)4)
+#define BLK_STS_TARGET         ((__force blk_status_t)5)
+#define BLK_STS_NEXUS          ((__force blk_status_t)6)
+#define BLK_STS_MEDIUM         ((__force blk_status_t)7)
+#define BLK_STS_PROTECTION     ((__force blk_status_t)8)
+#define BLK_STS_RESOURCE       ((__force blk_status_t)9)
+#define BLK_STS_IOERR          ((__force blk_status_t)10)
+
+/* hack for device mapper, don't use elsewhere: */
+#define BLK_STS_DM_REQUEUE    ((__force blk_status_t)11)
+
+#define BLK_STS_AGAIN          ((__force blk_status_t)12)
+
+#define BIO_INLINE_VECS 4
+
+/*
+ * main unit of I/O for the block layer and lower layers (ie drivers and
+ * stacking drivers)
+ */
+struct bio {
+       struct bio              *bi_next;       /* request queue link */
+       struct block_device     *bi_bdev;
+       blk_status_t            bi_status;
+       unsigned int            bi_opf;         /* bottom bits req flags,
+                                                * top bits REQ_OP. Use
+                                                * accessors.
+                                                */
+       unsigned short          bi_flags;       /* status, command, etc */
+       unsigned short          bi_ioprio;
+
+       struct bvec_iter        bi_iter;
+
+       atomic_t                __bi_remaining;
+
+       bio_end_io_t            *bi_end_io;
+       void                    *bi_private;
+
+       unsigned short          bi_vcnt;        /* how many bio_vec's */
+
+       /*
+        * Everything starting with bi_max_vecs will be preserved by bio_reset()
+        */
+
+       unsigned short          bi_max_vecs;    /* max bvl_vecs we can hold */
+
+       atomic_t                __bi_cnt;       /* pin count */
+
+       struct bio_vec          *bi_io_vec;     /* the actual vec list */
+
+       struct bio_set          *bi_pool;
+
+       /*
+        * We can inline a number of vecs at the end of the bio, to avoid
+        * double allocations for a small number of bio_vecs. This member
+        * MUST obviously be kept at the very end of the bio.
+        */
+       struct bio_vec          bi_inline_vecs[0];
+};
+
+#define BIO_RESET_BYTES                offsetof(struct bio, bi_max_vecs)
+
+/*
+ * bio flags
+ */
+#define BIO_SEG_VALID  1       /* bi_phys_segments valid */
+#define BIO_CLONED     2       /* doesn't own data */
+#define BIO_BOUNCED    3       /* bio is a bounce bio */
+#define BIO_USER_MAPPED 4      /* contains user pages */
+#define BIO_NULL_MAPPED 5      /* contains invalid user pages */
+#define BIO_QUIET      6       /* Make BIO Quiet */
+#define BIO_CHAIN      7       /* chained bio, ->bi_remaining in effect */
+#define BIO_REFFED     8       /* bio has elevated ->bi_cnt */
+
+/*
+ * Flags starting here get preserved by bio_reset() - this includes
+ * BVEC_POOL_IDX()
+ */
+#define BIO_RESET_BITS 10
+
+/*
+ * We support 6 different bvec pools, the last one is magic in that it
+ * is backed by a mempool.
+ */
+#define BVEC_POOL_NR           6
+#define BVEC_POOL_MAX          (BVEC_POOL_NR - 1)
+
+/*
+ * Top 4 bits of bio flags indicate the pool the bvecs came from.  We add
+ * 1 to the actual index so that 0 indicates that there are no bvecs to be
+ * freed.
+ */
+#define BVEC_POOL_BITS         (4)
+#define BVEC_POOL_OFFSET       (16 - BVEC_POOL_BITS)
+#define BVEC_POOL_IDX(bio)     ((bio)->bi_flags >> BVEC_POOL_OFFSET)
+
+/*
+ * Operations and flags common to the bio and request structures.
+ * We use 8 bits for encoding the operation, and the remaining 24 for flags.
+ *
+ * The least significant bit of the operation number indicates the data
+ * transfer direction:
+ *
+ *   - if the least significant bit is set transfers are TO the device
+ *   - if the least significant bit is not set transfers are FROM the device
+ *
+ * If a operation does not transfer data the least significant bit has no
+ * meaning.
+ */
+#define REQ_OP_BITS    8
+#define REQ_OP_MASK    ((1 << REQ_OP_BITS) - 1)
+#define REQ_FLAG_BITS  24
+
+enum req_opf {
+       /* read sectors from the device */
+       REQ_OP_READ             = 0,
+       /* write sectors to the device */
+       REQ_OP_WRITE            = 1,
+       /* flush the volatile write cache */
+       REQ_OP_FLUSH            = 2,
+       /* discard sectors */
+       REQ_OP_DISCARD          = 3,
+       /* get zone information */
+       REQ_OP_ZONE_REPORT      = 4,
+       /* securely erase sectors */
+       REQ_OP_SECURE_ERASE     = 5,
+       /* seset a zone write pointer */
+       REQ_OP_ZONE_RESET       = 6,
+       /* write the same sector many times */
+       REQ_OP_WRITE_SAME       = 7,
+       /* write the zero filled sector many times */
+       REQ_OP_WRITE_ZEROES     = 8,
+
+       /* SCSI passthrough using struct scsi_request */
+       REQ_OP_SCSI_IN          = 32,
+       REQ_OP_SCSI_OUT         = 33,
+       /* Driver private requests */
+       REQ_OP_DRV_IN           = 34,
+       REQ_OP_DRV_OUT          = 35,
+
+       REQ_OP_LAST,
+};
+
+enum req_flag_bits {
+       __REQ_FAILFAST_DEV =    /* no driver retries of device errors */
+               REQ_OP_BITS,
+       __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */
+       __REQ_FAILFAST_DRIVER,  /* no driver retries of driver errors */
+       __REQ_SYNC,             /* request is sync (sync write or read) */
+       __REQ_META,             /* metadata io request */
+       __REQ_PRIO,             /* boost priority in cfq */
+       __REQ_NOMERGE,          /* don't touch this for merging */
+       __REQ_IDLE,             /* anticipate more IO after this one */
+       __REQ_INTEGRITY,        /* I/O includes block integrity payload */
+       __REQ_FUA,              /* forced unit access */
+       __REQ_PREFLUSH,         /* request for cache flush */
+       __REQ_RAHEAD,           /* read ahead, can fail anytime */
+       __REQ_BACKGROUND,       /* background IO */
+       __REQ_NR_BITS,          /* stops here */
+};
+
+#define REQ_SYNC               (1ULL << __REQ_SYNC)
+#define REQ_META               (1ULL << __REQ_META)
+#define REQ_PRIO               (1ULL << __REQ_PRIO)
+
+#define REQ_NOMERGE_FLAGS      (REQ_PREFLUSH | REQ_FUA)
+
+#define bio_op(bio) \
+       ((bio)->bi_opf & REQ_OP_MASK)
+
+static inline void bio_set_op_attrs(struct bio *bio, unsigned op,
+               unsigned op_flags)
+{
+       bio->bi_opf = op | op_flags;
+}
+
+#define REQ_RAHEAD             (1ULL << __REQ_RAHEAD)
+#define REQ_THROTTLED          (1ULL << __REQ_THROTTLED)
+
+#define REQ_FUA                        (1ULL << __REQ_FUA)
+#define REQ_PREFLUSH           (1ULL << __REQ_PREFLUSH)
+
+#define RW_MASK                        REQ_OP_WRITE
+
+#define READ                   REQ_OP_READ
+#define WRITE                  REQ_OP_WRITE
+
+#define READ_SYNC              REQ_SYNC
+#define WRITE_SYNC             (REQ_SYNC)
+#define WRITE_ODIRECT          REQ_SYNC
+#define WRITE_FLUSH            (REQ_SYNC | REQ_PREFLUSH)
+#define WRITE_FUA              (REQ_SYNC | REQ_FUA)
+#define WRITE_FLUSH_FUA                (REQ_SYNC | REQ_PREFLUSH | REQ_FUA)
+
+#endif /* __LINUX_BLK_TYPES_H */