summaryrefslogtreecommitdiff
path: root/rust/kernel
diff options
context:
space:
mode:
authorDanilo Krummrich <dakr@kernel.org>2025-07-14 13:32:35 +0200
committerDanilo Krummrich <dakr@kernel.org>2025-07-15 14:46:09 +0200
commit91ae26b06aab476bdd8b56cd99e127f029490330 (patch)
treeebaec0e300811016e6a5b9eb4c9ec11c5e15120e /rust/kernel
parent3964d07dd821efe9680e90c51c86661a98e60a0f (diff)
rust: devres: initialize Devres::inner::data last
Users may want to access the Devres object from callbacks registered through the initialization of Devres::inner::data. For those accesses to be valid, Devres::inner::data must be initialized last [1]. Credit to Boqun for spotting this [2]. Link: https://lore.kernel.org/lkml/DBBPHO26CPBS.2OVI1OERCB2J5@kernel.org/ [1] Link: https://lore.kernel.org/lkml/aHSmxWeIy3L-AKIV@Mac.home/ [2] Reviewed-by: Alice Ryhl <aliceryhl@google.com> Link: https://lore.kernel.org/r/20250714113712.22158-1-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Diffstat (limited to 'rust/kernel')
-rw-r--r--rust/kernel/devres.rs16
1 files changed, 8 insertions, 8 deletions
diff --git a/rust/kernel/devres.rs b/rust/kernel/devres.rs
index f43de3d77d61..ac5e5d94ee96 100644
--- a/rust/kernel/devres.rs
+++ b/rust/kernel/devres.rs
@@ -137,14 +137,10 @@ impl<T: Send> Devres<T> {
let callback = Self::devres_callback;
try_pin_init!(&this in Self {
- // INVARIANT: `inner` is properly initialized.
- inner <- Opaque::pin_init(try_pin_init!(Inner {
- data <- Revocable::new(data),
- devm <- Completion::new(),
- revoke <- Completion::new(),
- })),
+ dev: dev.into(),
callback,
- dev: {
+ // INVARIANT: `inner` is properly initialized.
+ inner <- {
// SAFETY: `this` is a valid pointer to uninitialized memory.
let inner = unsafe { &raw mut (*this.as_ptr()).inner };
@@ -158,7 +154,11 @@ impl<T: Send> Devres<T> {
bindings::devm_add_action(dev.as_raw(), Some(callback), inner.cast())
})?;
- dev.into()
+ Opaque::pin_init(try_pin_init!(Inner {
+ devm <- Completion::new(),
+ revoke <- Completion::new(),
+ data <- Revocable::new(data),
+ }))
},
})
}