Commit a0455533 authored by Jens Axboe's avatar Jens Axboe

Merge tag 'nvme-6.12-2024-09-25' of git://git.infradead.org/nvme into for-6.12/block

Pull NVMe fixes from Keith:

"nvme fixes for Linux 6.12

 - Multipath fixes (Hannes)
 - Sysfs attribute list NULL terminate fix (Shin'ichiro)
 - Remove problematic read-back (Keith)"

* tag 'nvme-6.12-2024-09-25' of git://git.infradead.org/nvme:
  nvme: remove CC register read-back during enabling
  nvme: null terminate nvme_tls_attrs
  nvme-multipath: avoid hang on inaccessible namespaces
  nvme-multipath: system fails to create generic nvme device
parents 65f666c6 90646103
...@@ -2468,11 +2468,6 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl) ...@@ -2468,11 +2468,6 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
if (ret) if (ret)
return ret; return ret;
/* Flush write to device (required if transport is PCI) */
ret = ctrl->ops->reg_read32(ctrl, NVME_REG_CC, &ctrl->ctrl_config);
if (ret)
return ret;
/* CAP value may change after initial CC write */ /* CAP value may change after initial CC write */
ret = ctrl->ops->reg_read64(ctrl, NVME_REG_CAP, &ctrl->cap); ret = ctrl->ops->reg_read64(ctrl, NVME_REG_CAP, &ctrl->cap);
if (ret) if (ret)
......
...@@ -421,6 +421,9 @@ static bool nvme_available_path(struct nvme_ns_head *head) ...@@ -421,6 +421,9 @@ static bool nvme_available_path(struct nvme_ns_head *head)
{ {
struct nvme_ns *ns; struct nvme_ns *ns;
if (!test_bit(NVME_NSHEAD_DISK_LIVE, &head->flags))
return NULL;
list_for_each_entry_rcu(ns, &head->list, siblings) { list_for_each_entry_rcu(ns, &head->list, siblings) {
if (test_bit(NVME_CTRL_FAILFAST_EXPIRED, &ns->ctrl->flags)) if (test_bit(NVME_CTRL_FAILFAST_EXPIRED, &ns->ctrl->flags))
continue; continue;
...@@ -648,7 +651,7 @@ static void nvme_mpath_set_live(struct nvme_ns *ns) ...@@ -648,7 +651,7 @@ static void nvme_mpath_set_live(struct nvme_ns *ns)
rc = device_add_disk(&head->subsys->dev, head->disk, rc = device_add_disk(&head->subsys->dev, head->disk,
nvme_ns_attr_groups); nvme_ns_attr_groups);
if (rc) { if (rc) {
clear_bit(NVME_NSHEAD_DISK_LIVE, &ns->flags); clear_bit(NVME_NSHEAD_DISK_LIVE, &head->flags);
return; return;
} }
nvme_add_ns_head_cdev(head); nvme_add_ns_head_cdev(head);
...@@ -969,11 +972,16 @@ void nvme_mpath_shutdown_disk(struct nvme_ns_head *head) ...@@ -969,11 +972,16 @@ void nvme_mpath_shutdown_disk(struct nvme_ns_head *head)
{ {
if (!head->disk) if (!head->disk)
return; return;
kblockd_schedule_work(&head->requeue_work); if (test_and_clear_bit(NVME_NSHEAD_DISK_LIVE, &head->flags)) {
if (test_bit(NVME_NSHEAD_DISK_LIVE, &head->flags)) {
nvme_cdev_del(&head->cdev, &head->cdev_device); nvme_cdev_del(&head->cdev, &head->cdev_device);
del_gendisk(head->disk); del_gendisk(head->disk);
} }
/*
* requeue I/O after NVME_NSHEAD_DISK_LIVE has been cleared
* to allow multipath to fail all I/O.
*/
synchronize_srcu(&head->srcu);
kblockd_schedule_work(&head->requeue_work);
} }
void nvme_mpath_remove_disk(struct nvme_ns_head *head) void nvme_mpath_remove_disk(struct nvme_ns_head *head)
......
...@@ -767,6 +767,7 @@ static struct attribute *nvme_tls_attrs[] = { ...@@ -767,6 +767,7 @@ static struct attribute *nvme_tls_attrs[] = {
&dev_attr_tls_key.attr, &dev_attr_tls_key.attr,
&dev_attr_tls_configured_key.attr, &dev_attr_tls_configured_key.attr,
&dev_attr_tls_keyring.attr, &dev_attr_tls_keyring.attr,
NULL,
}; };
static umode_t nvme_tls_attrs_are_visible(struct kobject *kobj, static umode_t nvme_tls_attrs_are_visible(struct kobject *kobj,
......
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