| From: Keith Busch <keith.busch@intel.com> |
| Date: Tue, 26 Jun 2018 09:14:58 -0600 |
| Subject: block: Fix transfer when chunk sectors exceeds max |
| |
| commit 15bfd21fbc5d35834b9ea383dc458a1f0c9e3434 upstream. |
| |
| A device may have boundary restrictions where the number of sectors |
| between boundaries exceeds its max transfer size. In this case, we need |
| to cap the max size to the smaller of the two limits. |
| |
| Reported-by: Jitendra Bhivare <jitendra.bhivare@broadcom.com> |
| Tested-by: Jitendra Bhivare <jitendra.bhivare@broadcom.com> |
| Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Keith Busch <keith.busch@intel.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| include/linux/blkdev.h | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/include/linux/blkdev.h |
| +++ b/include/linux/blkdev.h |
| @@ -929,8 +929,8 @@ static inline unsigned int blk_max_size_ |
| if (!q->limits.chunk_sectors) |
| return q->limits.max_sectors; |
| |
| - return q->limits.chunk_sectors - |
| - (offset & (q->limits.chunk_sectors - 1)); |
| + return min(q->limits.max_sectors, (unsigned int)(q->limits.chunk_sectors - |
| + (offset & (q->limits.chunk_sectors - 1)))); |
| } |
| |
| static inline unsigned int blk_rq_get_max_sectors(struct request *rq) |