diff options
| author | Jens Axboe <jens.axboe@oracle.com> | 2007-09-27 07:01:25 -0400 |
|---|---|---|
| committer | Jens Axboe <jens.axboe@oracle.com> | 2007-10-16 05:03:56 -0400 |
| commit | bf2de6f5a4faf0197268f18d08969b003b87b6e8 (patch) | |
| tree | 16830a15a7effea352445a7aba5dbb433314d3eb /include | |
| parent | c07e2b41291853b19fff11ceee3657df252a4e42 (diff) | |
block: Initial support for data-less (or empty) barrier support
This implements functionality to pass down or insert a barrier
in a queue, without having data attached to it. The ->prepare_flush_fn()
infrastructure from data barriers are reused to provide this
functionality.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/bio.h | 19 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 1 |
2 files changed, 18 insertions, 2 deletions
diff --git a/include/linux/bio.h b/include/linux/bio.h index 089a8bc55dd4..4da441337d6e 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
| @@ -176,13 +176,28 @@ struct bio { | |||
| 176 | #define bio_offset(bio) bio_iovec((bio))->bv_offset | 176 | #define bio_offset(bio) bio_iovec((bio))->bv_offset |
| 177 | #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx) | 177 | #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx) |
| 178 | #define bio_sectors(bio) ((bio)->bi_size >> 9) | 178 | #define bio_sectors(bio) ((bio)->bi_size >> 9) |
| 179 | #define bio_cur_sectors(bio) (bio_iovec(bio)->bv_len >> 9) | ||
| 180 | #define bio_data(bio) (page_address(bio_page((bio))) + bio_offset((bio))) | ||
| 181 | #define bio_barrier(bio) ((bio)->bi_rw & (1 << BIO_RW_BARRIER)) | 179 | #define bio_barrier(bio) ((bio)->bi_rw & (1 << BIO_RW_BARRIER)) |
| 182 | #define bio_sync(bio) ((bio)->bi_rw & (1 << BIO_RW_SYNC)) | 180 | #define bio_sync(bio) ((bio)->bi_rw & (1 << BIO_RW_SYNC)) |
| 183 | #define bio_failfast(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST)) | 181 | #define bio_failfast(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST)) |
| 184 | #define bio_rw_ahead(bio) ((bio)->bi_rw & (1 << BIO_RW_AHEAD)) | 182 | #define bio_rw_ahead(bio) ((bio)->bi_rw & (1 << BIO_RW_AHEAD)) |
| 185 | #define bio_rw_meta(bio) ((bio)->bi_rw & (1 << BIO_RW_META)) | 183 | #define bio_rw_meta(bio) ((bio)->bi_rw & (1 << BIO_RW_META)) |
| 184 | #define bio_empty_barrier(bio) (bio_barrier(bio) && !(bio)->bi_size) | ||
| 185 | |||
| 186 | static inline unsigned int bio_cur_sectors(struct bio *bio) | ||
| 187 | { | ||
| 188 | if (bio->bi_vcnt) | ||
| 189 | return bio_iovec(bio)->bv_len >> 9; | ||
| 190 | |||
| 191 | return 0; | ||
| 192 | } | ||
| 193 | |||
| 194 | static inline void *bio_data(struct bio *bio) | ||
| 195 | { | ||
| 196 | if (bio->bi_vcnt) | ||
| 197 | return page_address(bio_page(bio)) + bio_offset(bio); | ||
| 198 | |||
| 199 | return NULL; | ||
| 200 | } | ||
| 186 | 201 | ||
| 187 | /* | 202 | /* |
| 188 | * will die | 203 | * will die |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 610967992ddb..fb2ff749dc1f 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -540,6 +540,7 @@ enum { | |||
| 540 | #define blk_barrier_rq(rq) ((rq)->cmd_flags & REQ_HARDBARRIER) | 540 | #define blk_barrier_rq(rq) ((rq)->cmd_flags & REQ_HARDBARRIER) |
| 541 | #define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA) | 541 | #define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA) |
| 542 | #define blk_bidi_rq(rq) ((rq)->next_rq != NULL) | 542 | #define blk_bidi_rq(rq) ((rq)->next_rq != NULL) |
| 543 | #define blk_empty_barrier(rq) (blk_barrier_rq(rq) && blk_fs_request(rq) && !(rq)->hard_nr_sectors) | ||
| 543 | 544 | ||
| 544 | #define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist) | 545 | #define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist) |
| 545 | 546 | ||
