From: javier@javigon.com To: linux-nvme@lists.infradead.org Cc: linux-block@vger.kernel.org, hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@kernel.dk, joshi.k@samsung.com, k.jensen@samsung.com, Niklas.Cassel@wdc.com, "Javier González" <javier.gonz@samsung.com> Subject: [PATCH V3] nvme: enable ro namespace for ZNS without append Date: Tue, 10 Nov 2020 22:07:08 +0100 [thread overview] Message-ID: <20201110210708.5912-1-javier@samsung.com> (raw) From: Javier González <javier.gonz@samsung.com> Allow ZNS NVMe SSDs to present a read-only namespace when append is not supported, instead of rejecting the namespace directly. This allows (i) the namespace to be used in read-only mode, which is not a problem as the append command only affects the write path, and (ii) to use standard management tools such as nvme-cli to choose a different format or firmware slot that is compatible with the Linux zoned block device. This patch includes comments from Christoph, Niklas and Keith that applied to a different approach setting capacity to 0 https://www.spinics.net/lists/linux-block/msg60747.html The reminder of the original patch will be submitted separately. Changes since V2: - Fix small conflict with a queued patch from Sagi (from Christoph) - Fix indentation (from Niklas) - Refresh effects log page to account for FW changes (from Keith) Changes since V1: - Change logic to use NVME_NS_ATTR_RO (from Christoph) - Set max_zone_append egen in RO. This allows the device to be properly revalidated and enables user-space tools such as blkzone to be used when interacting with this zoned device. Signed-off-by: Javier González <javier.gonz@samsung.com> --- drivers/nvme/host/core.c | 5 ++--- drivers/nvme/host/nvme.h | 2 ++ drivers/nvme/host/zns.c | 19 ++++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index fff90200497c..8a224a6f2473 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -2083,7 +2083,7 @@ static void nvme_update_disk_info(struct gendisk *disk, nvme_config_discard(disk, ns); nvme_config_write_zeroes(disk, ns); - if (id->nsattr & NVME_NS_ATTR_RO) + if (id->nsattr & NVME_NS_ATTR_RO || test_bit(NVME_NS_FORCE_RO, &ns->flags)) set_disk_ro(disk, true); } @@ -2951,8 +2951,7 @@ int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi, return nvme_submit_sync_cmd(ctrl->admin_q, &c, log, size); } -static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi, - struct nvme_effects_log **log) +int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi, struct nvme_effects_log **log) { struct nvme_cel *cel = xa_load(&ctrl->cels, csi); int ret; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 83fb30e317e0..857fca95f016 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -449,6 +449,7 @@ struct nvme_ns { #define NVME_NS_REMOVING 0 #define NVME_NS_DEAD 1 #define NVME_NS_ANA_PENDING 2 +#define NVME_NS_FORCE_RO 3 struct nvme_fault_inject fault_inject; @@ -638,6 +639,7 @@ int nvme_delete_ctrl(struct nvme_ctrl *ctrl); int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi, void *log, size_t size, u64 offset); +int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi, struct nvme_effects_log **log); struct nvme_ns *nvme_get_ns_from_disk(struct gendisk *disk, struct nvme_ns_head **head, int *srcu_idx); void nvme_put_ns_from_disk(struct nvme_ns_head *head, int idx); diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c index 67e87e9f306f..47679a90795c 100644 --- a/drivers/nvme/host/zns.c +++ b/drivers/nvme/host/zns.c @@ -54,13 +54,22 @@ int nvme_update_zone_info(struct nvme_ns *ns, unsigned lbaf) struct nvme_id_ns_zns *id; int status; + /* Refresh effects log page to check for changes on append support */ + status = nvme_get_effects_log(ns->ctrl, ns->head->ids.csi, &ns->head->effects); + if (status) + return status; + /* Driver requires zone append support */ - if (!(le32_to_cpu(log->iocs[nvme_cmd_zone_append]) & - NVME_CMD_EFFECTS_CSUPP)) { + if ((le32_to_cpu(log->iocs[nvme_cmd_zone_append]) & NVME_CMD_EFFECTS_CSUPP)) { + if (test_and_clear_bit(NVME_NS_FORCE_RO, &ns->flags)) + dev_warn(ns->ctrl->device, + "append supported for zoned namespace:%d. Remove read-only mode\n", + ns->head->ns_id); + } else { + set_bit(NVME_NS_FORCE_RO, &ns->flags); dev_warn(ns->ctrl->device, - "append not supported for zoned namespace:%d\n", - ns->head->ns_id); - return -EINVAL; + "append not supported for zoned namespace:%d. Forcing to read-only mode\n", + ns->head->ns_id); } /* Lazily query controller append limit for the first zoned namespace */ -- 2.17.1
WARNING: multiple messages have this Message-ID (diff)
From: javier@javigon.com To: linux-nvme@lists.infradead.org Cc: axboe@kernel.dk, Niklas.Cassel@wdc.com, sagi@grimberg.me, joshi.k@samsung.com, k.jensen@samsung.com, linux-block@vger.kernel.org, kbusch@kernel.org, "Javier González" <javier.gonz@samsung.com>, hch@lst.de Subject: [PATCH V3] nvme: enable ro namespace for ZNS without append Date: Tue, 10 Nov 2020 22:07:08 +0100 [thread overview] Message-ID: <20201110210708.5912-1-javier@samsung.com> (raw) From: Javier González <javier.gonz@samsung.com> Allow ZNS NVMe SSDs to present a read-only namespace when append is not supported, instead of rejecting the namespace directly. This allows (i) the namespace to be used in read-only mode, which is not a problem as the append command only affects the write path, and (ii) to use standard management tools such as nvme-cli to choose a different format or firmware slot that is compatible with the Linux zoned block device. This patch includes comments from Christoph, Niklas and Keith that applied to a different approach setting capacity to 0 https://www.spinics.net/lists/linux-block/msg60747.html The reminder of the original patch will be submitted separately. Changes since V2: - Fix small conflict with a queued patch from Sagi (from Christoph) - Fix indentation (from Niklas) - Refresh effects log page to account for FW changes (from Keith) Changes since V1: - Change logic to use NVME_NS_ATTR_RO (from Christoph) - Set max_zone_append egen in RO. This allows the device to be properly revalidated and enables user-space tools such as blkzone to be used when interacting with this zoned device. Signed-off-by: Javier González <javier.gonz@samsung.com> --- drivers/nvme/host/core.c | 5 ++--- drivers/nvme/host/nvme.h | 2 ++ drivers/nvme/host/zns.c | 19 ++++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index fff90200497c..8a224a6f2473 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -2083,7 +2083,7 @@ static void nvme_update_disk_info(struct gendisk *disk, nvme_config_discard(disk, ns); nvme_config_write_zeroes(disk, ns); - if (id->nsattr & NVME_NS_ATTR_RO) + if (id->nsattr & NVME_NS_ATTR_RO || test_bit(NVME_NS_FORCE_RO, &ns->flags)) set_disk_ro(disk, true); } @@ -2951,8 +2951,7 @@ int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi, return nvme_submit_sync_cmd(ctrl->admin_q, &c, log, size); } -static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi, - struct nvme_effects_log **log) +int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi, struct nvme_effects_log **log) { struct nvme_cel *cel = xa_load(&ctrl->cels, csi); int ret; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 83fb30e317e0..857fca95f016 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -449,6 +449,7 @@ struct nvme_ns { #define NVME_NS_REMOVING 0 #define NVME_NS_DEAD 1 #define NVME_NS_ANA_PENDING 2 +#define NVME_NS_FORCE_RO 3 struct nvme_fault_inject fault_inject; @@ -638,6 +639,7 @@ int nvme_delete_ctrl(struct nvme_ctrl *ctrl); int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi, void *log, size_t size, u64 offset); +int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi, struct nvme_effects_log **log); struct nvme_ns *nvme_get_ns_from_disk(struct gendisk *disk, struct nvme_ns_head **head, int *srcu_idx); void nvme_put_ns_from_disk(struct nvme_ns_head *head, int idx); diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c index 67e87e9f306f..47679a90795c 100644 --- a/drivers/nvme/host/zns.c +++ b/drivers/nvme/host/zns.c @@ -54,13 +54,22 @@ int nvme_update_zone_info(struct nvme_ns *ns, unsigned lbaf) struct nvme_id_ns_zns *id; int status; + /* Refresh effects log page to check for changes on append support */ + status = nvme_get_effects_log(ns->ctrl, ns->head->ids.csi, &ns->head->effects); + if (status) + return status; + /* Driver requires zone append support */ - if (!(le32_to_cpu(log->iocs[nvme_cmd_zone_append]) & - NVME_CMD_EFFECTS_CSUPP)) { + if ((le32_to_cpu(log->iocs[nvme_cmd_zone_append]) & NVME_CMD_EFFECTS_CSUPP)) { + if (test_and_clear_bit(NVME_NS_FORCE_RO, &ns->flags)) + dev_warn(ns->ctrl->device, + "append supported for zoned namespace:%d. Remove read-only mode\n", + ns->head->ns_id); + } else { + set_bit(NVME_NS_FORCE_RO, &ns->flags); dev_warn(ns->ctrl->device, - "append not supported for zoned namespace:%d\n", - ns->head->ns_id); - return -EINVAL; + "append not supported for zoned namespace:%d. Forcing to read-only mode\n", + ns->head->ns_id); } /* Lazily query controller append limit for the first zoned namespace */ -- 2.17.1 _______________________________________________ Linux-nvme mailing list Linux-nvme@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-nvme
next reply other threads:[~2020-11-10 21:07 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-11-10 21:07 javier [this message] 2020-11-10 21:07 ` [PATCH V3] nvme: enable ro namespace for ZNS without append javier 2020-11-10 22:09 ` Keith Busch 2020-11-10 22:09 ` Keith Busch 2020-11-11 1:41 ` Sagi Grimberg 2020-11-11 1:41 ` Sagi Grimberg 2020-11-11 8:15 ` Christoph Hellwig 2020-11-11 8:15 ` Christoph Hellwig 2020-11-11 8:36 ` Sagi Grimberg 2020-11-11 8:36 ` Sagi Grimberg 2020-11-11 9:21 ` Javier González 2020-11-11 9:21 ` Javier González
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=20201110210708.5912-1-javier@samsung.com \ --to=javier@javigon.com \ --cc=Niklas.Cassel@wdc.com \ --cc=axboe@kernel.dk \ --cc=hch@lst.de \ --cc=javier.gonz@samsung.com \ --cc=joshi.k@samsung.com \ --cc=k.jensen@samsung.com \ --cc=kbusch@kernel.org \ --cc=linux-block@vger.kernel.org \ --cc=linux-nvme@lists.infradead.org \ --cc=sagi@grimberg.me \ /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: linkBe 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.