nvme: send a rediscover uevent when a persistent discovery controller reconnects
When a discovery controller is disconnected, no AENs will arrive to notify the host about discovery log change events. In order to solve this, send a uevent notification when a persistent discovery controller reconnects. We add a new ctrl flag NVME_CTRL_STARTED_ONCE that will be set on the first start, and consecutive calls will find it set, and send the event to userspace if the controller is a discovery controller. Upon the event reception, userspace will re-read the discovery log page and will act upon changes as it sees fit. Signed-off-by: Sagi Grimberg <sagi@grimberg.me> Reviewed-by: Daniel Wagner <dwagner@suse.de> Reviewed-by: James Smart <jsmart2021@gmail.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Родитель
bf093d9716
Коммит
f46ef9e87c
|
@ -4815,6 +4815,16 @@ void nvme_start_ctrl(struct nvme_ctrl *ctrl)
|
|||
|
||||
nvme_enable_aen(ctrl);
|
||||
|
||||
/*
|
||||
* persistent discovery controllers need to send indication to userspace
|
||||
* to re-read the discovery log page to learn about possible changes
|
||||
* that were missed. We identify persistent discovery controllers by
|
||||
* checking that they started once before, hence are reconnecting back.
|
||||
*/
|
||||
if (test_and_set_bit(NVME_CTRL_STARTED_ONCE, &ctrl->flags) &&
|
||||
nvme_discovery_ctrl(ctrl))
|
||||
nvme_change_uevent(ctrl, "NVME_EVENT=rediscover");
|
||||
|
||||
if (ctrl->queue_count > 1) {
|
||||
nvme_queue_scan(ctrl);
|
||||
nvme_start_queues(ctrl);
|
||||
|
|
|
@ -236,6 +236,7 @@ struct nvme_fault_inject {
|
|||
enum nvme_ctrl_flags {
|
||||
NVME_CTRL_FAILFAST_EXPIRED = 0,
|
||||
NVME_CTRL_ADMIN_Q_STOPPED = 1,
|
||||
NVME_CTRL_STARTED_ONCE = 2,
|
||||
};
|
||||
|
||||
struct nvme_ctrl {
|
||||
|
|
Загрузка…
Ссылка в новой задаче