From: Wedson Almeida Filho <wedsonaf@gmail.com>
To: Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>,
Matthew Wilcox <willy@infradead.org>,
Dave Chinner <david@fromorbit.com>
Cc: Kent Overstreet <kent.overstreet@gmail.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-fsdevel@vger.kernel.org, rust-for-linux@vger.kernel.org,
linux-kernel@vger.kernel.org,
Wedson Almeida Filho <wedsonaf@gmail.com>
Subject: [RFC PATCH v2 00/30] Rust abstractions for VFS
Date: Tue, 14 May 2024 10:16:41 -0300 [thread overview]
Message-ID: <20240514131711.379322-1-wedsonaf@gmail.com> (raw)
This series introduces Rust abstractions that allow read-only file systems to
be written in Rust.
There are three file systems implementations using these abstractions
abstractions: ext2, tarfs, and puzzlefs. The first two are part of this series.
Rust file system modules can be declared with the `module_fs` macro and are
required to implement the following functions (which are part of the
`FileSystem` trait):
fn fill_super(
sb: &mut SuperBlock<Self, sb::New>,
mapper: Option<inode::Mapper>,
) -> Result<Self::Data>;
fn init_root(sb: &SuperBlock<Self>) -> Result<dentry::Root<Self>>;
They can optionally implement the following:
fn read_xattr(
_dentry: &DEntry<Self>,
_inode: &INode<Self>,
_name: &CStr,
_outbuf: &mut [u8],
) -> Result<usize>;
fn statfs(_dentry: &DEntry<Self>) -> Result<Stat>;
They may also choose the type of the data they can attach to superblocks and/or
inodes.
Lastly, file systems can implement inode, file, and address space operations
and attach them to inodes when they're created, similar to how C does it. They
can get a ro address space operations table from an implementation of iomap
operations, to be used with generic ro file operations.
A git tree is available here:
git://github.com/wedsonaf/linux.git vfs-v2
Web:
https://github.com/wedsonaf/linux/commits/vfs-v2
---
Changes in v2:
- Rebased to latest rust-next tree
- Removed buffer heads
- Added iomap support
- Removed `_pin` field from `Registration` as it's not needed anymore
- Renamed sample filesystem to match the module's name
- Using typestate instead of a separate type for superblock/new-superblock
- Created separate submodules for superblocks, inodes, dentries, and files
- Split out operations from FileSystem to inode/file/address_space ops, similar to how C does it
- Removed usages of folio_set_error
- Removed UniqueFolio, for now reading blocks from devices via the pagecache
- Changed map() to return the entire folio if not in highmem
- Added support for unlocking the folio asynchronously
- Added `from_raw` to all new ref-counted types
- Added explicit types in calls to cast()
- Added typestate to folio
- Added support for implementing get_link
- Fixed data race when reading inode->i_state
- Added nofs scope support during allocation
- Link to v1: https://lore.kernel.org/rust-for-linux/20231018122518.128049-1-wedsonaf@gmail.com/
---
Wedson Almeida Filho (30):
rust: fs: add registration/unregistration of file systems
rust: fs: introduce the `module_fs` macro
samples: rust: add initial ro file system sample
rust: fs: introduce `FileSystem::fill_super`
rust: fs: introduce `INode<T>`
rust: fs: introduce `DEntry<T>`
rust: fs: introduce `FileSystem::init_root`
rust: file: move `kernel::file` to `kernel::fs::file`
rust: fs: generalise `File` for different file systems
rust: fs: add empty file operations
rust: fs: introduce `file::Operations::read_dir`
rust: fs: introduce `file::Operations::seek`
rust: fs: introduce `file::Operations::read`
rust: fs: add empty inode operations
rust: fs: introduce `inode::Operations::lookup`
rust: folio: introduce basic support for folios
rust: fs: add empty address space operations
rust: fs: introduce `address_space::Operations::read_folio`
rust: fs: introduce `FileSystem::read_xattr`
rust: fs: introduce `FileSystem::statfs`
rust: fs: introduce more inode types
rust: fs: add per-superblock data
rust: fs: allow file systems backed by a block device
rust: fs: allow per-inode data
rust: fs: export file type from mode constants
rust: fs: allow populating i_lnk
rust: fs: add `iomap` module
rust: fs: add memalloc_nofs support
tarfs: introduce tar fs
WIP: fs: ext2: add rust ro ext2 implementation
fs/Kconfig | 2 +
fs/Makefile | 2 +
fs/rust-ext2/Kconfig | 13 +
fs/rust-ext2/Makefile | 8 +
fs/rust-ext2/defs.rs | 173 +++++++
fs/rust-ext2/ext2.rs | 551 +++++++++++++++++++++
fs/tarfs/Kconfig | 15 +
fs/tarfs/Makefile | 8 +
fs/tarfs/defs.rs | 80 +++
fs/tarfs/tar.rs | 394 +++++++++++++++
rust/bindings/bindings_helper.h | 11 +
rust/helpers.c | 182 +++++++
rust/kernel/block.rs | 10 +-
rust/kernel/error.rs | 8 +-
rust/kernel/file.rs | 251 ----------
rust/kernel/folio.rs | 305 ++++++++++++
rust/kernel/fs.rs | 492 +++++++++++++++++++
rust/kernel/fs/address_space.rs | 90 ++++
rust/kernel/fs/dentry.rs | 136 ++++++
rust/kernel/fs/file.rs | 607 +++++++++++++++++++++++
rust/kernel/fs/inode.rs | 780 ++++++++++++++++++++++++++++++
rust/kernel/fs/iomap.rs | 281 +++++++++++
rust/kernel/fs/sb.rs | 194 ++++++++
rust/kernel/lib.rs | 6 +-
rust/kernel/mem_cache.rs | 2 -
rust/kernel/user.rs | 1 -
samples/rust/Kconfig | 10 +
samples/rust/Makefile | 1 +
samples/rust/rust_rofs.rs | 202 ++++++++
scripts/generate_rust_analyzer.py | 2 +-
30 files changed, 4555 insertions(+), 262 deletions(-)
create mode 100644 fs/rust-ext2/Kconfig
create mode 100644 fs/rust-ext2/Makefile
create mode 100644 fs/rust-ext2/defs.rs
create mode 100644 fs/rust-ext2/ext2.rs
create mode 100644 fs/tarfs/Kconfig
create mode 100644 fs/tarfs/Makefile
create mode 100644 fs/tarfs/defs.rs
create mode 100644 fs/tarfs/tar.rs
delete mode 100644 rust/kernel/file.rs
create mode 100644 rust/kernel/folio.rs
create mode 100644 rust/kernel/fs.rs
create mode 100644 rust/kernel/fs/address_space.rs
create mode 100644 rust/kernel/fs/dentry.rs
create mode 100644 rust/kernel/fs/file.rs
create mode 100644 rust/kernel/fs/inode.rs
create mode 100644 rust/kernel/fs/iomap.rs
create mode 100644 rust/kernel/fs/sb.rs
create mode 100644 samples/rust/rust_rofs.rs
base-commit: 183ea65d1fcd71039cf4d111a22d69c337bfd344
--
2.34.1
next reply other threads:[~2024-05-14 13:17 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-14 13:16 Wedson Almeida Filho [this message]
2024-05-14 13:16 ` [RFC PATCH v2 01/30] rust: fs: add registration/unregistration of file systems Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 02/30] rust: fs: introduce the `module_fs` macro Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 03/30] samples: rust: add initial ro file system sample Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 04/30] rust: fs: introduce `FileSystem::fill_super` Wedson Almeida Filho
2024-05-20 19:38 ` Darrick J. Wong
2024-05-14 13:16 ` [RFC PATCH v2 05/30] rust: fs: introduce `INode<T>` Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 06/30] rust: fs: introduce `DEntry<T>` Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 07/30] rust: fs: introduce `FileSystem::init_root` Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 08/30] rust: file: move `kernel::file` to `kernel::fs::file` Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 09/30] rust: fs: generalise `File` for different file systems Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 10/30] rust: fs: add empty file operations Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 11/30] rust: fs: introduce `file::Operations::read_dir` Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 12/30] rust: fs: introduce `file::Operations::seek` Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 13/30] rust: fs: introduce `file::Operations::read` Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 14/30] rust: fs: add empty inode operations Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 15/30] rust: fs: introduce `inode::Operations::lookup` Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 16/30] rust: folio: introduce basic support for folios Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 17/30] rust: fs: add empty address space operations Wedson Almeida Filho
2024-05-14 13:16 ` [RFC PATCH v2 18/30] rust: fs: introduce `address_space::Operations::read_folio` Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 19/30] rust: fs: introduce `FileSystem::read_xattr` Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 20/30] rust: fs: introduce `FileSystem::statfs` Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 21/30] rust: fs: introduce more inode types Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 22/30] rust: fs: add per-superblock data Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 23/30] rust: fs: allow file systems backed by a block device Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 24/30] rust: fs: allow per-inode data Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 25/30] rust: fs: export file type from mode constants Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 26/30] rust: fs: allow populating i_lnk Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 27/30] rust: fs: add `iomap` module Wedson Almeida Filho
2024-05-20 19:32 ` Darrick J. Wong
2024-05-14 13:17 ` [RFC PATCH v2 28/30] rust: fs: add memalloc_nofs support Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 29/30] tarfs: introduce tar fs Wedson Almeida Filho
2024-05-14 13:17 ` [RFC PATCH v2 30/30] WIP: fs: ext2: add rust ro ext2 implementation Wedson Almeida Filho
2024-05-20 20:01 ` Darrick J. Wong
2024-05-31 14:34 ` [RFC PATCH v2 00/30] Rust abstractions for VFS Danilo Krummrich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240514131711.379322-1-wedsonaf@gmail.com \
--to=wedsonaf@gmail.com \
--cc=brauner@kernel.org \
--cc=david@fromorbit.com \
--cc=gregkh@linuxfoundation.org \
--cc=kent.overstreet@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.