From: Ariel Miculas <amiculas@cisco.com>
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,
shallyn@cisco.com, Ariel Miculas <amiculas@cisco.com>
Subject: [RFC PATCH v3 22/22] fs: puzzlefs: implement statfs for puzzlefs
Date: Thu, 16 May 2024 22:03:45 +0300 [thread overview]
Message-ID: <20240516190345.957477-23-amiculas@cisco.com> (raw)
In-Reply-To: <20240516190345.957477-1-amiculas@cisco.com>
In order to use a filesystem as a lower filesystem in an overlay, it
must implement statfs.
Signed-off-by: Ariel Miculas <amiculas@cisco.com>
---
fs/puzzlefs/puzzle/inode.rs | 26 ++++++++++++++++++++++++--
fs/puzzlefs/puzzlefs.rs | 21 +++++++++++++++++++--
2 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/fs/puzzlefs/puzzle/inode.rs b/fs/puzzlefs/puzzle/inode.rs
index 318edbdc5163..a34f1064b632 100644
--- a/fs/puzzlefs/puzzle/inode.rs
+++ b/fs/puzzlefs/puzzle/inode.rs
@@ -14,6 +14,8 @@
pub(crate) struct PuzzleFS {
pub(crate) oci: Image,
layers: Vec<format::MetadataBlob>,
+ pub(crate) total_inodes: u64,
+ pub(crate) total_block_size: u64,
}
impl PuzzleFS {
@@ -22,13 +24,33 @@ pub(crate) fn open(oci_root_dir: &CStr, rootfs_path: &CStr) -> Result<PuzzleFS>
let oci = Image::open(vfs_mount)?;
let rootfs = oci.open_rootfs_blob(rootfs_path)?;
+ let mut total_block_size = 0;
+ let mut total_inodes: u64 = 0;
let mut layers = Vec::new();
for md in rootfs.metadatas.iter() {
let digest = Digest::try_from(md)?;
- layers.push(oci.open_metadata_blob(&digest)?, GFP_KERNEL)?;
+ let layer = oci.open_metadata_blob(&digest)?;
+
+ // This may take up too much time, but we need to implement statfs if we want to use
+ // puzzlefs as a lower filesystem in overlayfs
+ let inodes = layer.get_inode_vector()?;
+ total_inodes += u64::from(inodes.len());
+ for inode_number in 0..inodes.len() {
+ let inode = Inode::from_capnp(inodes.get(inode_number))?;
+ if let InodeMode::File { chunks } = inode.mode {
+ total_block_size += chunks.iter().map(|chunk| chunk.len).sum::<u64>();
+ }
+ }
+
+ layers.push(layer, GFP_KERNEL)?;
}
- Ok(PuzzleFS { oci, layers })
+ Ok(PuzzleFS {
+ oci,
+ layers,
+ total_inodes,
+ total_block_size,
+ })
}
pub(crate) fn find_inode(&self, ino: u64) -> Result<Inode> {
diff --git a/fs/puzzlefs/puzzlefs.rs b/fs/puzzlefs/puzzlefs.rs
index 932f31917992..633f60983849 100644
--- a/fs/puzzlefs/puzzlefs.rs
+++ b/fs/puzzlefs/puzzlefs.rs
@@ -4,7 +4,7 @@
use kernel::fs::{
address_space, dentry, dentry::DEntry, file, file::DirEntryType, file::File, inode,
- inode::INode, sb, Offset,
+ inode::INode, sb, Offset, Stat,
};
use kernel::prelude::*;
use kernel::types::{ARef, Either, Locked};
@@ -23,6 +23,10 @@
license: "GPL",
}
+const PUZZLEFS_BSIZE: u64 = 1 << PUZZLEFS_BSIZE_BITS;
+const PUZZLEFS_BSIZE_BITS: u8 = 12;
+const PUZZLEFS_MAGIC: usize = 0x7a7a7570;
+
fn mode_to_fs_type(inode: &Inode) -> Result<DirEntryType> {
Ok(match inode.mode {
InodeMode::File { .. } => DirEntryType::Reg,
@@ -156,7 +160,7 @@ fn fill_super(
);
let puzzlefs = puzzlefs?;
- sb.set_magic(0x7a7a7570);
+ sb.set_magic(PUZZLEFS_MAGIC);
Ok(Box::new(puzzlefs, GFP_KERNEL)?)
}
@@ -194,6 +198,19 @@ fn read_xattr(
}
Err(ENODATA)
}
+
+ fn statfs(dentry: &DEntry<Self>) -> Result<Stat> {
+ let puzzlefs = dentry.super_block().data();
+
+ Ok(Stat {
+ magic: PUZZLEFS_MAGIC,
+ namelen: isize::MAX,
+ bsize: PUZZLEFS_BSIZE as _,
+ // Round total_block_size up
+ blocks: (puzzlefs.total_block_size + PUZZLEFS_BSIZE - 1) / PUZZLEFS_BSIZE,
+ files: puzzlefs.total_inodes,
+ })
+ }
}
#[vtable]
--
2.34.1
prev parent reply other threads:[~2024-05-16 19:04 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-16 19:03 [RFC PATCH v3 00/22] Rust PuzzleFS filesystem driver Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 01/22] kernel: configs: add qemu-busybox-min.config Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 02/22] rust: hex: import crate Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 03/22] rust: hex: add SPDX license identifiers Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 04/22] rust: Kbuild: enable `hex` Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 05/22] rust: hex: add encode_hex_iter and encode_hex_upper_iter methods Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 06/22] rust: capnp: import crate Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 07/22] rust: capnp: add SPDX License Identifiers Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 08/22] rust: capnp: return an error when trying to display floating point values Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 09/22] rust: Kbuild: enable `capnp` Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 10/22] rust: kernel: add an abstraction over vfsmount to allow cloning a new private mount Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 11/22] rust: file: add bindings for `struct file` Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 12/22] rust: file: Add support for reading files using their path Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 13/22] fs: puzzlefs: Implement the initial version of PuzzleFS Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 14/22] rust: kernel: add from_iter_fallible for Vec<T> Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 15/22] kernel: configs: add puzzlefs config fragment Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 16/22] scripts: add fs directory to rust-analyzer Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 17/22] fs: puzzlefs: add extended attributes support Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 18/22] rust: add improved version of `ForeignOwnable::borrow_mut` Ariel Miculas
2024-05-17 8:37 ` Alice Ryhl
2024-05-16 19:03 ` [RFC PATCH v3 19/22] Add borrow_mut implementation to a ForeignOwnable CString Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 20/22] rust: add support for file system parameters Ariel Miculas
2024-05-16 19:03 ` [RFC PATCH v3 21/22] fs: puzzlefs: add oci_root_dir and image_manifest mount parameters Ariel Miculas
2024-05-16 19:03 ` Ariel Miculas [this message]
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=20240516190345.957477-23-amiculas@cisco.com \
--to=amiculas@cisco.com \
--cc=alex.gaynor@gmail.com \
--cc=brauner@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=shallyn@cisco.com \
--cc=tycho@tycho.pizza \
--cc=viro@zeniv.linux.org.uk \
--cc=wedsonaf@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).