mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	scsi: sd: Fix wrong zone_write_granularity value during revalidate
When the sd driver revalidates host-managed SMR disks, it calls
disk_set_zoned() which changes the zone_write_granularity attribute value
to the logical block size regardless of the device type. After that, the sd
driver overwrites the value in sd_zbc_read_zone() with the physical block
size, since ZBC/ZAC requires this for host-managed disks. Between the calls
to disk_set_zoned() and sd_zbc_read_zone(), there exists a window where the
attribute shows the logical block size as the zone_write_granularity value,
which is wrong for host-managed disks. The duration of the window is from
20ms to 200ms, depending on report zone command execution time.
To avoid the wrong zone_write_granularity value between disk_set_zoned()
and sd_zbc_read_zone(), modify the value not in sd_zbc_read_zone() but
just after disk_set_zoned() call.
Fixes: a805a4fa4f ("block: introduce zone_write_granularity limit")
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Link: https://lore.kernel.org/r/20230306063024.3376959-1-shinichiro.kawasaki@wdc.com
Reviewed-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
			
			
This commit is contained in:
		
							parent
							
								
									11d9874c42
								
							
						
					
					
						commit
						288b3271d9
					
				
					 2 changed files with 6 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -2988,8 +2988,13 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if (sdkp->device->type == TYPE_ZBC) {
 | 
			
		||||
		/* Host-managed */
 | 
			
		||||
		/*
 | 
			
		||||
		 * Host-managed: Per ZBC and ZAC specifications, writes in
 | 
			
		||||
		 * sequential write required zones of host-managed devices must
 | 
			
		||||
		 * be aligned to the device physical block size.
 | 
			
		||||
		 */
 | 
			
		||||
		disk_set_zoned(sdkp->disk, BLK_ZONED_HM);
 | 
			
		||||
		blk_queue_zone_write_granularity(q, sdkp->physical_block_size);
 | 
			
		||||
	} else {
 | 
			
		||||
		sdkp->zoned = zoned;
 | 
			
		||||
		if (sdkp->zoned == 1) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -965,14 +965,6 @@ int sd_zbc_read_zones(struct scsi_disk *sdkp, u8 buf[SD_BUF_SIZE])
 | 
			
		|||
	disk_set_max_active_zones(disk, 0);
 | 
			
		||||
	nr_zones = round_up(sdkp->capacity, zone_blocks) >> ilog2(zone_blocks);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Per ZBC and ZAC specifications, writes in sequential write required
 | 
			
		||||
	 * zones of host-managed devices must be aligned to the device physical
 | 
			
		||||
	 * block size.
 | 
			
		||||
	 */
 | 
			
		||||
	if (blk_queue_zoned_model(q) == BLK_ZONED_HM)
 | 
			
		||||
		blk_queue_zone_write_granularity(q, sdkp->physical_block_size);
 | 
			
		||||
 | 
			
		||||
	sdkp->early_zone_info.nr_zones = nr_zones;
 | 
			
		||||
	sdkp->early_zone_info.zone_blocks = zone_blocks;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue