diff options
author | Martin K. Petersen <martin.petersen@oracle.com> | 2010-01-15 01:55:07 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-01-22 15:18:07 -0800 |
commit | 1bd24fdff4b0bd7f0a50f330165a82be690a919c (patch) | |
tree | 785103386aa3646173a10d1b017fe857804fa521 | |
parent | 8a9c3f5c34a93fd4635aa739810280c4752eaa6e (diff) | |
download | lwn-1bd24fdff4b0bd7f0a50f330165a82be690a919c.tar.gz lwn-1bd24fdff4b0bd7f0a50f330165a82be690a919c.zip |
block: Fix incorrect reporting of partition alignment
commit 81744ee44ab2845c16ffd7d6f762f7b4a49a4750 upstream
queue_sector_alignment_offset returned the wrong value which caused
partitions to report an incorrect alignment_offset. Since offset
calculation is needed several places it has been split into a separate
helper function.
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Tested-by: Mike Snitzer <snitzer@redhat.com>
Cc: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | include/linux/blkdev.h | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 221cecd86bd3..adf99c617cd3 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1114,11 +1114,18 @@ static inline int queue_alignment_offset(struct request_queue *q) return q->limits.alignment_offset; } +static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t offset) +{ + unsigned int granularity = max(lim->physical_block_size, lim->io_min); + + offset &= granularity - 1; + return (granularity + lim->alignment_offset - offset) & (granularity - 1); +} + static inline int queue_sector_alignment_offset(struct request_queue *q, sector_t sector) { - return ((sector << 9) - q->limits.alignment_offset) - & (q->limits.io_min - 1); + return queue_limit_alignment_offset(&q->limits, sector << 9); } static inline int bdev_alignment_offset(struct block_device *bdev) |