History

block: fix an integer overflow in logical block size

Logical block size has type unsigned short. That means that it can be at most 32768. However, there are architectures that can run with 64k pages (for example arm64) and on these architectures, it may be possible to create block devices with 64k block size. For exmaple (run this on an architecture with 64k pages): Mount will fail with this error because it tries to read the superblock using 2-sector access: device-mapper: writecache: I/O is not aligned, sector 2, size 1024, block size 65536 EXT4-fs (dm-0): unable to read superblock This patch changes the logical block size from unsigned short to unsigned int to avoid the overflow.

Mikulas Patocka committed 6 years ago

Commit ad6bf881 parent 16c731f4 files · +7 −7Browse files

Showing the changes to include/linux (1 of 4 files). Show all

Unified · Split

include/linux/blkdev.h+4−4
@@ -328,6 +328,7 @@ struct queue_limits { · 327 unmodified lines
328 unsigned int max_sectors;328 unsigned int max_sectors;
329 unsigned int max_segment_size;329 unsigned int max_segment_size;
330 unsigned int physical_block_size;330 unsigned int physical_block_size;
331 unsigned int logical_block_size;
331 unsigned int alignment_offset;332 unsigned int alignment_offset;
332 unsigned int io_min;333 unsigned int io_min;
333 unsigned int io_opt;334 unsigned int io_opt;
@@ -338,7 +339,6 @@ struct queue_limits { · 4 unmodified lines
338 unsigned int discard_granularity;339 unsigned int discard_granularity;
339 unsigned int discard_alignment;340 unsigned int discard_alignment;
340 341
341 unsigned short logical_block_size;
342 unsigned short max_segments;342 unsigned short max_segments;
343 unsigned short max_integrity_segments;343 unsigned short max_integrity_segments;
344 unsigned short max_discard_segments;344 unsigned short max_discard_segments;
@@ -1077,7 +1077,7 @@ extern void blk_queue_max_write_same_sectors(struct request_queue *q, · 732 unmodified lines
1077 unsigned int max_write_same_sectors);1077 unsigned int max_write_same_sectors);
1078extern void blk_queue_max_write_zeroes_sectors(struct request_queue *q,1078extern void blk_queue_max_write_zeroes_sectors(struct request_queue *q,
1079 unsigned int max_write_same_sectors);1079 unsigned int max_write_same_sectors);
1080extern void blk_queue_logical_block_size(struct request_queue *, unsigned short);1080extern void blk_queue_logical_block_size(struct request_queue *, unsigned int);
1081extern void blk_queue_physical_block_size(struct request_queue *, unsigned int);1081extern void blk_queue_physical_block_size(struct request_queue *, unsigned int);
1082extern void blk_queue_alignment_offset(struct request_queue *q,1082extern void blk_queue_alignment_offset(struct request_queue *q,
1083 unsigned int alignment);1083 unsigned int alignment);
@@ -1291,7 +1291,7 @@ static inline unsigned int queue_max_segment_size(const struct request_queue *q) · 207 unmodified lines
1291 return q->limits.max_segment_size;1291 return q->limits.max_segment_size;
1292}1292}
1293 1293
1294static inline unsigned short queue_logical_block_size(const struct request_queue *q)1294static inline unsigned queue_logical_block_size(const struct request_queue *q)
1295{1295{
1296 int retval = 512;1296 int retval = 512;
1297 1297
@@ -1301,7 +1301,7 @@ static inline unsigned short queue_logical_block_size(const struct request_queue · 3 unmodified lines
1301 return retval;1301 return retval;
1302}1302}
1303 1303
1304static inline unsigned short bdev_logical_block_size(struct block_device *bdev)1304static inline unsigned int bdev_logical_block_size(struct block_device *bdev)
1305{1305{
1306 return queue_logical_block_size(bdev_get_queue(bdev));1306 return queue_logical_block_size(bdev_get_queue(bdev));
1307}1307}