diff options
author | Matthew Maurer <mmaurer@google.com> | 2025-09-04 21:13:55 +0000 |
---|---|---|
committer | Danilo Krummrich <dakr@kernel.org> | 2025-09-10 18:58:21 +0200 |
commit | 40ecc49466c8b7f9518c5fbbcfb24cb7e26c36c7 (patch) | |
tree | 6cf8fe2e5cfcd1c7c4e2d93df75cfb110b44586a /rust/kernel/debugfs/file_ops.rs | |
parent | 839dc1d15b9ba5318ed145b20efffcfa91c02a3d (diff) |
rust: debugfs: Add support for callback-based files
Extends the `debugfs` API to support creating files with content
generated and updated by callbacks. This is done via the
`read_callback_file`, `write_callback_file`, and
`read_write_callback_file` methods.
These methods allow for more flexible file definition, either because
the type already has a `Writer` or `Reader` method that doesn't
do what you'd like, or because you cannot implement it (e.g. because
it's a type defined in another crate or a primitive type).
Signed-off-by: Matthew Maurer <mmaurer@google.com>
Tested-by: Dirk Behme <dirk.behme@de.bosch.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://lore.kernel.org/r/20250904-debugfs-rust-v11-4-7d12a165685a@google.com
[ Fix up Result<(), Error> -> Result. - Danilo ]
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Diffstat (limited to 'rust/kernel/debugfs/file_ops.rs')
-rw-r--r-- | rust/kernel/debugfs/file_ops.rs | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/rust/kernel/debugfs/file_ops.rs b/rust/kernel/debugfs/file_ops.rs index 2060c8d14d83..50fead17b6f3 100644 --- a/rust/kernel/debugfs/file_ops.rs +++ b/rust/kernel/debugfs/file_ops.rs @@ -2,6 +2,7 @@ // Copyright (C) 2025 Google LLC. use super::{Reader, Writer}; +use crate::debugfs::callback_adapters::Adapter; use crate::prelude::*; use crate::seq_file::SeqFile; use crate::seq_print; @@ -46,6 +47,13 @@ impl<T> FileOps<T> { } } +impl<T: Adapter> FileOps<T> { + pub(super) const fn adapt(&self) -> &FileOps<T::Inner> { + // SAFETY: `Adapter` asserts that `T` can be legally cast to `T::Inner`. + unsafe { core::mem::transmute(self) } + } +} + #[cfg(CONFIG_DEBUG_FS)] impl<T> Deref for FileOps<T> { type Target = bindings::file_operations; |