Skip to contentSkip to conversation

NVMe: Format fix when going from 4k sector size to 512 bytes

PATCH Superseded Jeff Lien 4 participants 4 messages Dec 14, 2017 – Dec 15, 2017 NVMe

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Jeff Lien

author
#0 lore raw

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.

Signed-off-by Jeff Lien <jeff.lien at wdc.com>
---
 drivers/nvme/host/core.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/nvme/host/core.c +5 -1
index f837d666cbd4..035ed9e57f70 100644
@@ -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
#1 lore raw

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.

#2 lore raw

PATCH 1/1 NVMe: Format fix when going from 4k sector size to 512 bytes

In reply to Jeff Lien

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->queue and disk->queue.

Quoted 1 line

+ blk_limits_io_min(&ns->queue->limits, bs);

blk_queue_io_min(foo->queue, bs);

Otherwise OK.

Reviewed-by Martin K. Petersen <martin.petersen at oracle.com>
Signature · 1 line
Martin K. Petersen	Oracle Linux Engineering
#3 lore raw

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->queue and disk->queue.

It's not just ugly, but actually broken. We must use disk->queue both times to correctly handle multipathing.