block: treat REQ_FUA and REQ_PREFLUSH as synchronous
[sfrench/cifs-2.6.git] / include / linux / blk_types.h
index cd395ecec99d0151f6caf405cb5653342b397182..107d23d18096647907484dd6ff42ab024bd4527f 100644 (file)
@@ -88,24 +88,6 @@ struct bio {
        struct bio_vec          bi_inline_vecs[0];
 };
 
-#define BIO_OP_SHIFT   (8 * FIELD_SIZEOF(struct bio, bi_opf) - REQ_OP_BITS)
-#define bio_flags(bio) ((bio)->bi_opf & ((1 << BIO_OP_SHIFT) - 1))
-#define bio_op(bio)    ((bio)->bi_opf >> BIO_OP_SHIFT)
-
-#define bio_set_op_attrs(bio, op, op_flags) do {                       \
-       if (__builtin_constant_p(op))                                   \
-               BUILD_BUG_ON((op) + 0U >= (1U << REQ_OP_BITS));         \
-       else                                                            \
-               WARN_ON_ONCE((op) + 0U >= (1U << REQ_OP_BITS));         \
-       if (__builtin_constant_p(op_flags))                             \
-               BUILD_BUG_ON((op_flags) + 0U >= (1U << BIO_OP_SHIFT));  \
-       else                                                            \
-               WARN_ON_ONCE((op_flags) + 0U >= (1U << BIO_OP_SHIFT));  \
-       (bio)->bi_opf = bio_flags(bio);                                 \
-       (bio)->bi_opf |= (((op) + 0U) << BIO_OP_SHIFT);                 \
-       (bio)->bi_opf |= (op_flags);                                    \
-} while (0)
-
 #define BIO_RESET_BYTES                offsetof(struct bio, bi_max_vecs)
 
 /*
@@ -119,6 +101,8 @@ struct bio {
 #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 */
+#define BIO_THROTTLED  9       /* This bio has already been subjected to
+                                * throttling rules. Don't do it again. */
 
 /*
  * Flags starting here get preserved by bio_reset() - this includes
@@ -145,50 +129,57 @@ struct bio {
 #endif /* CONFIG_BLOCK */
 
 /*
- * Request flags.  For use in the cmd_flags field of struct request, and in
- * bi_opf of struct bio.  Note that some flags are only valid in either one.
+ * 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.
  */
-enum rq_flag_bits {
-       /* common flags */
-       __REQ_FAILFAST_DEV,     /* no driver retries of device errors */
+#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,
+
+       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_NOIDLE,           /* don't 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 */
-
-       /* bio only flags */
        __REQ_RAHEAD,           /* read ahead, can fail anytime */
-       __REQ_THROTTLED,        /* This bio has already been subjected to
-                                * throttling rules. Don't do it again. */
-
-       /* request only flags */
-       __REQ_SORTED,           /* elevator knows about this request */
-       __REQ_SOFTBARRIER,      /* may not be passed by ioscheduler */
-       __REQ_NOMERGE,          /* don't touch this for merging */
-       __REQ_STARTED,          /* drive already may have started this one */
-       __REQ_DONTPREP,         /* don't call prep for this one */
-       __REQ_QUEUED,           /* uses queueing */
-       __REQ_ELVPRIV,          /* elevator private data attached */
-       __REQ_FAILED,           /* set if the request failed */
-       __REQ_QUIET,            /* don't worry about errors */
-       __REQ_PREEMPT,          /* set for "ide_preempt" requests and also
-                                  for requests for which the SCSI "quiesce"
-                                  state must be ignored. */
-       __REQ_ALLOCED,          /* request came from our alloc pool */
-       __REQ_COPY_USER,        /* contains copies of user pages */
-       __REQ_FLUSH_SEQ,        /* request for flush sequence */
-       __REQ_IO_STAT,          /* account I/O stat */
-       __REQ_MIXED_MERGE,      /* merge of different types, fail separately */
-       __REQ_PM,               /* runtime pm request */
-       __REQ_HASHED,           /* on IO scheduler merge hash */
-       __REQ_MQ_INFLIGHT,      /* track inflight for MQ */
        __REQ_NR_BITS,          /* stops here */
 };
 
@@ -198,54 +189,43 @@ enum rq_flag_bits {
 #define REQ_SYNC               (1ULL << __REQ_SYNC)
 #define REQ_META               (1ULL << __REQ_META)
 #define REQ_PRIO               (1ULL << __REQ_PRIO)
+#define REQ_NOMERGE            (1ULL << __REQ_NOMERGE)
 #define REQ_NOIDLE             (1ULL << __REQ_NOIDLE)
 #define REQ_INTEGRITY          (1ULL << __REQ_INTEGRITY)
+#define REQ_FUA                        (1ULL << __REQ_FUA)
+#define REQ_PREFLUSH           (1ULL << __REQ_PREFLUSH)
+#define REQ_RAHEAD             (1ULL << __REQ_RAHEAD)
 
 #define REQ_FAILFAST_MASK \
        (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER)
-#define REQ_COMMON_MASK \
-       (REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | REQ_NOIDLE | \
-        REQ_PREFLUSH | REQ_FUA | REQ_INTEGRITY | REQ_NOMERGE)
-#define REQ_CLONE_MASK         REQ_COMMON_MASK
 
-/* This mask is used for both bio and request merge checking */
 #define REQ_NOMERGE_FLAGS \
-       (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_PREFLUSH | REQ_FUA | REQ_FLUSH_SEQ)
+       (REQ_NOMERGE | REQ_PREFLUSH | REQ_FUA)
 
-#define REQ_RAHEAD             (1ULL << __REQ_RAHEAD)
-#define REQ_THROTTLED          (1ULL << __REQ_THROTTLED)
+#define bio_op(bio) \
+       ((bio)->bi_opf & REQ_OP_MASK)
+#define req_op(req) \
+       ((req)->cmd_flags & REQ_OP_MASK)
 
-#define REQ_SORTED             (1ULL << __REQ_SORTED)
-#define REQ_SOFTBARRIER                (1ULL << __REQ_SOFTBARRIER)
-#define REQ_FUA                        (1ULL << __REQ_FUA)
-#define REQ_NOMERGE            (1ULL << __REQ_NOMERGE)
-#define REQ_STARTED            (1ULL << __REQ_STARTED)
-#define REQ_DONTPREP           (1ULL << __REQ_DONTPREP)
-#define REQ_QUEUED             (1ULL << __REQ_QUEUED)
-#define REQ_ELVPRIV            (1ULL << __REQ_ELVPRIV)
-#define REQ_FAILED             (1ULL << __REQ_FAILED)
-#define REQ_QUIET              (1ULL << __REQ_QUIET)
-#define REQ_PREEMPT            (1ULL << __REQ_PREEMPT)
-#define REQ_ALLOCED            (1ULL << __REQ_ALLOCED)
-#define REQ_COPY_USER          (1ULL << __REQ_COPY_USER)
-#define REQ_PREFLUSH           (1ULL << __REQ_PREFLUSH)
-#define REQ_FLUSH_SEQ          (1ULL << __REQ_FLUSH_SEQ)
-#define REQ_IO_STAT            (1ULL << __REQ_IO_STAT)
-#define REQ_MIXED_MERGE                (1ULL << __REQ_MIXED_MERGE)
-#define REQ_PM                 (1ULL << __REQ_PM)
-#define REQ_HASHED             (1ULL << __REQ_HASHED)
-#define REQ_MQ_INFLIGHT                (1ULL << __REQ_MQ_INFLIGHT)
-
-enum req_op {
-       REQ_OP_READ,
-       REQ_OP_WRITE,
-       REQ_OP_DISCARD,         /* request to discard sectors */
-       REQ_OP_SECURE_ERASE,    /* request to securely erase sectors */
-       REQ_OP_WRITE_SAME,      /* write same block many times */
-       REQ_OP_FLUSH,           /* request for cache flush */
-};
+/* obsolete, don't use in new code */
+#define bio_set_op_attrs(bio, op, op_flags) \
+       ((bio)->bi_opf |= (op | op_flags))
 
-#define REQ_OP_BITS 3
+static inline bool op_is_write(unsigned int op)
+{
+       return (op & 1);
+}
+
+/*
+ * Reads are always treated as synchronous, as are requests with the FUA or
+ * PREFLUSH flag.  Other operations may be marked as synchronous using the
+ * REQ_SYNC flag.
+ */
+static inline bool op_is_sync(unsigned int op)
+{
+       return (op & REQ_OP_MASK) == REQ_OP_READ ||
+               (op & (REQ_SYNC | REQ_FUA | REQ_PREFLUSH));
+}
 
 typedef unsigned int blk_qc_t;
 #define BLK_QC_T_NONE  -1U