From: Lee Jones <lee@kernel.org>
To: Alice Ryhl <aliceryhl@google.com>
Cc: "Arnd Bergmann" <arnd@arndb.de>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Alexander Viro" <viro@zeniv.linux.org.uk>,
"Christian Brauner" <brauner@kernel.org>,
"Jan Kara" <jack@suse.cz>, "Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <benno.lossin@proton.me>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH v3 1/3] rust: miscdevice: access file in fops
Date: Wed, 11 Dec 2024 11:56:51 +0000 [thread overview]
Message-ID: <20241211115651.GB7139@google.com> (raw)
In-Reply-To: <20241210-miscdevice-file-param-v3-1-b2a79b666dc5@google.com>
On Tue, 10 Dec 2024, Alice Ryhl wrote:
> This allows fops to access information about the underlying struct file
> for the miscdevice. For example, the Binder driver needs to inspect the
> O_NONBLOCK flag inside the fops->ioctl() hook.
>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> ---
> rust/kernel/miscdevice.rs | 31 +++++++++++++++++++++++++------
> 1 file changed, 25 insertions(+), 6 deletions(-)
Reviewed-by: Lee Jones <lee@kernel.org>
> diff --git a/rust/kernel/miscdevice.rs b/rust/kernel/miscdevice.rs
> index 7e2a79b3ae26..0cb79676c139 100644
> --- a/rust/kernel/miscdevice.rs
> +++ b/rust/kernel/miscdevice.rs
> @@ -11,6 +11,7 @@
> use crate::{
> bindings,
> error::{to_result, Error, Result, VTABLE_DEFAULT_ERROR},
> + fs::File,
> prelude::*,
> str::CStr,
> types::{ForeignOwnable, Opaque},
> @@ -103,10 +104,10 @@ pub trait MiscDevice {
> /// Called when the misc device is opened.
> ///
> /// The returned pointer will be stored as the private data for the file.
> - fn open() -> Result<Self::Ptr>;
> + fn open(_file: &File) -> Result<Self::Ptr>;
>
> /// Called when the misc device is released.
> - fn release(device: Self::Ptr) {
> + fn release(device: Self::Ptr, _file: &File) {
> drop(device);
> }
>
> @@ -117,6 +118,7 @@ fn release(device: Self::Ptr) {
> /// [`kernel::ioctl`]: mod@crate::ioctl
> fn ioctl(
> _device: <Self::Ptr as ForeignOwnable>::Borrowed<'_>,
> + _file: &File,
> _cmd: u32,
> _arg: usize,
> ) -> Result<isize> {
> @@ -133,6 +135,7 @@ fn ioctl(
> #[cfg(CONFIG_COMPAT)]
> fn compat_ioctl(
> _device: <Self::Ptr as ForeignOwnable>::Borrowed<'_>,
> + _file: &File,
> _cmd: u32,
> _arg: usize,
> ) -> Result<isize> {
> @@ -187,7 +190,10 @@ impl<T: MiscDevice> VtableHelper<T> {
> return ret;
> }
>
> - let ptr = match T::open() {
> + // SAFETY:
> + // * The file is valid for the duration of this call.
> + // * There is no active fdget_pos region on the file on this thread.
> + let ptr = match T::open(unsafe { File::from_raw_file(file) }) {
> Ok(ptr) => ptr,
> Err(err) => return err.to_errno(),
> };
> @@ -211,7 +217,10 @@ impl<T: MiscDevice> VtableHelper<T> {
> // SAFETY: The release call of a file owns the private data.
> let ptr = unsafe { <T::Ptr as ForeignOwnable>::from_foreign(private) };
>
> - T::release(ptr);
> + // SAFETY:
> + // * The file is valid for the duration of this call.
> + // * There is no active fdget_pos region on the file on this thread.
> + T::release(ptr, unsafe { File::from_raw_file(file) });
>
> 0
> }
> @@ -229,7 +238,12 @@ impl<T: MiscDevice> VtableHelper<T> {
> // SAFETY: Ioctl calls can borrow the private data of the file.
> let device = unsafe { <T::Ptr as ForeignOwnable>::borrow(private) };
>
> - match T::ioctl(device, cmd, arg as usize) {
> + // SAFETY:
> + // * The file is valid for the duration of this call.
> + // * There is no active fdget_pos region on the file on this thread.
> + let file = unsafe { File::from_raw_file(file) };
> +
> + match T::ioctl(device, file, cmd, arg as usize) {
> Ok(ret) => ret as c_long,
> Err(err) => err.to_errno() as c_long,
> }
> @@ -249,7 +263,12 @@ impl<T: MiscDevice> VtableHelper<T> {
> // SAFETY: Ioctl calls can borrow the private data of the file.
> let device = unsafe { <T::Ptr as ForeignOwnable>::borrow(private) };
>
> - match T::compat_ioctl(device, cmd, arg as usize) {
> + // SAFETY:
> + // * The file is valid for the duration of this call.
> + // * There is no active fdget_pos region on the file on this thread.
> + let file = unsafe { File::from_raw_file(file) };
> +
> + match T::compat_ioctl(device, file, cmd, arg as usize) {
> Ok(ret) => ret as c_long,
> Err(err) => err.to_errno() as c_long,
> }
>
> --
> 2.47.1.613.gc27f4b7a9f-goog
>
--
Lee Jones [李琼斯]
next prev parent reply other threads:[~2024-12-11 11:57 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-10 9:38 [PATCH v3 0/3] Additional miscdevice fops parameters Alice Ryhl
2024-12-10 9:39 ` [PATCH v3 1/3] rust: miscdevice: access file in fops Alice Ryhl
2024-12-11 11:56 ` Lee Jones [this message]
2024-12-13 16:48 ` Lee Jones
2024-12-10 9:39 ` [PATCH v3 2/3] rust: miscdevice: access the `struct miscdevice` from fops->open() Alice Ryhl
2024-12-11 11:57 ` Lee Jones
2024-12-13 16:47 ` Lee Jones
2024-12-10 9:39 ` [PATCH v3 3/3] rust: miscdevice: Provide accessor to pull out miscdevice::this_device Alice Ryhl
2024-12-13 16:48 ` Lee Jones
2024-12-16 12:11 ` [PATCH v3 0/3] Additional miscdevice fops parameters Danilo Krummrich
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=20241211115651.GB7139@google.com \
--to=lee@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=arnd@arndb.de \
--cc=benno.lossin@proton.me \
--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=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--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.