umber-kernel/rust/kernel
Philipp Stanner 358cb7055e rust: list: Add unsafe blocks for container_of and safety comments
[ Upstream commit 97b281d7edb2ae662365be2809cd728470119720 ]

impl_list_item_mod.rs calls container_of! without unsafe blocks at a
couple of places. Since container_of! is unsafe, the blocks are strictly
necessary.

The problem was so far not visible because the "unsafe-op-in-unsafe-fn"
check is a lint rather than a hard compiler error, and Rust suppresses
lints triggered inside of a macro from another crate.

Thus, the error becomes only visible once someone from within the kernel
crate tries to use linked lists:

    error[E0133]: call to unsafe function `core::ptr::mut_ptr::<impl *mut T>::byte_sub`
    is unsafe and requires unsafe block
       --> rust/kernel/lib.rs:252:29
        |
    252 |           let container_ptr = field_ptr.byte_sub(offset).cast::<$Container>();
        |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^ call to unsafe function
        |
       ::: rust/kernel/drm/jq.rs:98:1
        |
    98  | / impl_list_item! {
    99  | |     impl ListItem<0> for BasicItem { using ListLinks { self.links }; }
    100 | | }
        | |_- in this macro invocation
        |
    note: an unsafe function restricts its caller, but its body is safe by default
       --> rust/kernel/list/impl_list_item_mod.rs:216:13
        |
    216 |               unsafe fn view_value(me: *mut $crate::list::ListLinks<$num>) -> *const Self {
        |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        |
       ::: rust/kernel/drm/jq.rs:98:1
        |
    98  | / impl_list_item! {
    99  | |     impl ListItem<0> for BasicItem { using ListLinks { self.links }; }
    100 | | }
        | |_- in this macro invocation
        = note: requested on the command line with `-D unsafe-op-in-unsafe-fn`
        = note: this error originates in the macro `$crate::container_of` which comes
        from the expansion of the macro `impl_list_item`

Therefore, add unsafe blocks to container_of! calls to fix the issue.

[ As discussed, let's fix the build for those that want to use the
  macro within the `kernel` crate now and we can discuss the proper
  safety comments afterwards. Thus I removed the ones from the patch.

  However, we cannot just avoid the comments with `CLIPPY=1`, so I
  provided placeholders for now, like we did in the past. They were
  also needed for an `unsafe impl`.

  While I am not happy about it, it isn't worse than the current
  status (the comments were meant to be there), and at least this
  shows what is missing -- our pre-existing "good first issue" [1]
  may motivate new contributors to complete them properly.

  Finally, I moved one of the existing safety comments one line down
  so that Clippy could locate it.

  Link: https://github.com/Rust-for-Linux/linux/issues/351 [1]

    - Miguel ]

Cc: stable@vger.kernel.org
Fixes: c77f85b347 ("rust: list: remove OFFSET constants")
Suggested-by: Alice Ryhl <aliceryhl@google.com>
Signed-off-by: Philipp Stanner <phasta@kernel.org>
Reviewed-by: Gary Guo <gary@garyguo.net>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Link: https://patch.msgid.link/20260216131613.45344-3-phasta@kernel.org
[ Fixed formatting. Reworded to fix the lint suppression
  explanation. Indent build error. - Miguel ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2026-03-04 07:21:35 -05:00
..
alloc rust: alloc: employ a trailing comment to keep vertical layout 2025-10-17 00:56:20 +02:00
block for-6.18/block-20250929 2025-10-02 10:16:56 -07:00
debugfs rust: debugfs: Add support for scoped directories 2025-09-10 18:58:29 +02:00
device rust: device: use `kernel::{fmt,prelude::fmt!}` 2025-09-16 09:26:59 +02:00
drm rust/drm: Fix Registration::{new,new_foreign_owned}() docs 2026-03-04 07:21:15 -05:00
fs rust: file: add intra-doc link for 'EBADF' 2025-10-07 12:48:33 +02:00
io rust: io: always inline functions using build_assert with arguments 2026-01-30 10:32:26 +01:00
irq rust: irq: add `'static` bounds to irq callbacks 2026-03-04 07:21:33 -05:00
list rust: list: Add unsafe blocks for container_of and safety comments 2026-03-04 07:21:35 -05:00
mm rust: mm: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-13 16:55:15 -07:00
net Networking changes for 6.18. 2025-10-02 15:17:01 -07:00
pci rust: pci: display symbolic PCI vendor names 2025-09-25 15:52:00 +02:00
sync rust: sync: refcount: always inline functions using build_assert with arguments 2026-02-06 16:57:41 +01:00
time rust: hrtimer: Add HrTimer::expires() 2025-09-04 16:54:39 +02:00
.gitignore rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
acpi.rs rust: acpi: use `core::ffi::CStr` method names 2025-09-16 09:26:59 +02:00
alloc.rs Summary of significant series in this pull request: 2025-10-02 18:18:33 -07:00
auxiliary.rs rust: device: fix device context of Device::parent() 2025-10-17 23:24:19 +02:00
bitmap.rs rust: bitmap: fix formatting 2025-10-17 13:02:22 +02:00
bits.rs rust: bits: always inline functions using build_assert with arguments 2026-02-06 16:57:41 +01:00
block.rs rust: block: add block related constants 2025-09-02 05:23:56 -06:00
bug.rs rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
build_assert.rs
clk.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
configfs.rs for-6.18/block-20250929 2025-10-02 10:16:56 -07:00
cpu.rs rust: kernel: cpu: mark `CpuId::current()` inline 2025-09-14 23:58:45 +02:00
cpufreq.rs rust: cpufreq: always inline functions using build_assert with arguments 2026-03-04 07:19:37 -05:00
cpumask.rs rust: cpumask: Mark CpumaskVar as transparent 2025-08-14 09:55:47 +05:30
cred.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
debugfs.rs rust: debugfs: Add support for scoped directories 2025-09-10 18:58:29 +02:00
device.rs rust: device: fix broken intra-doc links 2026-02-19 16:31:31 +01:00
device_id.rs modpost: Add modname to mod_device_table alias 2025-09-24 09:10:45 -07:00
devres.rs rust: io: add typedef for phys_addr_t 2026-01-02 12:57:05 +01:00
dma.rs rust: dma: fix broken intra-doc links 2026-02-19 16:31:31 +01:00
driver.rs rust: driver: fix broken intra-doc links to example driver types 2026-02-19 16:31:31 +01:00
error.rs rust: error: improve `to_result` documentation 2025-09-10 00:10:10 +02:00
faux.rs rust: faux: fix C header link 2025-08-13 17:40:28 +02:00
firmware.rs rust: firmware: use `core::ffi::CStr` method names 2025-09-16 09:26:59 +02:00
fmt.rs rust: kernel: add `fmt` module 2025-07-21 01:16:35 +02:00
fs.rs rust: fs: add Kiocb struct 2025-09-06 13:27:20 +02:00
generated_arch_reachable_asm.rs.S rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
generated_arch_static_branch_asm.rs.S
generated_arch_warn_asm.rs.S rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
id_pool.rs rust: add dynamic ID pool abstraction for bitmap 2025-09-22 15:52:44 -04:00
init.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
io.rs rust: io: always inline functions using build_assert with arguments 2026-01-30 10:32:26 +01:00
ioctl.rs
iov.rs rust: iov: add iov_iter abstractions for ITER_DEST 2025-09-06 13:27:20 +02:00
irq.rs rust: irq: add support for threaded IRQs and handlers 2025-08-12 20:22:09 +02:00
jump_label.rs
kunit.rs linux_kselftest-kunit-6.18-rc1 2025-10-01 19:15:11 -07:00
lib.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
list.rs rust: list: Add an example for `ListLinksSelfPtr` usage 2025-09-15 01:10:23 +02:00
maple_tree.rs rust: maple_tree: rcu_read_lock() in destructor to silence lockdep 2026-01-08 10:17:11 +01:00
miscdevice.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
mm.rs rust: mm: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-13 16:55:15 -07:00
net.rs
of.rs rust: of: use `core::ffi::CStr` method names 2025-09-16 09:26:59 +02:00
opp.rs Merge branches 'pm-em', 'pm-opp' and 'pm-devfreq' 2025-09-29 12:30:44 +02:00
page.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
pci.rs rust: pci: fix incorrect platform reference in PCI driver probe doc comment 2025-09-17 12:51:13 +02:00
pid_namespace.rs rust: pid_namespace: update AlwaysRefCounted imports from sync::aref 2025-08-19 13:08:41 +02:00
platform.rs rust: driver-core: Update ARef and AlwaysRefCounted imports from sync::aref 2025-08-15 22:34:41 +02:00
prelude.rs rust: prelude: re-export `core::mem::{align,size}_of{,_val}` 2025-09-08 00:11:19 +02:00
print.rs rust: use `kernel::{fmt,prelude::fmt!}` 2025-07-21 01:16:35 +02:00
processor.rs rust: Add cpu_relax() helper 2025-08-21 16:58:07 +02:00
ptr.rs rust: add `Alignment` type 2025-09-22 23:55:41 +02:00
rbtree.rs rust: rbtree: fix documentation typo in CursorMut peek_next method 2026-02-06 16:57:38 +01:00
regulator.rs rust: regulator: add devm_enable and devm_enable_optional 2025-09-10 21:02:16 +01:00
revocable.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
scatterlist.rs rust: scatterlist: Add abstraction for sg_table 2025-09-04 23:33:50 +02:00
security.rs rust_binder: add Rust Binder driver 2025-09-19 09:40:46 +02:00
seq_file.rs rust: seq_file: use `kernel::{fmt,prelude::fmt!}` 2025-09-16 09:26:59 +02:00
sizes.rs
static_assert.rs
std_vendor.rs
str.rs rust: block: use `NullTerminatedFormatter` 2025-09-02 05:23:56 -06:00
sync.rs rust: implement `kernel::sync::Refcount` 2025-09-15 09:38:35 +02:00
task.rs rust: task: restrict Task::group_leader() to current 2026-02-26 14:59:18 -08:00
time.rs rust: time: Implement basic arithmetic operations for Delta 2025-09-04 16:56:48 +02:00
tracepoint.rs
transmute.rs rust: transmute: add `from_bytes_copy` method to `FromBytes` trait 2025-08-28 22:31:17 +09:00
types.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
uaccess.rs
usb.rs rust: usb: keep usb::Device private for now 2025-09-26 08:09:08 +02:00
workqueue.rs rust: pin-init: add pin projections to `#[pin_data]` 2025-09-11 23:26:20 +02:00
xarray.rs