Skip to content

Commit 6d31e3b

Browse files
ChaitanayaKulkarniaxboe
authored andcommitted
nvme: add support for the Write Zeroes command
Allow write zeroes operations (REQ_OP_WRITE_ZEROES) on the block device, if the device supports optional command bit set for write zeroes. Add support to setup write zeroes command. Set maximum possible write zeroes sectors in one write zeroes command according to nvme write zeroes command definition. Signed-off-by: Chaitanya Kulkarni <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 3b7c33b commit 6d31e3b

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

drivers/nvme/host/core.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,21 @@ static inline int nvme_setup_discard(struct nvme_ns *ns, struct request *req,
272272
return BLK_MQ_RQ_QUEUE_OK;
273273
}
274274

275+
static inline void nvme_setup_write_zeroes(struct nvme_ns *ns,
276+
struct request *req, struct nvme_command *cmnd)
277+
{
278+
struct nvme_write_zeroes_cmd *write_zeroes = &cmnd->write_zeroes;
279+
280+
memset(cmnd, 0, sizeof(*cmnd));
281+
write_zeroes->opcode = nvme_cmd_write_zeroes;
282+
write_zeroes->nsid = cpu_to_le32(ns->ns_id);
283+
write_zeroes->slba =
284+
cpu_to_le64(nvme_block_nr(ns, blk_rq_pos(req)));
285+
write_zeroes->length =
286+
cpu_to_le16((blk_rq_bytes(req) >> ns->lba_shift) - 1);
287+
write_zeroes->control = 0;
288+
}
289+
275290
static inline void nvme_setup_rw(struct nvme_ns *ns, struct request *req,
276291
struct nvme_command *cmnd)
277292
{
@@ -325,6 +340,8 @@ int nvme_setup_cmd(struct nvme_ns *ns, struct request *req,
325340
nvme_setup_flush(ns, cmd);
326341
else if (req_op(req) == REQ_OP_DISCARD)
327342
ret = nvme_setup_discard(ns, req, cmd);
343+
else if (req_op(req) == REQ_OP_WRITE_ZEROES)
344+
nvme_setup_write_zeroes(ns, req, cmd);
328345
else
329346
nvme_setup_rw(ns, req, cmd);
330347

@@ -943,6 +960,10 @@ static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id)
943960

944961
if (ns->ctrl->oncs & NVME_CTRL_ONCS_DSM)
945962
nvme_config_discard(ns);
963+
if (ns->ctrl->oncs & NVME_CTRL_ONCS_WRITE_ZEROES)
964+
blk_queue_max_write_zeroes_sectors(ns->queue,
965+
((u32)(USHRT_MAX + 1) * bs) >> 9);
966+
946967
blk_mq_unfreeze_queue(disk->queue);
947968
}
948969

0 commit comments

Comments
 (0)