rust/kernel/configfs.rs
Source file repositories/reference/linux-study-clean/rust/kernel/configfs.rs
File Facts
- System
- Linux kernel
- Corpus path
rust/kernel/configfs.rs- Extension
.rs- Size
- 37018 bytes
- Lines
- 1045
- Domain
- Rust Kernel Layer
- Bucket
- Rust API Membrane
- Inferred role
- Rust Kernel Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
Rust-side wrappers and abstractions around kernel C APIs, ownership contracts, allocation, synchronization, and module integration.
- Rust-side wrappers and abstractions around kernel C APIs, ownership contracts, allocation, synchronization, and module integration.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
- No C-style include directives detected by the generator.
Detected Declarations
function Okfunction Errfunction drop_item
Annotated Snippet
fn drop(self: Pin<&mut Self>) {
// SAFETY: We registered `self.subsystem` in the initializer returned by `Self::new`.
unsafe { bindings::configfs_unregister_subsystem(self.subsystem.get()) };
// SAFETY: We initialized the mutex in `Subsystem::new`.
unsafe { bindings::mutex_destroy(&raw mut (*self.subsystem.get()).su_mutex) };
}
}
/// Trait that allows offset calculations for structs that embed a
/// `bindings::config_group`.
///
/// Users of the configfs API should not need to implement this trait.
///
/// # Safety
///
/// - Implementers of this trait must embed a `bindings::config_group`.
/// - Methods must be implemented according to method documentation.
pub unsafe trait HasGroup<Data> {
/// Return the address of the `bindings::config_group` embedded in [`Self`].
///
/// # Safety
///
/// - `this` must be a valid allocation of at least the size of [`Self`].
unsafe fn group(this: *const Self) -> *const bindings::config_group;
/// Return the address of the [`Self`] that `group` is embedded in.
///
/// # Safety
///
/// - `group` must point to the `bindings::config_group` that is embedded in
/// [`Self`].
unsafe fn container_of(group: *const bindings::config_group) -> *const Self;
}
// SAFETY: `Subsystem<Data>` embeds a field of type `bindings::config_group`
// within the `subsystem` field.
unsafe impl<Data> HasGroup<Data> for Subsystem<Data> {
unsafe fn group(this: *const Self) -> *const bindings::config_group {
// SAFETY: By impl and function safety requirement this projection is in bounds.
unsafe { &raw const (*(*this).subsystem.get()).su_group }
}
unsafe fn container_of(group: *const bindings::config_group) -> *const Self {
// SAFETY: By impl and function safety requirement this projection is in bounds.
let c_subsys_ptr = unsafe { container_of!(group, bindings::configfs_subsystem, su_group) };
let opaque_ptr = c_subsys_ptr.cast::<Opaque<bindings::configfs_subsystem>>();
// SAFETY: By impl and function safety requirement, `opaque_ptr` and the
// pointer it returns, are within the same allocation.
unsafe { container_of!(opaque_ptr, Subsystem<Data>, subsystem) }
}
}
/// A configfs group.
///
/// To add a subgroup to configfs, pass this type as `ctype` to
/// [`crate::configfs_attrs`] when creating a group in [`GroupOperations::make_group`].
#[pin_data]
pub struct Group<Data> {
#[pin]
group: Opaque<bindings::config_group>,
#[pin]
data: Data,
}
impl<Data> Group<Data> {
/// Create an initializer for a new group.
///
/// When instantiated, the group will appear as a directory with the name
/// given by `name` and it will contain attributes specified by `item_type`.
pub fn new(
name: CString,
item_type: &'static ItemType<Group<Data>, Data>,
data: impl PinInit<Data, Error>,
) -> impl PinInit<Self, Error> {
try_pin_init!(Self {
group <- pin_init::init_zeroed().chain(|v: &mut Opaque<bindings::config_group>| {
let place = v.get();
let name = name.to_bytes_with_nul().as_ptr();
// SAFETY: It is safe to initialize a group once it has been zeroed.
unsafe {
bindings::config_group_init_type_name(place, name.cast(), item_type.as_ptr())
};
Ok(())
}),
data <- data,
})
}
}
// SAFETY: `Group<Data>` embeds a field of type `bindings::config_group`
Annotation
- Detected declarations: `function Ok`, `function Err`, `function drop_item`.
- Atlas domain: Rust Kernel Layer / Rust API Membrane.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.