Commit 25fe63db authored by Danilo Krummrich's avatar Danilo Krummrich
Browse files

rust: uaccess: generalize write_dma() to accept any Coherent<T>



Generalize write_dma() from &Coherent<[u8]> to &Coherent<T> where
T: KnownSize + AsBytes + ?Sized. The function body only uses as_ptr()
and size(), which work for any such T, so there is no reason to
restrict it to byte slices.

Acked-by: default avatarMiguel Ojeda <ojeda@kernel.org>
Acked-by: default avatarGary Guo <gary@garyguo.net>
Reviewed-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Reviewed-by: default avatarAlice Ryhl <aliceryhl@google.com>
Link: https://patch.msgid.link/20260325003921.3420-1-dakr@kernel.org


Signed-off-by: default avatarDanilo Krummrich <dakr@kernel.org>
parent 80df573a
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
    ffi::{c_char, c_void},
    fs::file,
    prelude::*,
    ptr::KnownSize,
    transmute::{AsBytes, FromBytes},
};
use core::mem::{size_of, MaybeUninit};
@@ -524,7 +525,12 @@ pub fn write_slice(&mut self, data: &[u8]) -> Result {
    ///     writer.write_dma(alloc, 0, 256)
    /// }
    /// ```
    pub fn write_dma(&mut self, alloc: &Coherent<[u8]>, offset: usize, count: usize) -> Result {
    pub fn write_dma<T: KnownSize + AsBytes + ?Sized>(
        &mut self,
        alloc: &Coherent<T>,
        offset: usize,
        count: usize,
    ) -> Result {
        let len = alloc.size();
        if offset.checked_add(count).ok_or(EOVERFLOW)? > len {
            return Err(ERANGE);