Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2150821 authored by Mike Christie's avatar Mike Christie Committed by Jens Axboe
Browse files

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: default avatarMike Christie <mchristi@redhat.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 4e49ea4a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -44,6 +44,9 @@
#define BIO_MAX_SIZE		(BIO_MAX_PAGES << PAGE_SHIFT)
#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
 */
+24 −0
Original line number Diff line number Diff line
@@ -242,6 +242,30 @@ enum rq_flag_bits {
#define REQ_HASHED		(1ULL << __REQ_HASHED)
#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;
#define BLK_QC_T_NONE	-1U
#define BLK_QC_T_SHIFT	16
+9 −1
Original line number Diff line number Diff line
@@ -200,6 +200,13 @@ struct request {
	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)
{
	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 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
+24 −2
Original line number Diff line number Diff line
@@ -2464,15 +2464,37 @@ extern void make_bad_inode(struct inode *);
extern bool is_bad_inode(struct inode *);

#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
 */
#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
 */
#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,
				   struct block_device *bdev);