From nobody Tue Sep 9 23:10:17 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4501C0015E for ; Wed, 26 Jul 2023 17:11:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231892AbjGZRLm (ORCPT ); Wed, 26 Jul 2023 13:11:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51270 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230113AbjGZRLk (ORCPT ); Wed, 26 Jul 2023 13:11:40 -0400 Received: from aer-iport-5.cisco.com (aer-iport-5.cisco.com [173.38.203.67]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F1DF01BD6 for ; Wed, 26 Jul 2023 10:11:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=4965; q=dns/txt; s=iport; t=1690391499; x=1691601099; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=i/lTVDEDYHsEdChSzawXjVr0aEd2CSBfkYp/e9QDjEg=; b=WUikDzkon8wU1d6unzSqMSjmiheOY3pn+0SB/Lt0DxYZC7gJGfDtX0vZ ATJy6CiBE5riZp/LJVjnt2MsO2kJmR61wfPFuuOtHm8OBDbMKNUmhEXIT lnGvV8Uw0Wsy239oXl7diHyjtz2NKFEpARWl9jMmEHOMAkZEp8lC9Qdir E=; X-IronPort-AV: E=Sophos;i="6.01,232,1684800000"; d="scan'208";a="5874456" Received: from aer-iport-nat.cisco.com (HELO aer-core-7.cisco.com) ([173.38.203.22]) by aer-iport-5.cisco.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Jul 2023 16:46:04 +0000 Received: from archlinux-cisco.cisco.com (dhcp-10-61-98-211.cisco.com [10.61.98.211]) (authenticated bits=0) by aer-core-7.cisco.com (8.15.2/8.15.2) with ESMTPSA id 36QGjqTr022602 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 26 Jul 2023 16:46:04 GMT From: Ariel Miculas To: rust-for-linux@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, tycho@tycho.pizza, brauner@kernel.org, viro@zeniv.linux.org.uk, ojeda@kernel.org, alex.gaynor@gmail.com, wedsonaf@gmail.com, Ariel Miculas Subject: [RFC PATCH v2 01/10] samples: puzzlefs: add initial puzzlefs sample, copied from rust_fs.rs Date: Wed, 26 Jul 2023 19:45:25 +0300 Message-ID: <20230726164535.230515-2-amiculas@cisco.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230726164535.230515-1-amiculas@cisco.com> References: <20230726164535.230515-1-amiculas@cisco.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authenticated-User: amiculas X-Outbound-SMTP-Client: 10.61.98.211, dhcp-10-61-98-211.cisco.com X-Outbound-Node: aer-core-7.cisco.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Signed-off-by: Ariel Miculas --- samples/rust/Kconfig | 10 ++++ samples/rust/Makefile | 1 + samples/rust/puzzlefs.rs | 105 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 samples/rust/puzzlefs.rs diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig index 2bd736f99189..05ca21fbba06 100644 --- a/samples/rust/Kconfig +++ b/samples/rust/Kconfig @@ -40,6 +40,16 @@ config SAMPLE_RUST_FS =20 If unsure, say N. =20 +config SAMPLE_PUZZLEFS + tristate "Puzzlefs file system" + help + This option builds the Rust puzzlefs file system sample. + + To compile this as a module, choose M here: + the module will be called puzzlefs. + + If unsure, say N. + config SAMPLE_RUST_HOSTPROGS bool "Host programs" help diff --git a/samples/rust/Makefile b/samples/rust/Makefile index e5941037e673..364a38dbf90b 100644 --- a/samples/rust/Makefile +++ b/samples/rust/Makefile @@ -3,5 +3,6 @@ obj-$(CONFIG_SAMPLE_RUST_MINIMAL) +=3D rust_minimal.o obj-$(CONFIG_SAMPLE_RUST_PRINT) +=3D rust_print.o obj-$(CONFIG_SAMPLE_RUST_FS) +=3D rust_fs.o +obj-$(CONFIG_SAMPLE_PUZZLEFS) +=3D puzzlefs.o =20 subdir-$(CONFIG_SAMPLE_RUST_HOSTPROGS) +=3D hostprogs diff --git a/samples/rust/puzzlefs.rs b/samples/rust/puzzlefs.rs new file mode 100644 index 000000000000..0cf42762e81a --- /dev/null +++ b/samples/rust/puzzlefs.rs @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Rust file system sample. + +use kernel::module_fs; +use kernel::prelude::*; +use kernel::{c_str, file, fs, io_buffer::IoBufferWriter}; + +module_fs! { + type: PuzzleFsModule, + name: "puzzlefs", + author: "Ariel Miculas", + license: "GPL", +} + +struct PuzzleFsModule; + +#[vtable] +impl fs::Context for PuzzleFsModule { + type Data =3D (); + + kernel::define_fs_params! {(), + {flag, "flag", |_, v| { pr_info!("flag passed-in: {v}\n"); Ok(()) = } }, + {flag_no, "flagno", |_, v| { pr_info!("flagno passed-in: {v}\n"); = Ok(()) } }, + {bool, "bool", |_, v| { pr_info!("bool passed-in: {v}\n"); Ok(()) = } }, + {u32, "u32", |_, v| { pr_info!("u32 passed-in: {v}\n"); Ok(()) } }, + {u32oct, "u32oct", |_, v| { pr_info!("u32oct passed-in: {v}\n"); O= k(()) } }, + {u32hex, "u32hex", |_, v| { pr_info!("u32hex passed-in: {v}\n"); O= k(()) } }, + {s32, "s32", |_, v| { pr_info!("s32 passed-in: {v}\n"); Ok(()) } }, + {u64, "u64", |_, v| { pr_info!("u64 passed-in: {v}\n"); Ok(()) } }, + {string, "string", |_, v| { pr_info!("string passed-in: {v}\n"); O= k(()) } }, + {enum, "enum", [("first", 10), ("second", 20)], |_, v| { + pr_info!("enum passed-in: {v}\n"); Ok(()) } + }, + } + + fn try_new() -> Result { + Ok(()) + } +} + +impl fs::Type for PuzzleFsModule { + type Context =3D Self; + type INodeData =3D &'static [u8]; + const SUPER_TYPE: fs::Super =3D fs::Super::Independent; + const NAME: &'static CStr =3D c_str!("puzzlefs"); + const FLAGS: i32 =3D fs::flags::USERNS_MOUNT; + const DCACHE_BASED: bool =3D true; + + fn fill_super(_data: (), sb: fs::NewSuperBlock<'_, Self>) -> Result<&f= s::SuperBlock> { + let sb =3D sb.init( + (), + &fs::SuperParams { + magic: 0x72757374, + ..fs::SuperParams::DEFAULT + }, + )?; + let root =3D sb.try_new_populated_root_dentry( + &[], + kernel::fs_entries![ + file("test1", 0o600, "abc\n".as_bytes(), FsFile), + file("test2", 0o600, "def\n".as_bytes(), FsFile), + char("test3", 0o600, [].as_slice(), (10, 125)), + sock("test4", 0o755, [].as_slice()), + fifo("test5", 0o755, [].as_slice()), + block("test6", 0o755, [].as_slice(), (1, 1)), + dir( + "dir1", + 0o755, + [].as_slice(), + [ + file("test1", 0o600, "abc\n".as_bytes(), FsFile), + file("test2", 0o600, "def\n".as_bytes(), FsFile), + ] + ), + ], + )?; + let sb =3D sb.init_root(root)?; + Ok(sb) + } +} + +struct FsFile; + +#[vtable] +impl file::Operations for FsFile { + type OpenData =3D &'static [u8]; + + fn open(_context: &Self::OpenData, _file: &file::File) -> Result { + Ok(()) + } + + fn read( + _data: (), + file: &file::File, + writer: &mut impl IoBufferWriter, + offset: u64, + ) -> Result { + file::read_from_slice( + file.inode::().ok_or(EINVAL)?.fs_data(), + writer, + offset, + ) + } +} --=20 2.41.0