Message ID | 20250320222823.16509-3-dakr@kernel.org (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | Implement TryFrom<&Device> for bus specific devices | expand |
On Thu Mar 20, 2025 at 11:27 PM CET, Danilo Krummrich wrote: > Implement bus_type_raw(), which returns a raw pointer to the device' > struct bus_type. > > This is useful for bus devices, to implement the following trait. > > impl TryFrom<&Device> for &pci::Device > > With this a caller can try to get the bus specific device from a generic > device in a safe way. try_from() will only succeed if the generic > device' bus type pointer matches the pointer of the bus' type. > > Reviewed-by: Alice Ryhl <aliceryhl@google.com> > Signed-off-by: Danilo Krummrich <dakr@kernel.org> Reviewed-by: Benno Lossin <benno.lossin@proton.me> --- Cheers, Benno > --- > rust/kernel/device.rs | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs > index f6bdc2646028..1b554fdd93e9 100644 > --- a/rust/kernel/device.rs > +++ b/rust/kernel/device.rs > @@ -80,6 +80,16 @@ pub fn parent<'a>(&self) -> Option<&'a Self> { > } > } > > + /// Returns a raw pointer to the device' bus type. > + #[expect(unused)] > + pub(crate) fn bus_type_raw(&self) -> *const bindings::bus_type { > + // SAFETY: > + // - By the type invariants, `self.as_raw()` is a valid pointer to a `struct device`. > + // - `dev->bus` is a pointer to a `const struct bus_type`, which is only ever set at device > + // creation. > + unsafe { (*self.as_raw()).bus } > + } > + > /// Convert a raw C `struct device` pointer to a `&'a Device`. > /// > /// # Safety
diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs index f6bdc2646028..1b554fdd93e9 100644 --- a/rust/kernel/device.rs +++ b/rust/kernel/device.rs @@ -80,6 +80,16 @@ pub fn parent<'a>(&self) -> Option<&'a Self> { } } + /// Returns a raw pointer to the device' bus type. + #[expect(unused)] + pub(crate) fn bus_type_raw(&self) -> *const bindings::bus_type { + // SAFETY: + // - By the type invariants, `self.as_raw()` is a valid pointer to a `struct device`. + // - `dev->bus` is a pointer to a `const struct bus_type`, which is only ever set at device + // creation. + unsafe { (*self.as_raw()).bus } + } + /// Convert a raw C `struct device` pointer to a `&'a Device`. /// /// # Safety