sysmaster/backport-fix-device-set-driver-subsystem-after-generating-dev.patch

93 lines
3.1 KiB
Diff
Raw Normal View History

2023-12-07 00:19:38 +08:00
From 400c6e270583c62724dd2bfd8b92ad96a2f0cfcb Mon Sep 17 00:00:00 2001
From: chenjiayi <chenjiayi22@huawei.com>
Date: Wed, 8 Nov 2023 22:59:44 +0800
Subject: [PATCH 053/103] fix(device): set driver subsystem after generating
device from nulstr
The driver subsystem is omitted when receiving device object from nulstr,
which leads to incorrect device id in /run/devmaster/data/ for driver
subsystems.
---
libs/device/src/device.rs | 32 ++++++++++++++++++++++++++++---
libs/device/src/device_monitor.rs | 5 +++--
2 files changed, 32 insertions(+), 5 deletions(-)
diff --git a/libs/device/src/device.rs b/libs/device/src/device.rs
index 4f5779ce..3845e21c 100644
--- a/libs/device/src/device.rs
+++ b/libs/device/src/device.rs
@@ -246,7 +246,29 @@ impl Device {
device.update_properties_bufs()?;
- Ok(device)
+ device.verify()
+ }
+
+ /// Verify the legality of a device object from nulstr.
+ fn verify(self) -> Result<Device, Error> {
+ if self.devpath.borrow().is_empty()
+ || self.subsystem.borrow().is_empty()
+ || *self.action.borrow() == DeviceAction::Invalid
+ || *self.seqnum.borrow() == 0
+ {
+ return Err(Error::Nix {
+ msg: "Received invalid device object from uevent".to_string(),
+ source: Errno::EINVAL,
+ });
+ }
+
+ if &*self.subsystem.borrow() == "drivers" {
+ self.set_drivers_subsystem()?;
+ }
+
+ self.sealed.replace(true);
+
+ Ok(self)
}
/// create a Device instance from devname
@@ -1237,7 +1259,7 @@ impl Device {
/// shadow clone a device object and import properties from db
pub fn clone_with_db(&self) -> Result<Device, Error> {
let device = self.shallow_clone()?;
- device.read_db()?;
+ device.read_db_internal(true)?;
device.sealed.replace(true);
Ok(device)
}
@@ -3535,9 +3557,13 @@ mod tests {
let syspath = dev.get_syspath().unwrap();
let devnum = dev.get_devnum().unwrap();
let id = dev.get_device_id().unwrap();
- let (nulstr, _) = dev.get_properties_nulstr().unwrap();
let devname = dev.get_devname().unwrap();
+ dev.set_action_from_string("change").unwrap();
+ dev.set_seqnum_from_string("1000").unwrap();
+
+ let (nulstr, _) = dev.get_properties_nulstr().unwrap();
+
let dev_new = Device::from_syspath(&syspath, true).unwrap();
assert_eq!(dev, &dev_new);
diff --git a/libs/device/src/device_monitor.rs b/libs/device/src/device_monitor.rs
index db51c40f..3f1d1ba6 100644
--- a/libs/device/src/device_monitor.rs
+++ b/libs/device/src/device_monitor.rs
@@ -249,8 +249,9 @@ mod tests {
///
fn dispatch(&self, e: &Events) -> i32 {
- let device = self.device_monitor.receive_device().unwrap();
- println!("{}", device.get_device_id().unwrap());
+ if let Ok(device) = self.device_monitor.receive_device() {
+ println!("{}", device.get_device_id().unwrap());
+ }
e.set_exit();
0
}
--
2.33.0