mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	block: Align max_hw_sectors to logical blocksize
Block device drivers do not have to call blk_queue_max_hw_sectors() to set a limit on request size if the default limit BLK_SAFE_MAX_SECTORS is acceptable. However, this limit (255 sectors) may not be aligned to the device logical block size which cannot be used as is for a request maximum size. This is the case for the null_blk device driver. Modify blk_queue_max_hw_sectors() to make sure that the request size limits specified by the max_hw_sectors and max_sectors queue limits are always aligned to the device logical block size. Additionally, to avoid introducing a dependence on the execution order of this function with blk_queue_logical_block_size(), also modify blk_queue_logical_block_size() to perform the same alignment when the logical block size is set after max_hw_sectors. Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
		
							parent
							
								
									2e896d8951
								
							
						
					
					
						commit
						817046ecdd
					
				
					 1 changed files with 18 additions and 5 deletions
				
			
		| 
						 | 
					@ -157,10 +157,16 @@ void blk_queue_max_hw_sectors(struct request_queue *q, unsigned int max_hw_secto
 | 
				
			||||||
		       __func__, max_hw_sectors);
 | 
							       __func__, max_hw_sectors);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						max_hw_sectors = round_down(max_hw_sectors,
 | 
				
			||||||
 | 
									    limits->logical_block_size >> SECTOR_SHIFT);
 | 
				
			||||||
	limits->max_hw_sectors = max_hw_sectors;
 | 
						limits->max_hw_sectors = max_hw_sectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	max_sectors = min_not_zero(max_hw_sectors, limits->max_dev_sectors);
 | 
						max_sectors = min_not_zero(max_hw_sectors, limits->max_dev_sectors);
 | 
				
			||||||
	max_sectors = min_t(unsigned int, max_sectors, BLK_DEF_MAX_SECTORS);
 | 
						max_sectors = min_t(unsigned int, max_sectors, BLK_DEF_MAX_SECTORS);
 | 
				
			||||||
 | 
						max_sectors = round_down(max_sectors,
 | 
				
			||||||
 | 
									 limits->logical_block_size >> SECTOR_SHIFT);
 | 
				
			||||||
	limits->max_sectors = max_sectors;
 | 
						limits->max_sectors = max_sectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	q->backing_dev_info->io_pages = max_sectors >> (PAGE_SHIFT - 9);
 | 
						q->backing_dev_info->io_pages = max_sectors >> (PAGE_SHIFT - 9);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(blk_queue_max_hw_sectors);
 | 
					EXPORT_SYMBOL(blk_queue_max_hw_sectors);
 | 
				
			||||||
| 
						 | 
					@ -321,13 +327,20 @@ EXPORT_SYMBOL(blk_queue_max_segment_size);
 | 
				
			||||||
 **/
 | 
					 **/
 | 
				
			||||||
void blk_queue_logical_block_size(struct request_queue *q, unsigned int size)
 | 
					void blk_queue_logical_block_size(struct request_queue *q, unsigned int size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	q->limits.logical_block_size = size;
 | 
						struct queue_limits *limits = &q->limits;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (q->limits.physical_block_size < size)
 | 
						limits->logical_block_size = size;
 | 
				
			||||||
		q->limits.physical_block_size = size;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (q->limits.io_min < q->limits.physical_block_size)
 | 
						if (limits->physical_block_size < size)
 | 
				
			||||||
		q->limits.io_min = q->limits.physical_block_size;
 | 
							limits->physical_block_size = size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (limits->io_min < limits->physical_block_size)
 | 
				
			||||||
 | 
							limits->io_min = limits->physical_block_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						limits->max_hw_sectors =
 | 
				
			||||||
 | 
							round_down(limits->max_hw_sectors, size >> SECTOR_SHIFT);
 | 
				
			||||||
 | 
						limits->max_sectors =
 | 
				
			||||||
 | 
							round_down(limits->max_sectors, size >> SECTOR_SHIFT);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(blk_queue_logical_block_size);
 | 
					EXPORT_SYMBOL(blk_queue_logical_block_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue