Commit 46e7422c authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Keith Busch

nvme: move common logic into nvme_update_ns_info

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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarKeith Busch <kbusch@kernel.org>
parent d60c23e4
...@@ -2070,21 +2070,8 @@ static int nvme_update_ns_info_generic(struct nvme_ns *ns, ...@@ -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)); set_disk_ro(ns->disk, nvme_ns_is_readonly(ns, info));
blk_mq_unfreeze_queue(ns->disk->queue); 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 */ /* Hide the block-interface for these devices */
ns->disk->flags |= GENHD_FL_HIDDEN; return -ENODEV;
set_bit(NVME_NS_READY, &ns->flags);
return 0;
} }
static int nvme_update_ns_info_block(struct nvme_ns *ns, 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, ...@@ -2104,7 +2091,7 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,
/* namespace not allocated or attached */ /* namespace not allocated or attached */
info->is_removed = true; info->is_removed = true;
ret = -ENODEV; ret = -ENODEV;
goto error; goto out;
} }
blk_mq_freeze_queue(ns->disk->queue); blk_mq_freeze_queue(ns->disk->queue);
...@@ -2162,54 +2149,67 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns, ...@@ -2162,54 +2149,67 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,
goto out; 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; ret = 0;
out: 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); kfree(id);
return ret; return ret;
} }
static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_ns_info *info) static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_ns_info *info)
{ {
bool unsupported = false;
int ret;
switch (info->ids.csi) { switch (info->ids.csi) {
case NVME_CSI_ZNS: case NVME_CSI_ZNS:
if (!IS_ENABLED(CONFIG_BLK_DEV_ZONED)) { if (!IS_ENABLED(CONFIG_BLK_DEV_ZONED)) {
dev_info(ns->ctrl->device, dev_info(ns->ctrl->device,
"block device for nsid %u not supported without CONFIG_BLK_DEV_ZONED\n", "block device for nsid %u not supported without CONFIG_BLK_DEV_ZONED\n",
info->nsid); 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: case NVME_CSI_NVM:
return nvme_update_ns_info_block(ns, info); ret = nvme_update_ns_info_block(ns, info);
break;
default: default:
dev_info(ns->ctrl->device, dev_info(ns->ctrl->device,
"block device for nsid %u not supported (csi %u)\n", "block device for nsid %u not supported (csi %u)\n",
info->nsid, info->ids.csi); 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);
unsupported = true;
ret = 0;
}
if (!ret && nvme_ns_head_multipath(ns->head)) {
blk_mq_freeze_queue(ns->head->disk->queue);
if (unsupported)
ns->head->disk->flags |= GENHD_FL_HIDDEN;
else
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);
}
return ret;
} }
#ifdef CONFIG_BLK_SED_OPAL #ifdef CONFIG_BLK_SED_OPAL
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment