block: add REQ_OP definitions and helpers
The following patches separate the operation (WRITE, READ, DISCARD, etc) from the rq_flag_bits flags. This patch adds definitions for request/bio operations (REQ_OPs) and adds request/bio accessors to get/set the op. In this patch the REQ_OPs match the REQ rq_flag_bits ones for compat reasons while all the code is converted to use the op accessors in the set. In the last patches the op will become a number and the accessors and helpers in this patch will be dropped or updated. Signed-off-by: Mike Christie <mchristi@redhat.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
4e49ea4a3d
commit
f21508211d
|
@ -44,6 +44,9 @@
|
||||||
#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_SHIFT)
|
#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_SHIFT)
|
||||||
#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9)
|
#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9)
|
||||||
|
|
||||||
|
#define bio_op(bio) (op_from_rq_bits((bio)->bi_rw))
|
||||||
|
#define bio_set_op_attrs(bio, op, flags) ((bio)->bi_rw |= (op | flags))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* upper 16 bits of bi_rw define the io priority of this bio
|
* upper 16 bits of bi_rw define the io priority of this bio
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -242,6 +242,30 @@ enum rq_flag_bits {
|
||||||
#define REQ_HASHED (1ULL << __REQ_HASHED)
|
#define REQ_HASHED (1ULL << __REQ_HASHED)
|
||||||
#define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT)
|
#define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT)
|
||||||
|
|
||||||
|
enum req_op {
|
||||||
|
REQ_OP_READ,
|
||||||
|
REQ_OP_WRITE = REQ_WRITE,
|
||||||
|
REQ_OP_DISCARD = REQ_DISCARD,
|
||||||
|
REQ_OP_WRITE_SAME = REQ_WRITE_SAME,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* tmp cpmpat. Users used to set the write bit for all non reads, but
|
||||||
|
* we will be dropping the bitmap use for ops. Support both until
|
||||||
|
* the end of the patchset.
|
||||||
|
*/
|
||||||
|
static inline int op_from_rq_bits(u64 flags)
|
||||||
|
{
|
||||||
|
if (flags & REQ_OP_DISCARD)
|
||||||
|
return REQ_OP_DISCARD;
|
||||||
|
else if (flags & REQ_OP_WRITE_SAME)
|
||||||
|
return REQ_OP_WRITE_SAME;
|
||||||
|
else if (flags & REQ_OP_WRITE)
|
||||||
|
return REQ_OP_WRITE;
|
||||||
|
else
|
||||||
|
return REQ_OP_READ;
|
||||||
|
}
|
||||||
|
|
||||||
typedef unsigned int blk_qc_t;
|
typedef unsigned int blk_qc_t;
|
||||||
#define BLK_QC_T_NONE -1U
|
#define BLK_QC_T_NONE -1U
|
||||||
#define BLK_QC_T_SHIFT 16
|
#define BLK_QC_T_SHIFT 16
|
||||||
|
|
|
@ -200,6 +200,13 @@ struct request {
|
||||||
struct request *next_rq;
|
struct request *next_rq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define req_op(req) (op_from_rq_bits((req)->cmd_flags))
|
||||||
|
#define req_set_op(req, op) ((req)->cmd_flags |= op)
|
||||||
|
#define req_set_op_attrs(req, op, flags) do { \
|
||||||
|
req_set_op(req, op); \
|
||||||
|
(req)->cmd_flags |= flags; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
static inline unsigned short req_get_ioprio(struct request *req)
|
static inline unsigned short req_get_ioprio(struct request *req)
|
||||||
{
|
{
|
||||||
return req->ioprio;
|
return req->ioprio;
|
||||||
|
@ -597,7 +604,8 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)
|
||||||
|
|
||||||
#define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist)
|
#define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist)
|
||||||
|
|
||||||
#define rq_data_dir(rq) ((int)((rq)->cmd_flags & 1))
|
#define rq_data_dir(rq) \
|
||||||
|
(op_is_write(op_from_rq_bits(rq->cmd_flags)) ? WRITE : READ)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Driver can handle struct request, if it either has an old style
|
* Driver can handle struct request, if it either has an old style
|
||||||
|
|
|
@ -2464,15 +2464,37 @@ extern void make_bad_inode(struct inode *);
|
||||||
extern bool is_bad_inode(struct inode *);
|
extern bool is_bad_inode(struct inode *);
|
||||||
|
|
||||||
#ifdef CONFIG_BLOCK
|
#ifdef CONFIG_BLOCK
|
||||||
|
/*
|
||||||
|
* tmp cpmpat. Users used to set the write bit for all non reads, but
|
||||||
|
* we will be dropping the bitmap use for ops. Support both until
|
||||||
|
* the end of the patchset.
|
||||||
|
*/
|
||||||
|
static inline bool op_is_write(unsigned long flags)
|
||||||
|
{
|
||||||
|
if (flags & (REQ_OP_WRITE | REQ_OP_WRITE_SAME | REQ_OP_DISCARD))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return READ, READA, or WRITE
|
* return READ, READA, or WRITE
|
||||||
*/
|
*/
|
||||||
#define bio_rw(bio) ((bio)->bi_rw & (RW_MASK | RWA_MASK))
|
static inline int bio_rw(struct bio *bio)
|
||||||
|
{
|
||||||
|
if (op_is_write(op_from_rq_bits(bio->bi_rw)))
|
||||||
|
return WRITE;
|
||||||
|
|
||||||
|
return bio->bi_rw & RWA_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return data direction, READ or WRITE
|
* return data direction, READ or WRITE
|
||||||
*/
|
*/
|
||||||
#define bio_data_dir(bio) ((bio)->bi_rw & 1)
|
static inline int bio_data_dir(struct bio *bio)
|
||||||
|
{
|
||||||
|
return op_is_write(op_from_rq_bits(bio->bi_rw)) ? WRITE : READ;
|
||||||
|
}
|
||||||
|
|
||||||
extern void check_disk_size_change(struct gendisk *disk,
|
extern void check_disk_size_change(struct gendisk *disk,
|
||||||
struct block_device *bdev);
|
struct block_device *bdev);
|
||||||
|
|
Loading…
Reference in New Issue