From: Andreas Hindborg <a.hindborg@kernel.org>
To: Alice Ryhl <aliceryhl@google.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Arnd Bergmann <arnd@arndb.de>, Miguel Ojeda <ojeda@kernel.org>
Cc: "Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>,
"Matthew Maurer" <mmaurer@google.com>,
"Lee Jones" <lee@kernel.org>,
linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org,
"Alice Ryhl" <aliceryhl@google.com>,
"Benno Lossin" <lossin@kernel.org>,
"Christian Brauner" <brauner@kernel.org>
Subject: Re: [PATCH v3 3/4] rust: miscdevice: Provide additional abstractions for iov_iter and kiocb structures
Date: Tue, 05 Aug 2025 14:10:01 +0200 [thread overview]
Message-ID: <87v7n27yw6.fsf@kernel.org> (raw)
In-Reply-To: <20250722-iov-iter-v3-3-3efc9c2c2893@google.com>
"Alice Ryhl" <aliceryhl@google.com> writes:
> These will be used for the read_iter() and write_iter() callbacks, which
> are now the preferred back-ends for when a user operates on a char device
> with read() and write() respectively.
>
> Cc: Christian Brauner <brauner@kernel.org>
> Co-developed-by: Lee Jones <lee@kernel.org>
> Signed-off-by: Lee Jones <lee@kernel.org>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> ---
> rust/kernel/fs.rs | 3 +++
> rust/kernel/fs/kiocb.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++++
> rust/kernel/miscdevice.rs | 63 +++++++++++++++++++++++++++++++++++++++++++-
> 3 files changed, 132 insertions(+), 1 deletion(-)
>
> diff --git a/rust/kernel/fs.rs b/rust/kernel/fs.rs
> index 0121b38c59e63d01a89f22c8ef6983ef5c3234de..6ba6bdf143cb991c6e78215178eb585260215da0 100644
> --- a/rust/kernel/fs.rs
> +++ b/rust/kernel/fs.rs
> @@ -6,3 +6,6 @@
>
> pub mod file;
> pub use self::file::{File, LocalFile};
> +
> +mod kiocb;
> +pub use self::kiocb::Kiocb;
> diff --git a/rust/kernel/fs/kiocb.rs b/rust/kernel/fs/kiocb.rs
> new file mode 100644
> index 0000000000000000000000000000000000000000..837f4be7cb8fbca6e3f9aeff74d1c904df3ff7ff
> --- /dev/null
> +++ b/rust/kernel/fs/kiocb.rs
> @@ -0,0 +1,67 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +// Copyright (C) 2024 Google LLC.
> +
> +//! Kernel IO callbacks.
> +//!
> +//! C headers: [`include/linux/fs.h`](srctree/include/linux/fs.h)
> +
> +use core::marker::PhantomData;
> +use core::ptr::NonNull;
> +use kernel::types::ForeignOwnable;
> +
> +/// Wrapper for the kernel's `struct kiocb`.
> +///
> +/// Currently this abstractions is incomplete and is essentially just a tuple containing a
> +/// reference to a file and a file position.
> +///
> +/// The type `T` represents the private data of the underlying file.
In my opinion, this paragraph could use some clarification:
The type `T` represents the filesystem or driver specific data
associated with the file.
> +///
> +/// # Invariants
> +///
> +/// `inner` points at a valid `struct kiocb` whose file has the type `T` as its private data.
> +pub struct Kiocb<'a, T> {
> + inner: NonNull<bindings::kiocb>,
> + _phantom: PhantomData<&'a T>,
> +}
> +
> +impl<'a, T: ForeignOwnable> Kiocb<'a, T> {
> + /// Create a `Kiocb` from a raw pointer.
> + ///
> + /// # Safety
> + ///
> + /// The pointer must reference a valid `struct kiocb` for the duration of `'a`. The private
> + /// data of the file must be `T`.
> + pub unsafe fn from_raw(kiocb: *mut bindings::kiocb) -> Self {
> + Self {
> + // SAFETY: If a pointer is valid it is not null.
> + inner: unsafe { NonNull::new_unchecked(kiocb) },
> + _phantom: PhantomData,
> + }
> + }
> +
> + /// Access the underlying `struct kiocb` directly.
> + pub fn as_raw(&self) -> *mut bindings::kiocb {
> + self.inner.as_ptr()
> + }
> +
> + /// Get the Rust data stored in the private data of the file.
I would suggest:
Get the filesystem or driver specific data associated with the file.
> + pub fn file(&self) -> <T as ForeignOwnable>::Borrowed<'a> {
> + // SAFETY: The `kiocb` lets us access the private data.
This safety comment is strange. I like what you did in patch 1:
++ // SAFETY: We have shared access to this IO vector, so we can read its `count` field.
> + let private = unsafe { (*(*self.as_raw()).ki_filp).private_data };
> + // SAFETY: The kiocb has shared access to the private data.
> + unsafe { <T as ForeignOwnable>::borrow(private) }
> + }
> +
> + /// Gets the current value of `ki_pos`.
> + pub fn ki_pos(&self) -> i64 {
> + // SAFETY: The `kiocb` can access `ki_pos`.
Same.
> + unsafe { (*self.as_raw()).ki_pos }
> + }
> +
> + /// Gets a mutable reference to the `ki_pos` field.
> + pub fn ki_pos_mut(&mut self) -> &mut i64 {
> + // SAFETY: The `kiocb` can access `ki_pos`.
Same.
Best regards,
Andreas Hindborg
next prev parent reply other threads:[~2025-08-05 12:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-22 12:33 [PATCH v3 0/4] Rust support for `struct iov_iter` Alice Ryhl
2025-07-22 12:33 ` [PATCH v3 1/4] rust: iov: add iov_iter abstractions for ITER_SOURCE Alice Ryhl
2025-08-05 11:17 ` Andreas Hindborg
2025-08-13 8:24 ` Alice Ryhl
2025-07-22 12:33 ` [PATCH v3 2/4] rust: iov: add iov_iter abstractions for ITER_DEST Alice Ryhl
2025-08-05 11:31 ` Andreas Hindborg
2025-08-13 8:25 ` Alice Ryhl
2025-07-22 12:33 ` [PATCH v3 3/4] rust: miscdevice: Provide additional abstractions for iov_iter and kiocb structures Alice Ryhl
2025-08-05 12:10 ` Andreas Hindborg [this message]
2025-07-22 12:33 ` [PATCH v3 4/4] samples: rust_misc_device: Expand the sample to support read()ing from userspace Alice Ryhl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87v7n27yw6.fsf@kernel.org \
--to=a.hindborg@kernel.org \
--cc=aliceryhl@google.com \
--cc=arnd@arndb.de \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=brauner@kernel.org \
--cc=dakr@kernel.org \
--cc=gary@garyguo.net \
--cc=gregkh@linuxfoundation.org \
--cc=lee@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=mmaurer@google.com \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.