Add a method to allow creation of an SGEntry with borrowed data. Analogous of `sg_init_one` in C.
Signed-off-by: Manos Pitsidianakis <[email protected]> --- rust/kernel/scatterlist.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/rust/kernel/scatterlist.rs b/rust/kernel/scatterlist.rs index 146e738cbd4351b41c11dd39a45e20f404c5cd64..b065762af1a734fcdd5d3acde89199f1a626fd89 100644 --- a/rust/kernel/scatterlist.rs +++ b/rust/kernel/scatterlist.rs @@ -95,6 +95,24 @@ pub fn dma_len(&self) -> ResourceSize { // SAFETY: `self.as_raw()` is a valid pointer to a `struct scatterlist`. unsafe { bindings::sg_dma_len(self.as_raw()) }.into() } + + /// Initialize a new entry with borrowed data. + /// + /// # Safety + /// + /// Callers must ensure that: + /// - `buf` is a valid pointer + /// - `buf_len` describes a valid allocation size for this pointer + pub unsafe fn init_one( + val: &'_ mut core::mem::MaybeUninit<bindings::scatterlist>, + buf: NonNull<u8>, + buf_len: u32, + ) -> &'_ Self { + // SAFETY: `val` points to a correctly sized `struct scatterlist`. + unsafe { bindings::sg_init_one(val.as_mut_ptr(), buf.as_ptr().cast(), buf_len) }; + // SAFETY: `val` points to an initialized `struct scatterlist`. + unsafe { Self::from_raw(val.as_mut_ptr()) } + } } /// The borrowed generic type of an [`SGTable`], representing a borrowed or externally managed -- 2.47.3

