From: Chaitanya Kulkarni <kch@nvidia.com>
To: <linux-block@vger.kernel.org>, <linux-raid@vger.kernel.org>,
<linux-nvme@lists.infradead.org>, <linux-fsdevel@vger.kernel.org>
Cc: <axboe@kernel.dk>, <agk@redhat.com>, <song@kernel.org>,
<djwong@kernel.org>, <kbusch@kernel.org>, <hch@lst.de>,
<sagi@grimberg.me>, <jejb@linux.ibm.com>,
<martin.petersen@oracle.com>, <viro@zeniv.linux.org.uk>,
<javier@javigon.com>, <johannes.thumshirn@wdc.com>,
<bvanassche@acm.org>, <dongli.zhang@oracle.com>,
<ming.lei@redhat.com>, <willy@infradead.org>,
<jefflexu@linux.alibaba.com>, <josef@toxicpanda.com>,
<clm@fb.com>, <dsterba@suse.com>, <jack@suse.com>,
<tytso@mit.edu>, <adilger.kernel@dilger.ca>, <jlayton@kernel.org>,
<idryomov@gmail.com>, <danil.kipnis@cloud.ionos.com>,
<ebiggers@google.com>, <jinpu.wang@cloud.ionos.com>,
Chaitanya Kulkarni <kch@nvidia.com>
Subject: [PATCH 2/6] nvme: add support for the Verify command
Date: Thu, 30 Jun 2022 02:14:02 -0700 [thread overview]
Message-ID: <20220630091406.19624-3-kch@nvidia.com> (raw)
In-Reply-To: <20220630091406.19624-1-kch@nvidia.com>
Allow verify operations (REQ_OP_VERIFY) on the block device, if the
device supports optional command bit set for verify. Add support
to setup verify command. Set maximum possible verify sectors in one
verify command according to maximum hardware sectors supported by the
controller.
Signed-off-by: Chaitanya Kulkarni <kch@nvidia.com>
---
drivers/nvme/host/core.c | 33 +++++++++++++++++++++++++++++++++
include/linux/nvme.h | 19 +++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 24165daee3c8..ef27580886b1 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -838,6 +838,19 @@ static inline blk_status_t nvme_setup_write_zeroes(struct nvme_ns *ns,
return BLK_STS_OK;
}
+static inline blk_status_t nvme_setup_verify(struct nvme_ns *ns,
+ struct request *req, struct nvme_command *cmnd)
+{
+ cmnd->verify.opcode = nvme_cmd_verify;
+ cmnd->verify.nsid = cpu_to_le32(ns->head->ns_id);
+ cmnd->verify.slba =
+ cpu_to_le64(nvme_sect_to_lba(ns, blk_rq_pos(req)));
+ cmnd->verify.length =
+ cpu_to_le16((blk_rq_bytes(req) >> ns->lba_shift) - 1);
+ cmnd->verify.control = 0;
+ return BLK_STS_OK;
+}
+
static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns,
struct request *req, struct nvme_command *cmnd,
enum nvme_opcode op)
@@ -943,6 +956,9 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req)
case REQ_OP_WRITE_ZEROES:
ret = nvme_setup_write_zeroes(ns, req, cmd);
break;
+ case REQ_OP_VERIFY:
+ ret = nvme_setup_verify(ns, req, cmd);
+ break;
case REQ_OP_DISCARD:
ret = nvme_setup_discard(ns, req, cmd);
break;
@@ -1672,6 +1688,22 @@ static void nvme_config_discard(struct gendisk *disk, struct nvme_ns *ns)
blk_queue_max_write_zeroes_sectors(queue, UINT_MAX);
}
+static void nvme_config_verify(struct gendisk *disk, struct nvme_ns *ns)
+{
+ u64 max_blocks;
+
+ if (!(ns->ctrl->oncs & NVME_CTRL_ONCS_VERIFY))
+ return;
+
+ if (ns->ctrl->max_hw_sectors == UINT_MAX)
+ max_blocks = (u64)USHRT_MAX + 1;
+ else
+ max_blocks = ns->ctrl->max_hw_sectors + 1;
+
+ blk_queue_max_verify_sectors(disk->queue,
+ nvme_lba_to_sect(ns, max_blocks));
+}
+
static bool nvme_ns_ids_equal(struct nvme_ns_ids *a, struct nvme_ns_ids *b)
{
return uuid_equal(&a->uuid, &b->uuid) &&
@@ -1871,6 +1903,7 @@ static void nvme_update_disk_info(struct gendisk *disk,
set_capacity_and_notify(disk, capacity);
nvme_config_discard(disk, ns);
+ nvme_config_verify(disk, ns);
blk_queue_max_write_zeroes_sectors(disk->queue,
ns->ctrl->max_zeroes_sectors);
}
diff --git a/include/linux/nvme.h b/include/linux/nvme.h
index 29ec3e3481ff..578bb4931665 100644
--- a/include/linux/nvme.h
+++ b/include/linux/nvme.h
@@ -363,6 +363,7 @@ enum {
NVME_CTRL_ONCS_WRITE_ZEROES = 1 << 3,
NVME_CTRL_ONCS_RESERVATIONS = 1 << 5,
NVME_CTRL_ONCS_TIMESTAMP = 1 << 6,
+ NVME_CTRL_ONCS_VERIFY = 1 << 7,
NVME_CTRL_VWC_PRESENT = 1 << 0,
NVME_CTRL_OACS_SEC_SUPP = 1 << 0,
NVME_CTRL_OACS_NS_MNGT_SUPP = 1 << 3,
@@ -1001,6 +1002,23 @@ struct nvme_write_zeroes_cmd {
__le16 appmask;
};
+struct nvme_verify_cmd {
+ __u8 opcode;
+ __u8 flags;
+ __u16 command_id;
+ __le32 nsid;
+ __u64 rsvd2;
+ __le64 metadata;
+ union nvme_data_ptr dptr;
+ __le64 slba;
+ __le16 length;
+ __le16 control;
+ __le32 rsvd3;
+ __le32 reftag;
+ __le16 eapptag;
+ __le16 eappmask;
+};
+
enum nvme_zone_mgmt_action {
NVME_ZONE_CLOSE = 0x1,
NVME_ZONE_FINISH = 0x2,
@@ -1539,6 +1557,7 @@ struct nvme_command {
struct nvme_format_cmd format;
struct nvme_dsm_cmd dsm;
struct nvme_write_zeroes_cmd write_zeroes;
+ struct nvme_verify_cmd verify;
struct nvme_zone_mgmt_send_cmd zms;
struct nvme_zone_mgmt_recv_cmd zmr;
struct nvme_abort_cmd abort;
--
2.29.0
next prev parent reply other threads:[~2022-06-30 9:15 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-30 9:14 [PATCH 0/6] block: add support for REQ_OP_VERIFY Chaitanya Kulkarni
2022-06-30 9:14 ` [PATCH 1/6] " Chaitanya Kulkarni
2022-06-30 16:18 ` Darrick J. Wong
2022-07-05 16:50 ` Chaitanya Kulkarni
2022-07-05 17:57 ` Darrick J. Wong
2022-07-06 1:32 ` Chaitanya Kulkarni
2022-07-05 8:34 ` Christoph Hellwig
2022-07-05 23:55 ` Chaitanya Kulkarni
2022-06-30 9:14 ` Chaitanya Kulkarni [this message]
2022-06-30 16:24 ` [PATCH 2/6] nvme: add support for the Verify command Keith Busch
2022-07-05 8:34 ` Christoph Hellwig
2022-07-05 23:56 ` Chaitanya Kulkarni
2022-06-30 9:14 ` [PATCH 3/6] nvmet: add Verify command support for bdev-ns Chaitanya Kulkarni
2022-06-30 9:14 ` [PATCH 4/6] nvmet: add Verify emulation " Chaitanya Kulkarni
2022-07-05 8:35 ` Christoph Hellwig
2022-07-06 0:00 ` Chaitanya Kulkarni
2022-06-30 9:14 ` [PATCH 5/6] nvmet: add verify emulation support for file-ns Chaitanya Kulkarni
2022-07-05 8:36 ` Christoph Hellwig
2022-07-06 0:06 ` Chaitanya Kulkarni
2022-06-30 9:14 ` [PATCH 6/6] null_blk: add REQ_OP_VERIFY support Chaitanya Kulkarni
2022-07-05 8:38 ` [PATCH 0/6] block: add support for REQ_OP_VERIFY Christoph Hellwig
2022-07-05 16:47 ` Chaitanya Kulkarni
2022-07-06 17:42 ` Matthew Wilcox
2022-07-13 9:14 ` Chaitanya Kulkarni
2022-07-13 9:36 ` Johannes Thumshirn
2022-07-13 12:17 ` Matthew Wilcox
2022-07-13 14:04 ` Keith Busch
2022-12-01 18:12 ` Chaitanya Kulkarni
2022-12-01 19:39 ` Matthew Wilcox
2022-12-02 7:16 ` Hannes Reinecke
2022-12-02 14:58 ` Keith Busch
2022-12-02 17:33 ` Clay Mayers
2022-12-02 18:58 ` Keith Busch
2022-12-09 4:52 ` Martin K. Petersen
2022-12-10 13:06 ` Carlos Carvalho
2022-12-12 6:30 ` hch
2022-12-03 4:19 ` Javier González
2022-12-04 20:29 ` Keith Busch
2022-12-08 20:06 ` Javier González
2022-12-08 20:02 ` Matthew Wilcox
2022-12-02 7:13 ` Hannes Reinecke
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220630091406.19624-3-kch@nvidia.com \
--to=kch@nvidia.com \
--cc=adilger.kernel@dilger.ca \
--cc=agk@redhat.com \
--cc=axboe@kernel.dk \
--cc=bvanassche@acm.org \
--cc=clm@fb.com \
--cc=danil.kipnis@cloud.ionos.com \
--cc=djwong@kernel.org \
--cc=dongli.zhang@oracle.com \
--cc=dsterba@suse.com \
--cc=ebiggers@google.com \
--cc=hch@lst.de \
--cc=idryomov@gmail.com \
--cc=jack@suse.com \
--cc=javier@javigon.com \
--cc=jefflexu@linux.alibaba.com \
--cc=jejb@linux.ibm.com \
--cc=jinpu.wang@cloud.ionos.com \
--cc=jlayton@kernel.org \
--cc=johannes.thumshirn@wdc.com \
--cc=josef@toxicpanda.com \
--cc=kbusch@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=linux-raid@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=ming.lei@redhat.com \
--cc=sagi@grimberg.me \
--cc=song@kernel.org \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.