diff --git a/block/blk-flush.c b/block/blk-flush.c index 71faf07a626f887aaa01b220ca7dafbbf68818bf..7676249102700b18107adf1702c05608536bf32a 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -470,7 +470,7 @@ struct blk_flush_queue *blk_alloc_flush_queue(int node, int cmd_size, gfp_t flags) { struct blk_flush_queue *fq; - int rq_sz = sizeof(struct request_wrapper); + int rq_sz = sizeof(struct request) + sizeof(struct request_wrapper); fq = kzalloc_node(sizeof(*fq), flags, node); if (!fq) diff --git a/block/blk-mq.c b/block/blk-mq.c index 427457d43d07017bf91f257f0c9667b739b9b05b..21ea971094e298913541f985d9e15985cfa2ee85 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -2593,8 +2593,9 @@ static int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, * rq_size is the size of the request plus driver payload, rounded * to the cacheline size */ - rq_size = round_up(sizeof(struct request_wrapper) + set->cmd_size, - cache_line_size()); + rq_size = round_up(sizeof(struct request) + + sizeof(struct request_wrapper) + set->cmd_size, + cache_line_size()); left = rq_size * depth; for (i = 0; i < depth; ) { diff --git a/block/blk-mq.h b/block/blk-mq.h index 1c86f7d56e722b1d3cf7e93b44928af0d0c3d50d..6254abe9c11274bf104fbb455c83e8c06071ccf6 100644 --- a/block/blk-mq.h +++ b/block/blk-mq.h @@ -37,6 +37,19 @@ struct blk_mq_ctx { struct kobject kobj; } ____cacheline_aligned_in_smp; +struct request_wrapper { + /* Time that I/O was counted in part_get_stat_info(). */ + u64 stat_time_ns; +}; + +static inline struct request_wrapper *request_to_wrapper(struct request *rq) +{ + unsigned long addr = (unsigned long)rq; + + addr += sizeof(*rq) + rq->q->tag_set->cmd_size; + return (struct request_wrapper *)addr; +} + void blk_mq_exit_queue(struct request_queue *q); int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr); void blk_mq_wake_waiters(struct request_queue *q); diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index bcbeadb2d0f068dd912347f15bfe2b3008fae38d..f11f51e2465f5dea81fef1810d7368e11ff005cb 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -2359,7 +2359,7 @@ scsi_ioctl_reset(struct scsi_device *dev, int __user *arg) return -EIO; error = -EIO; - rq = kzalloc(sizeof(struct request_wrapper) + sizeof(struct scsi_cmnd) + + rq = kzalloc(sizeof(struct request) + sizeof(struct scsi_cmnd) + shost->hostt->cmd_size, GFP_KERNEL); if (!rq) goto out_put_autopm_host; diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index aa0c8ef9a50fea4efd306d8b5b6ba17d7311fd73..f3d78b939e0145b6a79a2f61e57f2193af1b8750 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -303,15 +303,6 @@ struct blk_mq_queue_data { KABI_RESERVE(1) }; -struct request_wrapper { - struct request rq; - - /* Time that I/O was counted in part_get_stat_info(). */ - u64 stat_time_ns; -}; - -#define request_to_wrapper(_rq) container_of(_rq, struct request_wrapper, rq) - typedef bool (busy_iter_fn)(struct blk_mq_hw_ctx *, struct request *, void *, bool); typedef bool (busy_tag_iter_fn)(struct request *, void *, bool); @@ -606,7 +597,7 @@ static inline bool blk_should_fake_timeout(struct request_queue *q) */ static inline struct request *blk_mq_rq_from_pdu(void *pdu) { - return pdu - sizeof(struct request_wrapper); + return pdu - sizeof(struct request); } /** @@ -620,7 +611,7 @@ static inline struct request *blk_mq_rq_from_pdu(void *pdu) */ static inline void *blk_mq_rq_to_pdu(struct request *rq) { - return request_to_wrapper(rq) + 1; + return rq + 1; } static inline struct blk_mq_hw_ctx *queue_hctx(struct request_queue *q, int id)