This is a patchset to add rust skeleton codes to the current Extended Read-Only File System (erofs) implementation suggested by a recent OSPP Project[1]. The implementation is deeply inspired by the current C implementation, and it's based on a generic erofs_sys crate[2] written by me.
The purpose of this patchset is to provide infrastructure to potentially replace all of C codes with rust with better maintainability and performance with the help of Rust's safety features and better optimization capabilities. This patchset implements basic I/O operations and it's generally functional, however i haven't tested all possible testcases (some of them are chunk-based image files) yet. So it's welcome to be tested and given supportive reviews. Many of the "extended" features are disabled by default and still not implemented yet but some of them have been already implemented in the crate but kernel-side trait implementations are not ready yet. I'm considering implementing it in the near future. Note that, currently Rust VFS patches are still not merged because of the previous rejections suggested by fs-devel team[3]. So this patch set only uses C bindings internally and each unsafe operation is examined. This implementation only offers functions impls and gets its exposed to original C implementation as hooks. Only some of super operations are modified slightly to make sure memory allocation and deallocation are done correctly. Other changes to C are basically importing bindings from rust. Besides, A new erofs_rust_helper.c file is introduced to help rust to deal with folio, iomap and inode internal initializations. Though it may violate some of the Rust-For-Linux principles, i deem it's still ok to at least give it a try by using the Bindgen C bindings since this work does not affect other Kernel APIs or the current Rust For Linux Kernel crate designs. This patchset is baed on the latest erofs-linux dev tree. And the corresponding code can also be found on my github repo[4]. [1]: https://summer-ospp.ac.cn/org/prodetail/241920019?list=org&navpage=org [2]: https://github.com/ToolmanP/erofs-rs [3]: https://lore.kernel.org/rust-for-linux/zzwhqgkl0xpibd5...@casper.infradead.org/ [4]: https://github.com/ToolmanP/erofs-rs-linux Yiyang Wu (3): erofs: add erofs_sys crate erofs: add implementation for erofs_sys erofs: add rust options fs/erofs/Kconfig | 11 + fs/erofs/Makefile | 1 + fs/erofs/data.c | 83 ++- fs/erofs/dir.c | 20 +- fs/erofs/erofs_rust.rs | 294 +++++++++ fs/erofs/erofs_rust_bindings.h | 47 ++ fs/erofs/erofs_rust_helper.c | 107 ++++ fs/erofs/erofs_rust_helper.h | 40 ++ fs/erofs/inode.c | 51 +- fs/erofs/internal.h | 3 + fs/erofs/namei.c | 30 +- fs/erofs/rust/erofs_sys.rs | 67 ++ fs/erofs/rust/erofs_sys/alloc_helper.rs | 57 ++ fs/erofs/rust/erofs_sys/compression.rs | 18 + fs/erofs/rust/erofs_sys/data.rs | 640 +++++++++++++++++++ fs/erofs/rust/erofs_sys/data/uncompressed.rs | 61 ++ fs/erofs/rust/erofs_sys/devices.rs | 53 ++ fs/erofs/rust/erofs_sys/dir.rs | 83 +++ fs/erofs/rust/erofs_sys/inode.rs | 407 ++++++++++++ fs/erofs/rust/erofs_sys/map.rs | 28 + fs/erofs/rust/erofs_sys/operations.rs | 96 +++ fs/erofs/rust/erofs_sys/superblock.rs | 554 ++++++++++++++++ fs/erofs/rust/erofs_sys/superblock/file.rs | 114 ++++ fs/erofs/rust/erofs_sys/superblock/mem.rs | 156 +++++ fs/erofs/rust/erofs_sys/xattrs.rs | 175 +++++ fs/erofs/rust/kinode.rs | 103 +++ fs/erofs/rust/kinode/kinode_helper.rs | 26 + fs/erofs/rust/mod.rs | 6 + fs/erofs/rust/sources.rs | 5 + fs/erofs/rust/sources/mm.rs | 62 ++ fs/erofs/rust/sources/page_helper.rs | 12 + fs/erofs/super.c | 223 +++++-- 32 files changed, 3523 insertions(+), 110 deletions(-) create mode 100644 fs/erofs/erofs_rust.rs create mode 100644 fs/erofs/erofs_rust_bindings.h create mode 100644 fs/erofs/erofs_rust_helper.c create mode 100644 fs/erofs/erofs_rust_helper.h create mode 100644 fs/erofs/rust/erofs_sys.rs create mode 100644 fs/erofs/rust/erofs_sys/alloc_helper.rs create mode 100644 fs/erofs/rust/erofs_sys/compression.rs create mode 100644 fs/erofs/rust/erofs_sys/data.rs create mode 100644 fs/erofs/rust/erofs_sys/data/uncompressed.rs create mode 100644 fs/erofs/rust/erofs_sys/devices.rs create mode 100644 fs/erofs/rust/erofs_sys/dir.rs create mode 100644 fs/erofs/rust/erofs_sys/inode.rs create mode 100644 fs/erofs/rust/erofs_sys/map.rs create mode 100644 fs/erofs/rust/erofs_sys/operations.rs create mode 100644 fs/erofs/rust/erofs_sys/superblock.rs create mode 100644 fs/erofs/rust/erofs_sys/superblock/file.rs create mode 100644 fs/erofs/rust/erofs_sys/superblock/mem.rs create mode 100644 fs/erofs/rust/erofs_sys/xattrs.rs create mode 100644 fs/erofs/rust/kinode.rs create mode 100644 fs/erofs/rust/kinode/kinode_helper.rs create mode 100644 fs/erofs/rust/mod.rs create mode 100644 fs/erofs/rust/sources.rs create mode 100644 fs/erofs/rust/sources/mm.rs create mode 100644 fs/erofs/rust/sources/page_helper.rs -- 2.45.2