aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2009-12-29 02:35:35 -0500
committerJens Axboe <jens.axboe@oracle.com>2009-12-29 02:35:35 -0500
commit81744ee44ab2845c16ffd7d6f762f7b4a49a4750 (patch)
treec3d0cca0e71080ecd8423cef8af1c632fc444764 /include/linux
parent2f7a2d89a8b5915d89ad9ebeb0065db7d5831cea (diff)
block: Fix incorrect alignment offset reporting and update documentation
queue_sector_alignment_offset returned the wrong value which caused partitions to report an incorrect alignment_offset. Since offset alignment calculation is needed several places it has been split into a separate helper function. The topology stacking function has been updated accordingly. Furthermore, comments have been added to clarify how the stacking function works. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Tested-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/blkdev.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 784a919aa0d0..59b832be3044 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -1116,11 +1116,18 @@ static inline int queue_alignment_offset(struct request_queue *q)
1116 return q->limits.alignment_offset; 1116 return q->limits.alignment_offset;
1117} 1117}
1118 1118
1119static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t offset)
1120{
1121 unsigned int granularity = max(lim->physical_block_size, lim->io_min);
1122
1123 offset &= granularity - 1;
1124 return (granularity + lim->alignment_offset - offset) & (granularity - 1);
1125}
1126
1119static inline int queue_sector_alignment_offset(struct request_queue *q, 1127static inline int queue_sector_alignment_offset(struct request_queue *q,
1120 sector_t sector) 1128 sector_t sector)
1121{ 1129{
1122 return ((sector << 9) - q->limits.alignment_offset) 1130 return queue_limit_alignment_offset(&q->limits, sector << 9);
1123 & (q->limits.io_min - 1);
1124} 1131}
1125 1132
1126static inline int bdev_alignment_offset(struct block_device *bdev) 1133static inline int bdev_alignment_offset(struct block_device *bdev)