Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Revert "nvme: add support for the Write Zeroes command"

This reverts commit 6d31e3ba232ea22458b2f36b6d3f2f9f11bf3fa4.

This causes bootup problems for me both on my laptop and my desktop.
What they have in common is that they have NVMe disks with dm-crypt, but
it's not the same controller, so it's not controller-specific.

Jens does not see it on his machine (also NVMe), so it's presumably
something that triggers just on bootup. Possibly related to dm-crypt
and the fact that I mark my luks volume with "allow-discards" in
/etc/crypttab.

It's 100% repeatable for me, which made it fairly straightforward to
bisect the problem to this commit. Small mercies.

So we don't know what the reason is yet, but the revert is needed to get
things going again.

Acked-by: Jens Axboe <axboe@fb.com>
Cc: Chaitanya Kulkarni <chaitanya.kulkarni@hgst.com>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

-21
-21
drivers/nvme/host/core.c
··· 263 263 return BLK_MQ_RQ_QUEUE_OK; 264 264 } 265 265 266 - static inline void nvme_setup_write_zeroes(struct nvme_ns *ns, 267 - struct request *req, struct nvme_command *cmnd) 268 - { 269 - struct nvme_write_zeroes_cmd *write_zeroes = &cmnd->write_zeroes; 270 - 271 - memset(cmnd, 0, sizeof(*cmnd)); 272 - write_zeroes->opcode = nvme_cmd_write_zeroes; 273 - write_zeroes->nsid = cpu_to_le32(ns->ns_id); 274 - write_zeroes->slba = 275 - cpu_to_le64(nvme_block_nr(ns, blk_rq_pos(req))); 276 - write_zeroes->length = 277 - cpu_to_le16((blk_rq_bytes(req) >> ns->lba_shift) - 1); 278 - write_zeroes->control = 0; 279 - } 280 - 281 266 static inline void nvme_setup_rw(struct nvme_ns *ns, struct request *req, 282 267 struct nvme_command *cmnd) 283 268 { ··· 315 330 nvme_setup_flush(ns, cmd); 316 331 else if (req_op(req) == REQ_OP_DISCARD) 317 332 ret = nvme_setup_discard(ns, req, cmd); 318 - else if (req_op(req) == REQ_OP_WRITE_ZEROES) 319 - nvme_setup_write_zeroes(ns, req, cmd); 320 333 else 321 334 nvme_setup_rw(ns, req, cmd); 322 335 ··· 935 952 936 953 if (ns->ctrl->oncs & NVME_CTRL_ONCS_DSM) 937 954 nvme_config_discard(ns); 938 - if (ns->ctrl->oncs & NVME_CTRL_ONCS_WRITE_ZEROES) 939 - blk_queue_max_write_zeroes_sectors(ns->queue, 940 - ((u32)(USHRT_MAX + 1) * bs) >> 9); 941 - 942 955 blk_mq_unfreeze_queue(disk->queue); 943 956 } 944 957