mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
rust: revocable: support fallible PinInit types
Currently, Revocable::new() only supports infallible PinInit implementations, i.e. impl PinInit<T, Infallible>. This has been sufficient so far, since users such as Devres do not support fallibility. Since this is about to change, make Revocable::new() generic over the error type E. Reviewed-by: Benno Lossin <lossin@kernel.org> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Acked-by: Miguel Ojeda <ojeda@kernel.org> Link: https://lore.kernel.org/r/20250626200054.243480-2-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
@@ -100,7 +100,7 @@ pub struct Devres<T: Send>(Arc<DevresInner<T>>);
|
||||
impl<T: Send> DevresInner<T> {
|
||||
fn new(dev: &Device<Bound>, data: T, flags: Flags) -> Result<Arc<DevresInner<T>>> {
|
||||
let inner = Arc::pin_init(
|
||||
pin_init!( DevresInner {
|
||||
try_pin_init!( DevresInner {
|
||||
dev: dev.into(),
|
||||
callback: Self::devres_callback,
|
||||
data <- Revocable::new(data),
|
||||
|
||||
@@ -82,11 +82,11 @@ unsafe impl<T: Sync + Send> Sync for Revocable<T> {}
|
||||
|
||||
impl<T> Revocable<T> {
|
||||
/// Creates a new revocable instance of the given data.
|
||||
pub fn new(data: impl PinInit<T>) -> impl PinInit<Self> {
|
||||
pin_init!(Self {
|
||||
pub fn new<E>(data: impl PinInit<T, E>) -> impl PinInit<Self, E> {
|
||||
try_pin_init!(Self {
|
||||
is_available: AtomicBool::new(true),
|
||||
data <- Opaque::pin_init(data),
|
||||
})
|
||||
}? E)
|
||||
}
|
||||
|
||||
/// Tries to access the revocable wrapped object.
|
||||
|
||||
Reference in New Issue
Block a user