diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/bio.h | 125 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 66 | ||||
| -rw-r--r-- | include/linux/fs.h | 38 |
3 files changed, 99 insertions, 130 deletions
diff --git a/include/linux/bio.h b/include/linux/bio.h index 7fc5606e6ea..4d379c8250a 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
| @@ -138,55 +138,83 @@ struct bio { | |||
| 138 | #define BIO_POOL_IDX(bio) ((bio)->bi_flags >> BIO_POOL_OFFSET) | 138 | #define BIO_POOL_IDX(bio) ((bio)->bi_flags >> BIO_POOL_OFFSET) |
| 139 | 139 | ||
| 140 | /* | 140 | /* |
| 141 | * bio bi_rw flags | 141 | * Request flags. For use in the cmd_flags field of struct request, and in |
| 142 | * | 142 | * bi_rw of struct bio. Note that some flags are only valid in either one. |
| 143 | * bit 0 -- data direction | ||
| 144 | * If not set, bio is a read from device. If set, it's a write to device. | ||
| 145 | * bit 1 -- fail fast device errors | ||
| 146 | * bit 2 -- fail fast transport errors | ||
| 147 | * bit 3 -- fail fast driver errors | ||
| 148 | * bit 4 -- rw-ahead when set | ||
| 149 | * bit 5 -- barrier | ||
| 150 | * Insert a serialization point in the IO queue, forcing previously | ||
| 151 | * submitted IO to be completed before this one is issued. | ||
| 152 | * bit 6 -- synchronous I/O hint. | ||
| 153 | * bit 7 -- Unplug the device immediately after submitting this bio. | ||
| 154 | * bit 8 -- metadata request | ||
| 155 | * Used for tracing to differentiate metadata and data IO. May also | ||
| 156 | * get some preferential treatment in the IO scheduler | ||
| 157 | * bit 9 -- discard sectors | ||
| 158 | * Informs the lower level device that this range of sectors is no longer | ||
| 159 | * used by the file system and may thus be freed by the device. Used | ||
| 160 | * for flash based storage. | ||
| 161 | * Don't want driver retries for any fast fail whatever the reason. | ||
| 162 | * bit 10 -- Tell the IO scheduler not to wait for more requests after this | ||
| 163 | one has been submitted, even if it is a SYNC request. | ||
| 164 | */ | 143 | */ |
| 165 | enum bio_rw_flags { | 144 | enum rq_flag_bits { |
| 166 | BIO_RW, | 145 | /* common flags */ |
| 167 | BIO_RW_FAILFAST_DEV, | 146 | __REQ_WRITE, /* not set, read. set, write */ |
| 168 | BIO_RW_FAILFAST_TRANSPORT, | 147 | __REQ_FAILFAST_DEV, /* no driver retries of device errors */ |
| 169 | BIO_RW_FAILFAST_DRIVER, | 148 | __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ |
| 170 | /* above flags must match REQ_* */ | 149 | __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ |
| 171 | BIO_RW_AHEAD, | 150 | |
| 172 | BIO_RW_BARRIER, | 151 | __REQ_HARDBARRIER, /* may not be passed by drive either */ |
| 173 | BIO_RW_SYNCIO, | 152 | __REQ_SYNC, /* request is sync (sync write or read) */ |
| 174 | BIO_RW_UNPLUG, | 153 | __REQ_META, /* metadata io request */ |
| 175 | BIO_RW_META, | 154 | __REQ_DISCARD, /* request to discard sectors */ |
| 176 | BIO_RW_DISCARD, | 155 | __REQ_NOIDLE, /* don't anticipate more IO after this one */ |
| 177 | BIO_RW_NOIDLE, | 156 | |
| 157 | /* bio only flags */ | ||
| 158 | __REQ_UNPLUG, /* unplug the immediately after submission */ | ||
| 159 | __REQ_RAHEAD, /* read ahead, can fail anytime */ | ||
| 160 | |||
| 161 | /* request only flags */ | ||
| 162 | __REQ_SORTED, /* elevator knows about this request */ | ||
| 163 | __REQ_SOFTBARRIER, /* may not be passed by ioscheduler */ | ||
| 164 | __REQ_FUA, /* forced unit access */ | ||
| 165 | __REQ_NOMERGE, /* don't touch this for merging */ | ||
| 166 | __REQ_STARTED, /* drive already may have started this one */ | ||
| 167 | __REQ_DONTPREP, /* don't call prep for this one */ | ||
| 168 | __REQ_QUEUED, /* uses queueing */ | ||
| 169 | __REQ_ELVPRIV, /* elevator private data attached */ | ||
| 170 | __REQ_FAILED, /* set if the request failed */ | ||
| 171 | __REQ_QUIET, /* don't worry about errors */ | ||
| 172 | __REQ_PREEMPT, /* set for "ide_preempt" requests */ | ||
| 173 | __REQ_ORDERED_COLOR, /* is before or after barrier */ | ||
| 174 | __REQ_ALLOCED, /* request came from our alloc pool */ | ||
| 175 | __REQ_COPY_USER, /* contains copies of user pages */ | ||
| 176 | __REQ_INTEGRITY, /* integrity metadata has been remapped */ | ||
| 177 | __REQ_IO_STAT, /* account I/O stat */ | ||
| 178 | __REQ_MIXED_MERGE, /* merge of different types, fail separately */ | ||
| 179 | __REQ_NR_BITS, /* stops here */ | ||
| 178 | }; | 180 | }; |
| 179 | 181 | ||
| 180 | /* | 182 | #define REQ_WRITE (1 << __REQ_WRITE) |
| 181 | * First four bits must match between bio->bi_rw and rq->cmd_flags, make | 183 | #define REQ_FAILFAST_DEV (1 << __REQ_FAILFAST_DEV) |
| 182 | * that explicit here. | 184 | #define REQ_FAILFAST_TRANSPORT (1 << __REQ_FAILFAST_TRANSPORT) |
| 183 | */ | 185 | #define REQ_FAILFAST_DRIVER (1 << __REQ_FAILFAST_DRIVER) |
| 184 | #define BIO_RW_RQ_MASK 0xf | 186 | #define REQ_HARDBARRIER (1 << __REQ_HARDBARRIER) |
| 185 | 187 | #define REQ_SYNC (1 << __REQ_SYNC) | |
| 186 | static inline bool bio_rw_flagged(struct bio *bio, enum bio_rw_flags flag) | 188 | #define REQ_META (1 << __REQ_META) |
| 187 | { | 189 | #define REQ_DISCARD (1 << __REQ_DISCARD) |
| 188 | return (bio->bi_rw & (1 << flag)) != 0; | 190 | #define REQ_NOIDLE (1 << __REQ_NOIDLE) |
| 189 | } | 191 | |
| 192 | #define REQ_FAILFAST_MASK \ | ||
| 193 | (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) | ||
| 194 | #define REQ_COMMON_MASK \ | ||
| 195 | (REQ_WRITE | REQ_FAILFAST_MASK | REQ_HARDBARRIER | REQ_SYNC | \ | ||
| 196 | REQ_META| REQ_DISCARD | REQ_NOIDLE) | ||
| 197 | |||
| 198 | #define REQ_UNPLUG (1 << __REQ_UNPLUG) | ||
| 199 | #define REQ_RAHEAD (1 << __REQ_RAHEAD) | ||
| 200 | |||
| 201 | #define REQ_SORTED (1 << __REQ_SORTED) | ||
| 202 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) | ||
| 203 | #define REQ_FUA (1 << __REQ_FUA) | ||
| 204 | #define REQ_NOMERGE (1 << __REQ_NOMERGE) | ||
| 205 | #define REQ_STARTED (1 << __REQ_STARTED) | ||
| 206 | #define REQ_DONTPREP (1 << __REQ_DONTPREP) | ||
| 207 | #define REQ_QUEUED (1 << __REQ_QUEUED) | ||
| 208 | #define REQ_ELVPRIV (1 << __REQ_ELVPRIV) | ||
| 209 | #define REQ_FAILED (1 << __REQ_FAILED) | ||
| 210 | #define REQ_QUIET (1 << __REQ_QUIET) | ||
| 211 | #define REQ_PREEMPT (1 << __REQ_PREEMPT) | ||
| 212 | #define REQ_ORDERED_COLOR (1 << __REQ_ORDERED_COLOR) | ||
| 213 | #define REQ_ALLOCED (1 << __REQ_ALLOCED) | ||
| 214 | #define REQ_COPY_USER (1 << __REQ_COPY_USER) | ||
| 215 | #define REQ_INTEGRITY (1 << __REQ_INTEGRITY) | ||
| 216 | #define REQ_IO_STAT (1 << __REQ_IO_STAT) | ||
| 217 | #define REQ_MIXED_MERGE (1 << __REQ_MIXED_MERGE) | ||
| 190 | 218 | ||
| 191 | /* | 219 | /* |
| 192 | * upper 16 bits of bi_rw define the io priority of this bio | 220 | * upper 16 bits of bi_rw define the io priority of this bio |
| @@ -211,7 +239,10 @@ static inline bool bio_rw_flagged(struct bio *bio, enum bio_rw_flags flag) | |||
| 211 | #define bio_offset(bio) bio_iovec((bio))->bv_offset | 239 | #define bio_offset(bio) bio_iovec((bio))->bv_offset |
| 212 | #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx) | 240 | #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx) |
| 213 | #define bio_sectors(bio) ((bio)->bi_size >> 9) | 241 | #define bio_sectors(bio) ((bio)->bi_size >> 9) |
| 214 | #define bio_empty_barrier(bio) (bio_rw_flagged(bio, BIO_RW_BARRIER) && !bio_has_data(bio) && !bio_rw_flagged(bio, BIO_RW_DISCARD)) | 242 | #define bio_empty_barrier(bio) \ |
| 243 | ((bio->bi_rw & REQ_HARDBARRIER) && \ | ||
| 244 | !bio_has_data(bio) && \ | ||
| 245 | !(bio->bi_rw & REQ_DISCARD)) | ||
| 215 | 246 | ||
| 216 | static inline unsigned int bio_cur_bytes(struct bio *bio) | 247 | static inline unsigned int bio_cur_bytes(struct bio *bio) |
| 217 | { | 248 | { |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 3ecd28ef9ba..3fc0f590861 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -84,70 +84,6 @@ enum { | |||
| 84 | REQ_LB_OP_FLUSH = 0x41, /* flush request */ | 84 | REQ_LB_OP_FLUSH = 0x41, /* flush request */ |
| 85 | }; | 85 | }; |
| 86 | 86 | ||
| 87 | /* | ||
| 88 | * request type modified bits. first four bits match BIO_RW* bits, important | ||
| 89 | */ | ||
| 90 | enum rq_flag_bits { | ||
| 91 | __REQ_RW, /* not set, read. set, write */ | ||
| 92 | __REQ_FAILFAST_DEV, /* no driver retries of device errors */ | ||
| 93 | __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ | ||
| 94 | __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ | ||
| 95 | /* above flags must match BIO_RW_* */ | ||
| 96 | __REQ_DISCARD, /* request to discard sectors */ | ||
| 97 | __REQ_SORTED, /* elevator knows about this request */ | ||
| 98 | __REQ_SOFTBARRIER, /* may not be passed by ioscheduler */ | ||
| 99 | __REQ_HARDBARRIER, /* may not be passed by drive either */ | ||
| 100 | __REQ_FUA, /* forced unit access */ | ||
| 101 | __REQ_NOMERGE, /* don't touch this for merging */ | ||
| 102 | __REQ_STARTED, /* drive already may have started this one */ | ||
| 103 | __REQ_DONTPREP, /* don't call prep for this one */ | ||
| 104 | __REQ_QUEUED, /* uses queueing */ | ||
| 105 | __REQ_ELVPRIV, /* elevator private data attached */ | ||
| 106 | __REQ_FAILED, /* set if the request failed */ | ||
| 107 | __REQ_QUIET, /* don't worry about errors */ | ||
| 108 | __REQ_PREEMPT, /* set for "ide_preempt" requests */ | ||
| 109 | __REQ_ORDERED_COLOR, /* is before or after barrier */ | ||
| 110 | __REQ_RW_SYNC, /* request is sync (sync write or read) */ | ||
| 111 | __REQ_ALLOCED, /* request came from our alloc pool */ | ||
| 112 | __REQ_RW_META, /* metadata io request */ | ||
| 113 | __REQ_COPY_USER, /* contains copies of user pages */ | ||
| 114 | __REQ_INTEGRITY, /* integrity metadata has been remapped */ | ||
| 115 | __REQ_NOIDLE, /* Don't anticipate more IO after this one */ | ||
| 116 | __REQ_IO_STAT, /* account I/O stat */ | ||
| 117 | __REQ_MIXED_MERGE, /* merge of different types, fail separately */ | ||
| 118 | __REQ_NR_BITS, /* stops here */ | ||
| 119 | }; | ||
| 120 | |||
| 121 | #define REQ_RW (1 << __REQ_RW) | ||
| 122 | #define REQ_FAILFAST_DEV (1 << __REQ_FAILFAST_DEV) | ||
| 123 | #define REQ_FAILFAST_TRANSPORT (1 << __REQ_FAILFAST_TRANSPORT) | ||
| 124 | #define REQ_FAILFAST_DRIVER (1 << __REQ_FAILFAST_DRIVER) | ||
| 125 | #define REQ_DISCARD (1 << __REQ_DISCARD) | ||
| 126 | #define REQ_SORTED (1 << __REQ_SORTED) | ||
| 127 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) | ||
| 128 | #define REQ_HARDBARRIER (1 << __REQ_HARDBARRIER) | ||
| 129 | #define REQ_FUA (1 << __REQ_FUA) | ||
| 130 | #define REQ_NOMERGE (1 << __REQ_NOMERGE) | ||
| 131 | #define REQ_STARTED (1 << __REQ_STARTED) | ||
| 132 | #define REQ_DONTPREP (1 << __REQ_DONTPREP) | ||
| 133 | #define REQ_QUEUED (1 << __REQ_QUEUED) | ||
| 134 | #define REQ_ELVPRIV (1 << __REQ_ELVPRIV) | ||
| 135 | #define REQ_FAILED (1 << __REQ_FAILED) | ||
| 136 | #define REQ_QUIET (1 << __REQ_QUIET) | ||
| 137 | #define REQ_PREEMPT (1 << __REQ_PREEMPT) | ||
| 138 | #define REQ_ORDERED_COLOR (1 << __REQ_ORDERED_COLOR) | ||
| 139 | #define REQ_RW_SYNC (1 << __REQ_RW_SYNC) | ||
| 140 | #define REQ_ALLOCED (1 << __REQ_ALLOCED) | ||
| 141 | #define REQ_RW_META (1 << __REQ_RW_META) | ||
| 142 | #define REQ_COPY_USER (1 << __REQ_COPY_USER) | ||
| 143 | #define REQ_INTEGRITY (1 << __REQ_INTEGRITY) | ||
| 144 | #define REQ_NOIDLE (1 << __REQ_NOIDLE) | ||
| 145 | #define REQ_IO_STAT (1 << __REQ_IO_STAT) | ||
| 146 | #define REQ_MIXED_MERGE (1 << __REQ_MIXED_MERGE) | ||
| 147 | |||
| 148 | #define REQ_FAILFAST_MASK (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | \ | ||
| 149 | REQ_FAILFAST_DRIVER) | ||
| 150 | |||
| 151 | #define BLK_MAX_CDB 16 | 87 | #define BLK_MAX_CDB 16 |
| 152 | 88 | ||
| 153 | /* | 89 | /* |
| @@ -631,7 +567,7 @@ enum { | |||
| 631 | */ | 567 | */ |
| 632 | static inline bool rw_is_sync(unsigned int rw_flags) | 568 | static inline bool rw_is_sync(unsigned int rw_flags) |
| 633 | { | 569 | { |
| 634 | return !(rw_flags & REQ_RW) || (rw_flags & REQ_RW_SYNC); | 570 | return !(rw_flags & REQ_WRITE) || (rw_flags & REQ_SYNC); |
| 635 | } | 571 | } |
| 636 | 572 | ||
| 637 | static inline bool rq_is_sync(struct request *rq) | 573 | static inline bool rq_is_sync(struct request *rq) |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 59887883149..c5c92943c76 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -144,29 +144,31 @@ struct inodes_stat_t { | |||
| 144 | * of this IO. | 144 | * of this IO. |
| 145 | * | 145 | * |
| 146 | */ | 146 | */ |
| 147 | #define RW_MASK 1 | 147 | #define RW_MASK 1 |
| 148 | #define RWA_MASK 2 | 148 | #define RWA_MASK 2 |
| 149 | #define READ 0 | 149 | |
| 150 | #define WRITE 1 | 150 | #define READ 0 |
| 151 | #define READA 2 /* read-ahead - don't block if no resources */ | 151 | #define WRITE 1 |
| 152 | #define SWRITE 3 /* for ll_rw_block() - wait for buffer lock */ | 152 | #define READA 2 /* readahead - don't block if no resources */ |
| 153 | #define READ_SYNC (READ | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG)) | 153 | #define SWRITE 3 /* for ll_rw_block() - wait for buffer lock */ |
| 154 | #define READ_META (READ | (1 << BIO_RW_META)) | 154 | |
| 155 | #define WRITE_SYNC_PLUG (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE)) | 155 | #define READ_SYNC (READ | REQ_SYNC | REQ_UNPLUG) |
| 156 | #define WRITE_SYNC (WRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG)) | 156 | #define READ_META (READ | REQ_META) |
| 157 | #define WRITE_ODIRECT_PLUG (WRITE | (1 << BIO_RW_SYNCIO)) | 157 | #define WRITE_SYNC_PLUG (WRITE | REQ_SYNC | REQ_NOIDLE) |
| 158 | #define WRITE_META (WRITE | (1 << BIO_RW_META)) | 158 | #define WRITE_SYNC (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG) |
| 159 | #define SWRITE_SYNC_PLUG \ | 159 | #define WRITE_ODIRECT_PLUG (WRITE | REQ_SYNC) |
| 160 | (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE)) | 160 | #define WRITE_META (WRITE | REQ_META) |
| 161 | #define SWRITE_SYNC (SWRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG)) | 161 | #define WRITE_BARRIER (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG | \ |
| 162 | #define WRITE_BARRIER (WRITE_SYNC | (1 << BIO_RW_BARRIER)) | 162 | REQ_HARDBARRIER) |
| 163 | #define SWRITE_SYNC_PLUG (SWRITE | REQ_SYNC | REQ_NOIDLE) | ||
| 164 | #define SWRITE_SYNC (SWRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG) | ||
| 163 | 165 | ||
| 164 | /* | 166 | /* |
| 165 | * These aren't really reads or writes, they pass down information about | 167 | * These aren't really reads or writes, they pass down information about |
| 166 | * parts of device that are now unused by the file system. | 168 | * parts of device that are now unused by the file system. |
| 167 | */ | 169 | */ |
| 168 | #define DISCARD_NOBARRIER (WRITE | (1 << BIO_RW_DISCARD)) | 170 | #define DISCARD_NOBARRIER (WRITE | REQ_DISCARD) |
| 169 | #define DISCARD_BARRIER (DISCARD_NOBARRIER | (1 << BIO_RW_BARRIER)) | 171 | #define DISCARD_BARRIER (WRITE | REQ_DISCARD | REQ_HARDBARRIER) |
| 170 | 172 | ||
| 171 | #define SEL_IN 1 | 173 | #define SEL_IN 1 |
| 172 | #define SEL_OUT 2 | 174 | #define SEL_OUT 2 |
