From a13e2f77b8bfc3ed6dc02a2dd2903963047c5bde Mon Sep 17 00:00:00 2001 From: Haitao Li Date: Sun, 24 Oct 2021 13:26:14 +1100 Subject: [PATCH] agent: Handle uevent remove actions uevents with action=remove was ignored causing the agent to reuse stale data in the device map. This patch adds handling of such uevents. Fixes #2405 Signed-off-by: Haitao Li --- src/agent/src/linux_abi.rs | 1 + src/agent/src/uevent.rs | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/agent/src/linux_abi.rs b/src/agent/src/linux_abi.rs index e49d901f80..a69ec10f0e 100644 --- a/src/agent/src/linux_abi.rs +++ b/src/agent/src/linux_abi.rs @@ -94,6 +94,7 @@ pub const SYSTEM_DEV_PATH: &str = "/dev"; // Linux UEvent related consts. pub const U_EVENT_ACTION: &str = "ACTION"; pub const U_EVENT_ACTION_ADD: &str = "add"; +pub const U_EVENT_ACTION_REMOVE: &str = "remove"; pub const U_EVENT_DEV_PATH: &str = "DEVPATH"; pub const U_EVENT_SUB_SYSTEM: &str = "SUBSYSTEM"; pub const U_EVENT_SEQ_NUM: &str = "SEQNUM"; diff --git a/src/agent/src/uevent.rs b/src/agent/src/uevent.rs index 1b1dbb72e8..93dabcafcb 100644 --- a/src/agent/src/uevent.rs +++ b/src/agent/src/uevent.rs @@ -97,10 +97,18 @@ impl Uevent { }) } + #[instrument] + async fn process_remove(&self, logger: &Logger, sandbox: &Arc>) { + let mut sb = sandbox.lock().await; + sb.uevent_map.remove(&self.devpath); + } + #[instrument] async fn process(&self, logger: &Logger, sandbox: &Arc>) { if self.action == U_EVENT_ACTION_ADD { return self.process_add(logger, sandbox).await; + } else if self.action == U_EVENT_ACTION_REMOVE { + return self.process_remove(logger, sandbox).await; } debug!(*logger, "ignoring event"; "uevent" => format!("{:?}", self)); }