From: Christoph Hellwig <hch@lst.de>
To: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Cc: linux-nvme@lists.infradead.org, hch@lst.de, damien.lemoal@wdc.com
Subject: Re: [PATCH V13 2/4] nvmet: add ZBD over ZNS backend support
Date: Thu, 8 Apr 2021 09:23:37 +0200 [thread overview]
Message-ID: <20210408072337.GB24502@lst.de> (raw)
In-Reply-To: <20210408001427.20501-3-chaitanya.kulkarni@wdc.com>
> +static void nvmet_set_csi_zns_effects(struct nvme_effects_log *log)
Same naming nitpick as for the nvm version.
> switch (req->ns->csi) {
> case NVME_CSI_NVM:
> + return nvmet_copy_ns_identifier(req, NVME_NIDT_CSI,
> + NVME_NIDT_CSI_LEN,
> + &req->ns->csi, o);
> + case NVME_CSI_ZNS:
> + if (!IS_ENABLED(CONFIG_BLK_DEV_ZONED))
> + return NVME_SC_INVALID_IO_CMD_SET;
> +
This goes away with my comment on the previous patch.
> @@ -448,6 +456,15 @@ u16 nvmet_bdev_parse_io_cmd(struct nvmet_req *req)
> case nvme_cmd_write_zeroes:
> req->execute = nvmet_bdev_execute_write_zeroes;
> return 0;
> + case nvme_cmd_zone_append:
> + req->execute = nvmet_bdev_execute_zone_append;
> + return 0;
> + case nvme_cmd_zone_mgmt_recv:
> + req->execute = nvmet_bdev_execute_zone_mgmt_recv;
> + return 0;
> + case nvme_cmd_zone_mgmt_send:
> + req->execute = nvmet_bdev_execute_zone_mgmt_send;
I think we need a separate _parse for just ZNS. That way we can
do the ns.csi and IS_ENABLED check in one single place, and we
also don't need stubs for any of these functions as they are all
under the IS_ENABLED check and thus the compiler will never generate
a call to them for !CONFIG_BLK_DEV_ZONED.
> +static u16 nvmet_bdev_validate_zone_mgmt_recv(struct nvmet_req *req)
> +{
> + sector_t sect = nvmet_lba_to_sect(req->ns, req->cmd->zmr.slba);
> + u32 out_bufsize = (le32_to_cpu(req->cmd->zmr.numd) + 1) << 2;
> +
> + if (!bdev_is_zoned(req->ns->bdev))
> + return NVME_SC_INVALID_NS | NVME_SC_DNR;
I think checking the csi іn the nvmet_ns structure here is a lot
cleaner. And as mentioned abive I think we should do this once for
all zns-specific commands.
> +void nvmet_execute_identify_cns_cs_ctrl(struct nvmet_req *req)
> +{
> + u8 zasl = req->sq->ctrl->subsys->zasl;
> + struct nvmet_ctrl *ctrl = req->sq->ctrl;
> + struct nvme_id_ctrl_zns *id;
> + u16 status;
> +
> + if (req->cmd->identify.csi != NVME_CSI_ZNS) {
> + req->error_loc = offsetof(struct nvme_common_command, opcode);
> + status = NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
> + goto out;
> + }
The CSI check or rather a switch on the CSI with a default fail
needs to move into the common code, probably into the main parsing
function.
> +void nvmet_execute_identify_cns_cs_ns(struct nvmet_req *req)
> +{
> + struct nvme_id_ns_zns *id_zns;
> + u64 zsze;
> + u16 status;
> +
> + if (req->cmd->identify.csi != NVME_CSI_ZNS) {
> + req->error_loc = offsetof(struct nvme_common_command, opcode);
> + status = NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
> + goto out;
> + }
Same here.
> +static int nvmet_bdev_report_zone_cb(struct blk_zone *z, unsigned i, void *d)
> +{
> + struct nvmet_report_zone_data *rz = d;
> + struct nvme_zone_descriptor *entries = rz->rz->entries;
> + struct nvmet_ns *ns = rz->ns;
> + static const unsigned int blk_zcond_to_nvme_zstate[] = {
> + [BLK_ZONE_COND_EMPTY] = NVME_ZRASF_ZONE_STATE_EMPTY,
> + [BLK_ZONE_COND_IMP_OPEN] = NVME_ZRASF_ZONE_STATE_IMP_OPEN,
> + [BLK_ZONE_COND_EXP_OPEN] = NVME_ZRASF_ZONE_STATE_EXP_OPEN,
> + [BLK_ZONE_COND_CLOSED] = NVME_ZRASF_ZONE_STATE_CLOSED,
> + [BLK_ZONE_COND_READONLY] = NVME_ZRASF_ZONE_STATE_READONLY,
> + [BLK_ZONE_COND_FULL] = NVME_ZRASF_ZONE_STATE_FULL,
> + [BLK_ZONE_COND_OFFLINE] = NVME_ZRASF_ZONE_STATE_OFFLINE,
> + };
> +
> + if (rz->zrasf == NVME_ZRASF_ZONE_REPORT_ALL)
> + goto record_zone;
> +
> + /*
> + * Make sure this zone condition's value is mapped to NVMe ZNS zone
> + * condition value.
> + */
> + if (z->cond > ARRAY_SIZE(blk_zcond_to_nvme_zstate) ||
> + !blk_zcond_to_nvme_zstate[z->cond])
> + return -EINVAL;
> +
> + /* filter zone by condition */
> + if (blk_zcond_to_nvme_zstate[z->cond] != rz->zrasf)
> + return 0;
> +
> +record_zone:
While not bad per se I ind the structure a little odd. I'd move the
checks into a level of indentation instead.
_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme
next prev parent reply other threads:[~2021-04-08 7:24 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-08 0:14 [PATCH V13 0/4] nvmet: add ZBD backend support Chaitanya Kulkarni
2021-04-08 0:14 ` [PATCH V13 1/4] nvmet: add NVM Command Set Identifier support Chaitanya Kulkarni
2021-04-08 7:15 ` Christoph Hellwig
2021-04-08 0:14 ` [PATCH V13 2/4] nvmet: add ZBD over ZNS backend support Chaitanya Kulkarni
2021-04-08 7:23 ` Christoph Hellwig [this message]
2021-04-08 21:14 ` Chaitanya Kulkarni
2021-04-09 5:40 ` Christoph Hellwig
2021-04-09 5:42 ` Chaitanya Kulkarni
2021-04-09 7:09 ` Chaitanya Kulkarni
2021-04-09 9:53 ` Christoph Hellwig
2021-04-08 8:01 ` Damien Le Moal
2021-04-08 22:06 ` Chaitanya Kulkarni
2021-04-08 22:33 ` Damien Le Moal
2021-04-08 8:15 ` Damien Le Moal
2021-04-08 0:14 ` [PATCH V13 3/4] nvmet: add nvmet_req_bio put helper for backends Chaitanya Kulkarni
2021-04-08 0:14 ` [PATCH V13 4/4] nvmet: add req cns error complete helper Chaitanya Kulkarni
2021-04-08 7:24 ` Christoph Hellwig
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=20210408072337.GB24502@lst.de \
--to=hch@lst.de \
--cc=chaitanya.kulkarni@wdc.com \
--cc=damien.lemoal@wdc.com \
--cc=linux-nvme@lists.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox