Merge tag 'block-6.12-20241108' of git://git.kernel.dk/linux

Pull block fix from Jens Axboe:
"Single fix for an issue triggered with PROVE_RCU=y, with nvme using
the wrong iterators for an SRCU protected list"

* tag 'block-6.12-20241108' of git://git.kernel.dk/linux:
nvme/host: Fix RCU list traversal to use SRCU primitive

Changed files
+14 -7
drivers
nvme
host
+14 -7
drivers/nvme/host/core.c
··· 3795 int srcu_idx; 3796 3797 srcu_idx = srcu_read_lock(&ctrl->srcu); 3798 - list_for_each_entry_rcu(ns, &ctrl->namespaces, list) { 3799 if (ns->head->ns_id == nsid) { 3800 if (!nvme_get_ns(ns)) 3801 continue; ··· 4880 int srcu_idx; 4881 4882 srcu_idx = srcu_read_lock(&ctrl->srcu); 4883 - list_for_each_entry_rcu(ns, &ctrl->namespaces, list) 4884 blk_mark_disk_dead(ns->disk); 4885 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4886 } ··· 4893 int srcu_idx; 4894 4895 srcu_idx = srcu_read_lock(&ctrl->srcu); 4896 - list_for_each_entry_rcu(ns, &ctrl->namespaces, list) 4897 blk_mq_unfreeze_queue(ns->queue); 4898 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4899 clear_bit(NVME_CTRL_FROZEN, &ctrl->flags); ··· 4907 int srcu_idx; 4908 4909 srcu_idx = srcu_read_lock(&ctrl->srcu); 4910 - list_for_each_entry_rcu(ns, &ctrl->namespaces, list) { 4911 timeout = blk_mq_freeze_queue_wait_timeout(ns->queue, timeout); 4912 if (timeout <= 0) 4913 break; ··· 4924 int srcu_idx; 4925 4926 srcu_idx = srcu_read_lock(&ctrl->srcu); 4927 - list_for_each_entry_rcu(ns, &ctrl->namespaces, list) 4928 blk_mq_freeze_queue_wait(ns->queue); 4929 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4930 } ··· 4938 4939 set_bit(NVME_CTRL_FROZEN, &ctrl->flags); 4940 srcu_idx = srcu_read_lock(&ctrl->srcu); 4941 - list_for_each_entry_rcu(ns, &ctrl->namespaces, list) 4942 blk_freeze_queue_start(ns->queue); 4943 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4944 } ··· 4987 int srcu_idx; 4988 4989 srcu_idx = srcu_read_lock(&ctrl->srcu); 4990 - list_for_each_entry_rcu(ns, &ctrl->namespaces, list) 4991 blk_sync_queue(ns->queue); 4992 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4993 }
··· 3795 int srcu_idx; 3796 3797 srcu_idx = srcu_read_lock(&ctrl->srcu); 3798 + list_for_each_entry_srcu(ns, &ctrl->namespaces, list, 3799 + srcu_read_lock_held(&ctrl->srcu)) { 3800 if (ns->head->ns_id == nsid) { 3801 if (!nvme_get_ns(ns)) 3802 continue; ··· 4879 int srcu_idx; 4880 4881 srcu_idx = srcu_read_lock(&ctrl->srcu); 4882 + list_for_each_entry_srcu(ns, &ctrl->namespaces, list, 4883 + srcu_read_lock_held(&ctrl->srcu)) 4884 blk_mark_disk_dead(ns->disk); 4885 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4886 } ··· 4891 int srcu_idx; 4892 4893 srcu_idx = srcu_read_lock(&ctrl->srcu); 4894 + list_for_each_entry_srcu(ns, &ctrl->namespaces, list, 4895 + srcu_read_lock_held(&ctrl->srcu)) 4896 blk_mq_unfreeze_queue(ns->queue); 4897 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4898 clear_bit(NVME_CTRL_FROZEN, &ctrl->flags); ··· 4904 int srcu_idx; 4905 4906 srcu_idx = srcu_read_lock(&ctrl->srcu); 4907 + list_for_each_entry_srcu(ns, &ctrl->namespaces, list, 4908 + srcu_read_lock_held(&ctrl->srcu)) { 4909 timeout = blk_mq_freeze_queue_wait_timeout(ns->queue, timeout); 4910 if (timeout <= 0) 4911 break; ··· 4920 int srcu_idx; 4921 4922 srcu_idx = srcu_read_lock(&ctrl->srcu); 4923 + list_for_each_entry_srcu(ns, &ctrl->namespaces, list, 4924 + srcu_read_lock_held(&ctrl->srcu)) 4925 blk_mq_freeze_queue_wait(ns->queue); 4926 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4927 } ··· 4933 4934 set_bit(NVME_CTRL_FROZEN, &ctrl->flags); 4935 srcu_idx = srcu_read_lock(&ctrl->srcu); 4936 + list_for_each_entry_srcu(ns, &ctrl->namespaces, list, 4937 + srcu_read_lock_held(&ctrl->srcu)) 4938 blk_freeze_queue_start(ns->queue); 4939 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4940 } ··· 4981 int srcu_idx; 4982 4983 srcu_idx = srcu_read_lock(&ctrl->srcu); 4984 + list_for_each_entry_srcu(ns, &ctrl->namespaces, list, 4985 + srcu_read_lock_held(&ctrl->srcu)) 4986 blk_sync_queue(ns->queue); 4987 srcu_read_unlock(&ctrl->srcu, srcu_idx); 4988 }