On Wed, Aug 13, 2025 at 3:47 PM Andreas Hindborg <a.hindborg@xxxxxxxxxx> wrote: > > "Alice Ryhl" <aliceryhl@xxxxxxxxxx> writes: > > > On Tue, Aug 12, 2025 at 10:44:29AM +0200, Andreas Hindborg wrote: > >> Allow rust null block devices to be configured and instantiated via > >> `configfs`. > >> > >> Signed-off-by: Andreas Hindborg <a.hindborg@xxxxxxxxxx> > > > > Overall LGTM, but a few comments below: > > > >> diff --git a/drivers/block/rnull/configfs.rs b/drivers/block/rnull/configfs.rs > >> new file mode 100644 > >> index 000000000000..8d469c046a39 > >> --- /dev/null > >> +++ b/drivers/block/rnull/configfs.rs > >> @@ -0,0 +1,218 @@ > >> +// SPDX-License-Identifier: GPL-2.0 > >> + > >> +use super::{NullBlkDevice, THIS_MODULE}; > >> +use core::fmt::Write; > >> +use kernel::{ > >> + block::mq::gen_disk::{GenDisk, GenDiskBuilder}, > >> + c_str, > >> + configfs::{self, AttributeOperations}, > >> + configfs_attrs, new_mutex, > > > > It would be nice to add > > > > pub use configfs_attrs; > > > > to the configfs module so that you can import the macro from the > > configfs module instead of the root. > > OK, I'll do that. > > > > >> + try_pin_init!( DeviceConfig { > >> + data <- new_mutex!( DeviceConfigInner { > > > > Extra spaces in these macros. > > Thanks. I subconsciously like the space in that location, so when > rustfmt is bailing, I get these things in my code. > > >> + let power_op_str = core::str::from_utf8(page)?.trim(); > >> + > >> + let power_op = match power_op_str { > >> + "0" => Ok(false), > >> + "1" => Ok(true), > >> + _ => Err(EINVAL), > >> + }?; > > > > We probably want kstrtobool here instead of manually parsing the > > boolean. > > Yea, I was debating on this a bit. I did want to consolidate this code, > but I don't particularly like ktostrbool. But I guess in the name of > consistency across the kernel it is the right choice. > > I'll add it to next spin. For your convenience, I already wrote a safe wrapper of kstrtobool for an out-of-tree driver. You're welcome to copy-paste this: fn kstrtobool(kstr: &CStr) -> Result<bool> { let mut res = false; to_result(unsafe { kernel::bindings::kstrtobool(kstr.as_char_ptr(), &mut res) })?; Ok(res) } Alice