[PATCH 12/21] nvme: move common logic into nvme_update_ns_info
Max Gurtovoy
mgurtovoy at nvidia.com
Thu Feb 29 05:30:22 PST 2024
On 28/02/2024 20:12, Christoph Hellwig wrote:
> nvme_update_ns_info_generic and nvme_update_ns_info_block share a
> fair amount of logic related to not fully supported namespace
> formats and updating the multipath information. Move this logic
> into the common caller.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> ---
> drivers/nvme/host/core.c | 79 +++++++++++++++++++---------------------
> 1 file changed, 37 insertions(+), 42 deletions(-)
>
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index dcb8d0590ed0f3..78667ba89ec491 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -2070,21 +2070,8 @@ static int nvme_update_ns_info_generic(struct nvme_ns *ns,
> set_disk_ro(ns->disk, nvme_ns_is_readonly(ns, info));
> blk_mq_unfreeze_queue(ns->disk->queue);
>
> - if (nvme_ns_head_multipath(ns->head)) {
> - blk_mq_freeze_queue(ns->head->disk->queue);
> - set_disk_ro(ns->head->disk, nvme_ns_is_readonly(ns, info));
> - nvme_mpath_revalidate_paths(ns);
> - blk_stack_limits(&ns->head->disk->queue->limits,
> - &ns->queue->limits, 0);
> - ns->head->disk->flags |= GENHD_FL_HIDDEN;
> - blk_mq_unfreeze_queue(ns->head->disk->queue);
> - }
> -
> /* Hide the block-interface for these devices */
> - ns->disk->flags |= GENHD_FL_HIDDEN;
> - set_bit(NVME_NS_READY, &ns->flags);
> -
> - return 0;
> + return -ENODEV;
> }
>
> static int nvme_update_ns_info_block(struct nvme_ns *ns,
> @@ -2104,7 +2091,7 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,
> /* namespace not allocated or attached */
> info->is_removed = true;
> ret = -ENODEV;
> - goto error;
> + goto out;
> }
>
> blk_mq_freeze_queue(ns->disk->queue);
> @@ -2162,54 +2149,62 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,
> goto out;
> }
>
> - if (nvme_ns_head_multipath(ns->head)) {
> - blk_mq_freeze_queue(ns->head->disk->queue);
> - nvme_init_integrity(ns->head->disk, ns->head);
> - set_capacity_and_notify(ns->head->disk, get_capacity(ns->disk));
> - set_disk_ro(ns->head->disk, nvme_ns_is_readonly(ns, info));
> - nvme_mpath_revalidate_paths(ns);
> - blk_stack_limits(&ns->head->disk->queue->limits,
> - &ns->queue->limits, 0);
> - disk_update_readahead(ns->head->disk);
> - blk_mq_unfreeze_queue(ns->head->disk->queue);
> - }
> -
> ret = 0;
> out:
> - /*
> - * If probing fails due an unsupported feature, hide the block device,
> - * but still allow other access.
> - */
> - if (ret == -ENODEV) {
> - ns->disk->flags |= GENHD_FL_HIDDEN;
> - set_bit(NVME_NS_READY, &ns->flags);
> - ret = 0;
> - }
> -
> -error:
> kfree(id);
> return ret;
> }
>
> static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_ns_info *info)
> {
> + int ret;
> +
> switch (info->ids.csi) {
> case NVME_CSI_ZNS:
> if (!IS_ENABLED(CONFIG_BLK_DEV_ZONED)) {
> dev_info(ns->ctrl->device,
> "block device for nsid %u not supported without CONFIG_BLK_DEV_ZONED\n",
> info->nsid);
> - return nvme_update_ns_info_generic(ns, info);
> + ret = nvme_update_ns_info_generic(ns, info);
> + break;
> }
> - return nvme_update_ns_info_block(ns, info);
> + ret = nvme_update_ns_info_block(ns, info);
> + break;
> case NVME_CSI_NVM:
> - return nvme_update_ns_info_block(ns, info);
> + ret = nvme_update_ns_info_block(ns, info);
> + break;
> default:
> dev_info(ns->ctrl->device,
> "block device for nsid %u not supported (csi %u)\n",
> info->nsid, info->ids.csi);
> - return nvme_update_ns_info_generic(ns, info);
> + ret = nvme_update_ns_info_generic(ns, info);
> + break;
> + }
> +
> + /*
> + * If probing fails due an unsupported feature, hide the block device,
> + * but still allow other access.
> + */
> + if (ret == -ENODEV) {
> + ns->disk->flags |= GENHD_FL_HIDDEN;
> + set_bit(NVME_NS_READY, &ns->flags);
> + ret = 0;
> + }
> +
> + if (!ret && nvme_ns_head_multipath(ns->head)) {
> + blk_mq_freeze_queue(ns->head->disk->queue);
> + if (!(ns->disk->flags & GENHD_FL_HIDDEN))
> + nvme_init_integrity(ns->head->disk, ns->head);
the logic in "nvme_update_ns_info_generic()" today is to hide also
ns->head->disk..
> + set_capacity_and_notify(ns->head->disk, get_capacity(ns->disk));
> + set_disk_ro(ns->head->disk, nvme_ns_is_readonly(ns, info));
> + nvme_mpath_revalidate_paths(ns);
> + blk_stack_limits(&ns->head->disk->queue->limits,
> + &ns->queue->limits, 0);
> + disk_update_readahead(ns->head->disk);
we don't call disk_update_readahead() in "nvme_update_ns_info_generic()"
today..
> + blk_mq_unfreeze_queue(ns->head->disk->queue);
> }
> +
> + return ret;
> }
>
> #ifdef CONFIG_BLK_SED_OPAL
More information about the Linux-nvme
mailing list