Skip to content

Commit f720efd

Browse files
author
Danilo Krummrich
committed
rust: devres: require a bound device
Require the Bound device context to be able to a new Devres container. This ensures that we can't register devres callbacks for unbound devices. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Danilo Krummrich <[email protected]>
1 parent f2a399d commit f720efd

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

rust/kernel/devres.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use crate::{
99
alloc::Flags,
1010
bindings,
11-
device::Device,
11+
device::{Bound, Device},
1212
error::{Error, Result},
1313
ffi::c_void,
1414
prelude::*,
@@ -45,7 +45,7 @@ struct DevresInner<T> {
4545
/// # Example
4646
///
4747
/// ```no_run
48-
/// # use kernel::{bindings, c_str, device::Device, devres::Devres, io::{Io, IoRaw}};
48+
/// # use kernel::{bindings, c_str, device::{Bound, Device}, devres::Devres, io::{Io, IoRaw}};
4949
/// # use core::ops::Deref;
5050
///
5151
/// // See also [`pci::Bar`] for a real example.
@@ -83,13 +83,10 @@ struct DevresInner<T> {
8383
/// unsafe { Io::from_raw(&self.0) }
8484
/// }
8585
/// }
86-
/// # fn no_run() -> Result<(), Error> {
87-
/// # // SAFETY: Invalid usage; just for the example to get an `ARef<Device>` instance.
88-
/// # let dev = unsafe { Device::get_device(core::ptr::null_mut()) };
89-
///
86+
/// # fn no_run(dev: &Device<Bound>) -> Result<(), Error> {
9087
/// // SAFETY: Invalid usage for example purposes.
9188
/// let iomem = unsafe { IoMem::<{ core::mem::size_of::<u32>() }>::new(0xBAAAAAAD)? };
92-
/// let devres = Devres::new(&dev, iomem, GFP_KERNEL)?;
89+
/// let devres = Devres::new(dev, iomem, GFP_KERNEL)?;
9390
///
9491
/// let res = devres.try_access().ok_or(ENXIO)?;
9592
/// res.write8(0x42, 0x0);
@@ -99,7 +96,7 @@ struct DevresInner<T> {
9996
pub struct Devres<T>(Arc<DevresInner<T>>);
10097

10198
impl<T> DevresInner<T> {
102-
fn new(dev: &Device, data: T, flags: Flags) -> Result<Arc<DevresInner<T>>> {
99+
fn new(dev: &Device<Bound>, data: T, flags: Flags) -> Result<Arc<DevresInner<T>>> {
103100
let inner = Arc::pin_init(
104101
pin_init!( DevresInner {
105102
dev: dev.into(),
@@ -171,15 +168,15 @@ impl<T> DevresInner<T> {
171168
impl<T> Devres<T> {
172169
/// Creates a new [`Devres`] instance of the given `data`. The `data` encapsulated within the
173170
/// returned `Devres` instance' `data` will be revoked once the device is detached.
174-
pub fn new(dev: &Device, data: T, flags: Flags) -> Result<Self> {
171+
pub fn new(dev: &Device<Bound>, data: T, flags: Flags) -> Result<Self> {
175172
let inner = DevresInner::new(dev, data, flags)?;
176173

177174
Ok(Devres(inner))
178175
}
179176

180177
/// Same as [`Devres::new`], but does not return a `Devres` instance. Instead the given `data`
181178
/// is owned by devres and will be revoked / dropped, once the device is detached.
182-
pub fn new_foreign_owned(dev: &Device, data: T, flags: Flags) -> Result {
179+
pub fn new_foreign_owned(dev: &Device<Bound>, data: T, flags: Flags) -> Result {
183180
let _ = DevresInner::new(dev, data, flags)?;
184181

185182
Ok(())

0 commit comments

Comments
 (0)