mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
rust: debugfs: Add support for read-only files
Extends the `debugfs` API to support creating read-only files. This is done via the `Dir::read_only_file` method, which takes a data object that implements the `Writer` trait. The file's content is generated by the `Writer` implementation, and the file is automatically removed when the returned `File` handle is dropped. 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-2-7d12a165685a@google.com [ Fixup build failure when CONFIG_DEBUGFS=n. - Danilo ] Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
committed by
Danilo Krummrich
parent
7f201ca18c
commit
5e40b591cb
@@ -1,6 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Copyright (C) 2025 Google LLC.
|
||||
|
||||
use crate::debugfs::file_ops::FileOps;
|
||||
use crate::ffi::c_void;
|
||||
use crate::str::CStr;
|
||||
use crate::sync::Arc;
|
||||
|
||||
@@ -40,6 +42,46 @@ impl Entry {
|
||||
}
|
||||
}
|
||||
|
||||
/// # Safety
|
||||
///
|
||||
/// * `data` must outlive the returned `Entry`.
|
||||
pub(crate) unsafe fn dynamic_file<T>(
|
||||
name: &CStr,
|
||||
parent: Arc<Self>,
|
||||
data: &T,
|
||||
file_ops: &'static FileOps<T>,
|
||||
) -> Self {
|
||||
// SAFETY: The invariants of this function's arguments ensure the safety of this call.
|
||||
// * `name` is a valid C string by the invariants of `&CStr`.
|
||||
// * `parent.as_ptr()` is a pointer to a valid `dentry` by invariant.
|
||||
// * The caller guarantees that `data` will outlive the returned `Entry`.
|
||||
// * The guarantees on `FileOps` assert the vtable will be compatible with the data we have
|
||||
// provided.
|
||||
let entry = unsafe {
|
||||
bindings::debugfs_create_file_full(
|
||||
name.as_char_ptr(),
|
||||
file_ops.mode(),
|
||||
parent.as_ptr(),
|
||||
core::ptr::from_ref(data) as *mut c_void,
|
||||
core::ptr::null(),
|
||||
&**file_ops,
|
||||
)
|
||||
};
|
||||
|
||||
Entry {
|
||||
entry,
|
||||
_parent: Some(parent),
|
||||
}
|
||||
}
|
||||
|
||||
/// Constructs a placeholder DebugFS [`Entry`].
|
||||
pub(crate) fn empty() -> Self {
|
||||
Self {
|
||||
entry: core::ptr::null_mut(),
|
||||
_parent: None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the pointer representation of the DebugFS directory.
|
||||
///
|
||||
/// # Guarantees
|
||||
|
||||
Reference in New Issue
Block a user