NVMe: Format fix when going from 4k sector size to 512 bytes
PATCH 1/1 NVMe: Format fix when going from 4k sector size to 512 bytes
If you format a device with a 4k sector size back to 512 bytes, the queue limit values for physical block size and IO sizes were not getting updated; only the logical block size was being updated. This patch adds code to update the physical block and IO sizes.
--- drivers/nvme/host/core.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/nvme/host/core.c +5 -1
@@ -1336,6 +1336,7 @@ static void nvme_update_disk_info(struct gendisk *disk, {sector_t capacity =le64_to_cpup (&id->nsze) << (ns->lba_shift -9 );unsigned stream_alignment =0 ; +unsigned short bs;if (ns->ctrl->nr_streams && ns->sws && ns->sgs) stream_alignment = ns->sws * ns->sgs;
@@ -1343,7 +1344,10 @@ static void nvme_update_disk_info(struct gendisk *disk,blk_mq_freeze_queue (disk->queue);blk_integrity_unregister (disk); -blk_queue_logical_block_size (disk->queue,1 << ns->lba_shift); + bs =1 << ns->lba_shift; +blk_queue_logical_block_size (disk->queue, bs); +blk_queue_physical_block_size (ns->queue, bs); +blk_limits_io_min (&ns->queue->limits, bs);if (ns->ms && !ns->ext && (ns->ctrl->ops->flags &NVME_F_METADATA_SUPPORTED ))nvme_init_integrity (disk, ns->ms, ns->pi_type);
Signature · 1 line
2.14.2.746.g8fb8a94
PATCH 1/1 NVMe: Format fix when going from 4k sector size to 512 bytes
Quoted 5 lines · Jeff Lien
If you format a device with a 4k sector size back to 512 bytes, the queue limit values for physical block size and IO sizes were not getting updated; only the logical block size was being updated. This patch adds code to update the physical block and IO sizes.
That's true, though I always considered that to be a happy accident. As far as I know, most NVMe SSDs advertising a 512 byte logical block are only emulating that size, and are natively 4k or larger.
PATCH 1/1 NVMe: Format fix when going from 4k sector size to 512 bytes
In reply to Jeff LienJeff,
drivers/nvme/host/core.c static void nvme_update_disk_info(struct gendisk *disk, · line 1349
Quoted 2 lines
drivers/nvme/host/core.c +2
-0+blk_queue_logical_block_size (disk->queue, bs); +blk_queue_physical_block_size (ns->queue, bs);
A bit messy that you mix ns->queue and disk->queue.
Quoted 1 line
+
blk_limits_io_min(&ns->queue->limits, bs);
blk_queue_io_min(foo->queue, bs);
Otherwise OK.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
PATCH 1/1 NVMe: Format fix when going from 4k sector size to 512 bytes
Quoted 7 lines · Martin K. Petersen
Jeff,
drivers/nvme/host/core.c static void nvme_update_disk_info(struct gendisk *disk, · line 1349
Quoted 2 lines
drivers/nvme/host/core.c +2
-0+blk_queue_logical_block_size (disk->queue, bs); +blk_queue_physical_block_size (ns->queue, bs);A bit messy that you mix
ns->queueanddisk->queue.
It's not just ugly, but actually broken. We must use disk->queue both times to correctly handle multipathing.