[PATCH 28/35] monitor: basic handling of add/remove uevents for nvme controllers

mwilck
2021-01-26T20:35:39Z

From: Martin Wilck <mwilck@suse.com>

On add, we'd like to detect the creation of a discovery controller for a given
connection. More often than not, that doesn't work, because the controller
is still in "connecting" state when the uevent arrives, and reading subsysnqn
yields "(efault)".

This would need to be fixed by waiting for the connection to complete,
but doing this properly is currently out of scope. It's not really a big
problem, because without --persistent, the discovery controller will
be removed anyway, and with --persistent, we'll notice the discovery
controller as soon as it actually receives an AEN and generates an uevent.

Signed-off-by: Martin Wilck <mwilck@suse.com>
---
monitor.c | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)

diff --git a/monitor.c b/monitor.c
index e3fee55..e2c2568 100644
--- a/monitor.c
+++ b/monitor.c
@@ -155,6 +155,36 @@ static int child_reset_signals(void)
return -err;
}

+static void monitor_handle_nvme_add(struct udev_device *ud)
+{
+ const char *syspath = udev_device_get_syspath(ud);
+ CLEANUP(char, subsysnqn) = NULL;
+ CLEANUP(char, state) = NULL;
+
+ if (!syspath)
+ return;
+ subsysnqn = nvme_get_ctrl_attr(syspath, "subsysnqn");
+ state = nvme_get_ctrl_attr(syspath, "state");
+ log(LOG_DEBUG, "add %s => %s [%s]\n", syspath, subsysnqn, state);
+}
+
+static void monitor_handle_nvme_remove(struct udev_device *ud)
+{
+ const char *sysname = udev_device_get_sysname(ud);
+ struct nvme_connection *co;
+
+ if (!sysname)
+ return;
+
+ co = conndb_find_by_ctrl(sysname);
+ if (co) {
+ log(LOG_DEBUG, "%s: connection discovery controller removed\n",
+ sysname);
+ co->discovery_instance = -1;
+ }
+ return;
+}
+
static int monitor_get_fc_uev_props(struct udev_device *ud,
char *traddr, size_t tra_sz,
char *host_traddr, size_t htra_sz)
@@ -353,6 +383,14 @@ static void monitor_handle_nvme_uev(struct udev_device *ud)
char traddr[NVMF_TRADDR_SIZE], host_traddr[NVMF_TRADDR_SIZE];
char trsvcid[NVMF_TRSVCID_SIZE], transport[5];

+ if (!strcmp(udev_device_get_action(ud), "remove")) {
+ monitor_handle_nvme_remove(ud);
+ return;
+ }
+ if (!strcmp(udev_device_get_action(ud), "add")) {
+ monitor_handle_nvme_add(ud);
+ return;
+ }
if (strcmp(udev_device_get_action(ud), "change"))
return;

--
2.29.2