Messages in this thread Patch in this message | | | Date | Fri, 16 Mar 2012 15:40:06 +0800 | From | Shaohua Li <> | Subject | [patch]blk: use correct sectors limitation for discard request |
| |
Subject: blk: use correct sectors limitation for discard request
max_discard_sectors doesn't equal to max_sectors/max_hw_sectors. Without this, discard request merge might be ignored.
Signed-off-by: Shaohua Li <shli@fusionio.com> --- block/blk-merge.c | 13 ++++++++----- include/linux/blkdev.h | 5 +++++ 2 files changed, 13 insertions(+), 5 deletions(-)
Index: linux/block/blk-merge.c =================================================================== --- linux.orig/block/blk-merge.c 2012-03-14 09:53:15.574255985 +0800 +++ linux/block/blk-merge.c 2012-03-14 11:06:01.504462095 +0800 @@ -228,9 +228,11 @@ no_merge: int ll_back_merge_fn(struct request_queue *q, struct request *req, struct bio *bio) { - unsigned short max_sectors; + unsigned int max_sectors;
- if (unlikely(req->cmd_type == REQ_TYPE_BLOCK_PC)) + if (unlikely(req->cmd_flags & REQ_DISCARD)) + max_sectors = queue_max_discard_sectors(q); + else if (unlikely(req->cmd_type == REQ_TYPE_BLOCK_PC)) max_sectors = queue_max_hw_sectors(q); else max_sectors = queue_max_sectors(q); @@ -252,14 +254,15 @@ int ll_back_merge_fn(struct request_queu int ll_front_merge_fn(struct request_queue *q, struct request *req, struct bio *bio) { - unsigned short max_sectors; + unsigned int max_sectors;
- if (unlikely(req->cmd_type == REQ_TYPE_BLOCK_PC)) + if (unlikely(req->cmd_flags & REQ_DISCARD)) + max_sectors = queue_max_discard_sectors(q); + else if (unlikely(req->cmd_type == REQ_TYPE_BLOCK_PC)) max_sectors = queue_max_hw_sectors(q); else max_sectors = queue_max_sectors(q);
- if (blk_rq_sectors(req) + bio_sectors(bio) > max_sectors) { req->cmd_flags |= REQ_NOMERGE; if (req == q->last_merge) Index: linux/include/linux/blkdev.h =================================================================== --- linux.orig/include/linux/blkdev.h 2012-03-14 10:17:19.523960440 +0800 +++ linux/include/linux/blkdev.h 2012-03-14 10:57:22.324465357 +0800 @@ -1006,6 +1006,11 @@ static inline unsigned int queue_max_hw_ return q->limits.max_hw_sectors; }
+static inline unsigned int queue_max_discard_sectors(struct request_queue *q) +{ + return q->limits.max_discard_sectors; +} + static inline unsigned short queue_max_segments(struct request_queue *q) { return q->limits.max_segments;
| |