From: Ariel Miculas <amiculas@cisco.com>
To: rust-for-linux@vger.kernel.org
Cc: Ariel Miculas <amiculas@cisco.com>
Subject: [PATCH 79/80] rust: puzzlefs: add support for reading files
Date: Fri, 9 Jun 2023 09:31:17 +0300 [thread overview]
Message-ID: <20230609063118.24852-80-amiculas@cisco.com> (raw)
In-Reply-To: <20230609063118.24852-1-amiculas@cisco.com>
Signed-off-by: Ariel Miculas <amiculas@cisco.com>
---
samples/rust/puzzle/inode.rs | 68 ++++++++++++++++++++++++++++++++----
samples/rust/puzzle/oci.rs | 32 +++++++++++++----
samples/rust/puzzle/types.rs | 10 +++---
samples/rust/puzzlefs.rs | 59 ++++++++++++++-----------------
4 files changed, 118 insertions(+), 51 deletions(-)
diff --git a/samples/rust/puzzle/inode.rs b/samples/rust/puzzle/inode.rs
index eaaa6d964db2..678e9fe1af03 100644
--- a/samples/rust/puzzle/inode.rs
+++ b/samples/rust/puzzle/inode.rs
@@ -8,10 +8,10 @@
use crate::puzzle::types::Digest;
use crate::puzzle::types::{FileChunk, Ino, InodeAdditional, MetadataBlob};
use alloc::vec::Vec;
+use core::cmp::min;
use kernel::mount::Vfsmount;
use kernel::prelude::{ENOENT, ENOTDIR};
use kernel::str::CStr;
-use kernel::sync::Arc;
#[derive(Debug)]
pub(crate) struct Inode {
@@ -21,14 +21,16 @@ pub(crate) struct Inode {
pub(crate) additional: Option<InodeAdditional>,
}
+#[derive(Debug)]
pub(crate) struct PuzzleFS {
pub(crate) oci: Image,
layers: Vec<format::MetadataBlob>,
}
impl PuzzleFS {
- pub(crate) fn open(vfsmount: Arc<Vfsmount>, rootfs_path: &CStr) -> Result<PuzzleFS> {
- let oci = Image::open(vfsmount)?;
+ pub(crate) fn open(oci_root_dir: &CStr, rootfs_path: &CStr) -> Result<PuzzleFS> {
+ let vfs_mount = Vfsmount::new_private_mount(oci_root_dir)?;
+ let oci = Image::open(vfs_mount)?;
let rootfs = oci.open_rootfs_blob(rootfs_path)?;
let layers =
@@ -41,8 +43,8 @@ pub(crate) fn open(vfsmount: Arc<Vfsmount>, rootfs_path: &CStr) -> Result<Puzzle
Ok(PuzzleFS { oci, layers })
}
- pub(crate) fn find_inode(&mut self, ino: u64) -> Result<Inode> {
- for layer in self.layers.iter_mut() {
+ pub(crate) fn find_inode(&self, ino: u64) -> Result<Inode> {
+ for layer in self.layers.iter() {
if let Some(inode) = layer.find_inode(ino)? {
return Inode::new(layer, inode);
}
@@ -52,7 +54,7 @@ pub(crate) fn find_inode(&mut self, ino: u64) -> Result<Inode> {
}
impl Inode {
- fn new(layer: &mut MetadataBlob, inode: format::Inode) -> Result<Inode> {
+ fn new(layer: &MetadataBlob, inode: format::Inode) -> Result<Inode> {
let mode = match inode.mode {
format::InodeMode::Reg { offset } => {
let chunks = layer.read_file_chunks(offset)?;
@@ -64,7 +66,7 @@ fn new(layer: &mut MetadataBlob, inode: format::Inode) -> Result<Inode> {
layer
.read_dir_list(offset)?
.entries
- .iter_mut()
+ .iter()
.map(|de| (de.name.try_clone().unwrap(), de.ino)),
)?;
// Unstable sort is used because it avoids memory allocation
@@ -94,3 +96,55 @@ pub(crate) enum InodeMode {
Dir { entries: Vec<(Vec<u8>, Ino)> },
Other,
}
+
+pub(crate) fn file_read(
+ oci: &Image,
+ inode: &Inode,
+ offset: usize,
+ data: &mut [u8],
+) -> Result<usize> {
+ let chunks = match &inode.mode {
+ InodeMode::File { chunks } => chunks,
+ _ => return Err(WireFormatError::from_errno(ENOTDIR)),
+ };
+
+ // TODO: fix all this casting...
+ let end = offset + data.len();
+
+ let mut file_offset = 0;
+ let mut buf_offset = 0;
+ for chunk in chunks {
+ // have we read enough?
+ if file_offset > end {
+ break;
+ }
+
+ // should we skip this chunk?
+ if file_offset + (chunk.len as usize) < offset {
+ file_offset += chunk.len as usize;
+ continue;
+ }
+
+ let addl_offset = if offset > file_offset {
+ offset - file_offset
+ } else {
+ 0
+ };
+
+ // ok, need to read this chunk; how much?
+ let left_in_buf = data.len() - buf_offset;
+ let to_read = min(left_in_buf, chunk.len as usize - addl_offset);
+
+ let start = buf_offset;
+ let finish = start + to_read;
+ file_offset += addl_offset;
+
+ // how many did we actually read?
+ let n = oci.fill_from_chunk(chunk.blob, addl_offset as u64, &mut data[start..finish])?;
+ file_offset += n;
+ buf_offset += n;
+ }
+
+ // discard any extra if we hit EOF
+ Ok(buf_offset)
+}
diff --git a/samples/rust/puzzle/oci.rs b/samples/rust/puzzle/oci.rs
index becb2b868450..935beb168079 100644
--- a/samples/rust/puzzle/oci.rs
+++ b/samples/rust/puzzle/oci.rs
@@ -1,19 +1,21 @@
-use crate::puzzle::error::Result;
+use crate::puzzle::error::{Result, WireFormatError};
+use crate::puzzle::types as format;
use crate::puzzle::types::{Digest, MetadataBlob, Rootfs};
use kernel::c_str;
use kernel::file;
use kernel::file::RegularFile;
use kernel::mount::Vfsmount;
-use kernel::pr_info;
+use kernel::pr_debug;
+use kernel::prelude::ENOTSUPP;
use kernel::str::{CStr, CString};
-use kernel::sync::Arc;
+#[derive(Debug)]
pub(crate) struct Image {
- vfs_mount: Arc<Vfsmount>,
+ pub(crate) vfs_mount: Vfsmount,
}
impl Image {
- pub(crate) fn open(vfsmount: Arc<Vfsmount>) -> Result<Self> {
+ pub(crate) fn open(vfsmount: Vfsmount) -> Result<Self> {
Ok(Image {
vfs_mount: vfsmount,
})
@@ -26,7 +28,7 @@ pub(crate) fn blob_path_relative(&self) -> &CStr {
fn open_raw_blob(&self, digest: &Digest) -> Result<RegularFile> {
let filename =
CString::try_from_fmt(format_args!("{}/{digest}", self.blob_path_relative()))?;
- pr_info!("trying to open {:?}\n", &filename);
+ pr_debug!("trying to open {:?}\n", &filename);
let file = RegularFile::from_path_in_root_mnt(
&self.vfs_mount,
@@ -48,4 +50,22 @@ pub(crate) fn open_rootfs_blob(&self, path: &CStr) -> Result<Rootfs> {
let rootfs = Rootfs::open(self.open_raw_blob(&digest)?)?;
Ok(rootfs)
}
+
+ pub(crate) fn fill_from_chunk(
+ &self,
+ chunk: format::BlobRef,
+ addl_offset: u64,
+ buf: &mut [u8],
+ ) -> Result<usize> {
+ let digest = &<Digest>::try_from(chunk)?;
+
+ let blob = if chunk.compressed {
+ return Err(WireFormatError::KernelError(ENOTSUPP));
+ } else {
+ self.open_raw_blob(digest)?
+ };
+
+ let n = blob.read_with_offset(buf, chunk.offset + addl_offset)?;
+ Ok(n)
+ }
}
diff --git a/samples/rust/puzzle/types.rs b/samples/rust/puzzle/types.rs
index 69d4f5dfa12c..353323f73ab1 100644
--- a/samples/rust/puzzle/types.rs
+++ b/samples/rust/puzzle/types.rs
@@ -148,28 +148,28 @@ pub(crate) fn new(mut f: file::RegularFile) -> Result<MetadataBlob> {
})
}
- pub(crate) fn seek_ref(&mut self, r: &BlobRef) -> Result<u64> {
+ pub(crate) fn seek_ref(&self, r: &BlobRef) -> Result<u64> {
match r.kind {
BlobRefKind::Other { .. } => Err(WireFormatError::SeekOtherError),
BlobRefKind::Local => Ok(r.offset),
}
}
- pub(crate) fn read_file_chunks(&mut self, offset: u64) -> Result<Vec<FileChunk>> {
+ pub(crate) fn read_file_chunks(&self, offset: u64) -> Result<Vec<FileChunk>> {
read_one_from_slice::<FileChunkList>(&self.mmapped_region[offset as usize..])
.map(|cl| cl.chunks)
}
- pub(crate) fn read_dir_list(&mut self, offset: u64) -> Result<DirList> {
+ pub(crate) fn read_dir_list(&self, offset: u64) -> Result<DirList> {
read_one_from_slice(&self.mmapped_region[offset as usize..])
}
- pub(crate) fn read_inode_additional(&mut self, r: &BlobRef) -> Result<InodeAdditional> {
+ pub(crate) fn read_inode_additional(&self, r: &BlobRef) -> Result<InodeAdditional> {
let offset = self.seek_ref(r)? as usize;
read_one_from_slice(&self.mmapped_region[offset..])
}
- pub(crate) fn find_inode(&mut self, ino: Ino) -> Result<Option<Inode>> {
+ pub(crate) fn find_inode(&self, ino: Ino) -> Result<Option<Inode>> {
let mut left = 0;
let mut right = self.inode_count;
diff --git a/samples/rust/puzzlefs.rs b/samples/rust/puzzlefs.rs
index f04a2e5bcb04..897a996a6ab3 100644
--- a/samples/rust/puzzlefs.rs
+++ b/samples/rust/puzzlefs.rs
@@ -3,7 +3,6 @@
//! Rust file system sample.
use kernel::module_fs;
-use kernel::mount::Vfsmount;
use kernel::prelude::*;
use kernel::{
c_str, file, fs,
@@ -12,7 +11,7 @@
};
mod puzzle;
-use puzzle::inode::{Inode, InodeMode, PuzzleFS};
+use puzzle::inode::{file_read, Inode, InodeMode, PuzzleFS};
use kernel::fs::{DEntry, INodeParams, NeedsRoot, NewSuperBlock, RootDEntry};
@@ -27,7 +26,7 @@
#[derive(Debug)]
struct PuzzlefsInfo {
- vfs_mount: Arc<Vfsmount>,
+ puzzlefs: Arc<PuzzleFS>,
}
#[vtable]
@@ -56,7 +55,7 @@ fn try_new() -> Result {
fn puzzlefs_populate_dir(
sb: &NewSuperBlock<'_, PuzzleFsModule, NeedsRoot>,
- pfs: &mut PuzzleFS,
+ pfs: &PuzzleFS,
parent: &DEntry<PuzzleFsModule>,
ino: u64,
name: &CStr,
@@ -111,7 +110,7 @@ fn puzzlefs_populate_dir(
/// Creates a new root dentry populated with the given entries.
fn try_new_populated_root_puzzlefs_dentry(
sb: &NewSuperBlock<'_, PuzzleFsModule, NeedsRoot>,
- pfs: &mut PuzzleFS,
+ pfs: &PuzzleFS,
root_value: <PuzzleFsModule as fs::Type>::INodeData,
) -> Result<RootDEntry<PuzzleFsModule>> {
let root_inode = sb.sb.try_new_dcache_dir_inode(INodeParams {
@@ -136,14 +135,20 @@ impl fs::Type for PuzzleFsModule {
const DCACHE_BASED: bool = true;
fn fill_super(_data: (), sb: fs::NewSuperBlock<'_, Self>) -> Result<&fs::SuperBlock<Self>> {
- let vfs_mount = Vfsmount::new_private_mount(c_str!("/home/puzzlefs_oci"))?;
- pr_info!("vfs_mount {:?}\n", vfs_mount);
+ let puzzlefs = PuzzleFS::open(
+ c_str!("/home/puzzlefs_oci"),
+ c_str!("2d6602d678140540dc7e96de652a76a8b16e8aca190bae141297bcffdcae901b"),
+ );
- let arc_vfs_mount = Arc::try_new(vfs_mount)?;
+ if let Err(ref e) = puzzlefs {
+ pr_info!("error opening puzzlefs {e}\n");
+ }
+
+ let puzzlefs = Arc::try_new(puzzlefs?)?;
let sb = sb.init(
Box::try_new(PuzzlefsInfo {
- vfs_mount: arc_vfs_mount.clone(),
+ puzzlefs: puzzlefs.clone(),
})?,
&fs::SuperParams {
magic: 0x72757374,
@@ -151,19 +156,9 @@ fn fill_super(_data: (), sb: fs::NewSuperBlock<'_, Self>) -> Result<&fs::SuperBl
},
)?;
- let puzzlefs = PuzzleFS::open(
- arc_vfs_mount,
- c_str!("2d6602d678140540dc7e96de652a76a8b16e8aca190bae141297bcffdcae901b"),
- );
-
- if let Err(ref e) = puzzlefs {
- pr_info!("error opening puzzlefs {e}\n");
- }
-
- let mut puzzlefs = puzzlefs?;
let root_inode = Arc::try_new(puzzlefs.find_inode(1)?)?;
- let root = try_new_populated_root_puzzlefs_dentry(&sb, &mut puzzlefs, root_inode)?;
+ let root = try_new_populated_root_puzzlefs_dentry(&sb, &puzzlefs, root_inode)?;
let sb = sb.init_root(root)?;
Ok(sb)
}
@@ -175,34 +170,32 @@ fn fill_super(_data: (), sb: fs::NewSuperBlock<'_, Self>) -> Result<&fs::SuperBl
impl file::Operations for FsFile {
// must be the same as INodeData
type OpenData = Arc<Inode>;
+ // must be the same as fs::Type::Data
+ // TODO: find a way to enforce this
type FSData = Box<PuzzlefsInfo>;
// this is an Arc because Data must be ForeignOwnable and the only implementors of it are Box,
- // Arc and (); we cannot pass a reference to read, so we share Vfsmount using and Arc
- type Data = Arc<Vfsmount>;
+ // Arc and (); we cannot pass a reference to the read callback, so we share PuzzleFS using Arc
+ type Data = Arc<PuzzleFS>;
fn open(
fs_info: &PuzzlefsInfo,
_context: &Self::OpenData,
_file: &file::File,
) -> Result<Self::Data> {
- Ok(fs_info.vfs_mount.clone())
+ Ok(fs_info.puzzlefs.clone())
}
fn read(
- data: ArcBorrow<'_, Vfsmount>,
- _file: &file::File,
+ data: ArcBorrow<'_, PuzzleFS>,
+ file: &file::File,
writer: &mut impl IoBufferWriter,
offset: u64,
) -> Result<usize> {
+ let inode = file.inode::<PuzzleFsModule>().ok_or(EINVAL)?.fs_data();
let mut buf = Vec::try_with_capacity(writer.len())?;
buf.try_resize(writer.len(), 0)?;
- let file = file::RegularFile::from_path_in_root_mnt(
- &data,
- c_str!("data"),
- file::flags::O_RDONLY.try_into().unwrap(),
- 0,
- )?;
- let nr_bytes_read = file.read_with_offset(&mut buf[..], offset)?;
- file::read_from_slice(&buf[..nr_bytes_read], writer, 0)
+ let read = file_read(&data.oci, inode, offset as usize, &mut buf)?;
+ buf.truncate(read);
+ file::read_from_slice(&buf, writer, 0)
}
}
--
2.40.1
next prev parent reply other threads:[~2023-06-09 6:55 UTC|newest]
Thread overview: 134+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-09 6:29 [RFC PATCH 00/80] Rust PuzzleFS filesystem driver Ariel Miculas
2023-06-09 6:29 ` [PATCH 01/80] rust: add definitions for ref-counted inodes and dentries Ariel Miculas
2023-06-09 6:30 ` [PATCH 02/80] rust: add ability to register a file system Ariel Miculas
2023-06-09 9:23 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 03/80] rust: define fs context Ariel Miculas
2023-06-09 6:30 ` [PATCH 04/80] rust: add support for file system parameters Ariel Miculas
2023-06-09 6:30 ` [PATCH 05/80] rust: kernel: add libraries required by the filesystem abstractions Ariel Miculas
2023-06-09 9:46 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 06/80] rust: allow fs driver to initialise new superblocks Ariel Miculas
2023-06-09 6:30 ` [PATCH 07/80] rust: add `module_fs` macro Ariel Miculas
2023-06-09 6:30 ` [PATCH 08/80] WIP: rust: allow fs to be populated Ariel Miculas
2023-06-09 6:30 ` [PATCH 09/80] rust: kernel: backport the delay module from the rust branch Ariel Miculas
2023-06-09 9:29 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 10/80] rust: kernel: add container_of macro Ariel Miculas
2023-06-09 6:30 ` [PATCH 11/80] rust: kernel: add offset_of macro Ariel Miculas
2023-06-09 6:30 ` [PATCH 12/80] drop: Add crate::pr_warn declaration Ariel Miculas
2023-06-09 9:29 ` Miguel Ojeda
2023-06-09 10:46 ` Ariel Miculas (amiculas)
2023-06-09 6:30 ` [PATCH 13/80] rust: kernel: rename from_kernel_errno to from_errno Ariel Miculas
2023-06-09 9:56 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 14/80] rust: kernel: Rename from_pointer to from_foreing and into_pointer to into_foreign Ariel Miculas
2023-06-09 9:57 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 15/80] rust: kernel: add count_paren_items macro, needed by define_fs_params macro Ariel Miculas
2023-06-09 6:30 ` [PATCH 16/80] rust: helpers: add missing rust helper 'alloc_pages' Ariel Miculas
2023-06-09 9:57 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 17/80] kernel: configs: add qemu-busybox-min.config Ariel Miculas
2023-06-09 9:39 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 18/80] rust: kernel: format the rust code Ariel Miculas
2023-06-09 9:21 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 19/80] samples: puzzlefs: add initial puzzlefs sample, copied from rust_fs.rs Ariel Miculas
2023-06-09 6:30 ` [PATCH 20/80] kernel: configs: enable rust samples in rust.config Ariel Miculas
2023-06-09 9:25 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 22/80] rust: proc-macro2: add SPDX License Identifiers Ariel Miculas
2023-06-09 6:30 ` [PATCH 23/80] rust: proc-macro2: remove `unicode_ident` dependency Ariel Miculas
2023-06-09 6:30 ` [PATCH 24/80] rust: quote: import crate Ariel Miculas
2023-06-09 6:30 ` [PATCH 25/80] rust: quote: add SPDX License Identifiers Ariel Miculas
2023-06-09 6:30 ` [PATCH 27/80] rust: syn: " Ariel Miculas
2023-06-09 6:30 ` [PATCH 28/80] rust: syn: remove `unicode-ident` dependency Ariel Miculas
2023-06-09 6:30 ` [PATCH 30/80] rust: serde: add `no_fp_fmt_parse` support Ariel Miculas
2023-06-09 6:30 ` [PATCH 31/80] rust: serde: add SPDX License Identifiers Ariel Miculas
2023-06-10 0:19 ` Kent Overstreet
2023-06-10 6:43 ` Greg KH
2023-06-10 13:18 ` Kent Overstreet
2023-06-10 15:28 ` Greg KH
2023-06-10 0:25 ` Kent Overstreet
2023-06-10 9:04 ` Andreas Hindborg (Samsung)
2023-06-10 13:20 ` Kent Overstreet
2023-06-12 8:56 ` Ariel Miculas
2023-06-10 9:33 ` Miguel Ojeda
2023-06-12 11:58 ` Ariel Miculas
2023-06-15 15:05 ` Ariel Miculas
2023-06-17 16:04 ` Kent Overstreet
2023-06-09 6:30 ` [PATCH 33/80] rust: serde_derive: " Ariel Miculas
2023-06-09 6:30 ` [PATCH 34/80] rust: Kbuild: enable `proc-macro2`, `quote`, `syn`, `serde` and `serde_derive` Ariel Miculas
2023-06-09 6:30 ` [PATCH 35/80] rust: test `serde` support Ariel Miculas
2023-06-09 6:30 ` [PATCH 36/80] Add SAMPLE_RUST_SERDE in rust.config Ariel Miculas
2023-06-09 6:30 ` [PATCH 37/80] rust: kernel: fix compile errors after rebase to rust-next Ariel Miculas
2023-06-09 9:38 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 39/80] rust: serde_cbor: add SPDX License Identifiers Ariel Miculas
2023-06-09 6:30 ` [PATCH 40/80] rust: serde_cbor: add no_fp_fmt_parse support Ariel Miculas
2023-06-09 6:30 ` [PATCH 41/80] rust: Kbuild: enable serde_cbor Ariel Miculas
2023-06-09 10:21 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 42/80] samples: rust: add cbor serialize/deserialize example Ariel Miculas
2023-06-09 6:30 ` [PATCH 43/80] rust: serde_cbor: add support for serde_cbor's from_slice method by using a custom alloc_kernel feature Ariel Miculas
2023-06-09 9:55 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 44/80] rust: serde: add support for deserializing Vec with kernel_alloc feature Ariel Miculas
2023-06-09 10:10 ` Miguel Ojeda
2023-06-09 6:30 ` [PATCH 45/80] rust: file: Replace UnsafeCell with Opaque for File Ariel Miculas
2023-06-09 6:30 ` [PATCH 46/80] rust: kernel: implement fmt::Debug for CString Ariel Miculas
2023-06-09 6:30 ` [PATCH 47/80] samples: puzzlefs: rename RustFs to PuzzleFs Ariel Miculas
2023-06-09 6:30 ` [PATCH 48/80] samples: puzzlefs: add basic deserializing support for the puzzlefs metadata Ariel Miculas
2023-06-09 6:30 ` [PATCH 49/80] rust: file: present the filesystem context to the open function Ariel Miculas
2023-06-09 6:30 ` [PATCH 50/80] rust: kernel: add an abstraction over vfsmount to allow cloning a new private mount Ariel Miculas
2023-06-09 6:30 ` [PATCH 51/80] rust: file: add from_path, from_path_in_root_mnt and read_with_offset methods to File Ariel Miculas
2023-06-09 6:30 ` [PATCH 52/80] samples: puzzlefs: pass the Vfsmount structure from open to read and return the contents of the data file inside /home/puzzlefs_oci Ariel Miculas
2023-06-09 6:30 ` [PATCH 53/80] rust: file: move from_path, from_path_in_root_mnt and read_with_offset methods to a RegularFile newtype Ariel Miculas
2023-06-09 6:30 ` [PATCH 54/80] rust: file: ensure RegularFile can only create regular files Ariel Miculas
2023-06-09 6:30 ` [PATCH 55/80] rust: file: add get_pos method to RegularFile Ariel Miculas
2023-06-09 6:30 ` [PATCH 56/80] rust: file: add methods read_to_end, get_file_size and update_pos " Ariel Miculas
2023-06-09 6:30 ` [PATCH 57/80] rust: file: define a minimal Read trait and implement it for RegularFile Ariel Miculas
2023-06-09 6:30 ` [PATCH 58/80] samples: puzzlefs: add cbor_get_array_size method Ariel Miculas
2023-06-09 6:30 ` [PATCH 59/80] samples: puzzlefs: add KernelError to WireFormatError and implement From conversion Ariel Miculas
2023-06-09 6:30 ` [PATCH 60/80] samples: puzzlefs: implement new for MetadataBlob Ariel Miculas
2023-06-09 6:30 ` [PATCH 61/80] samples: puzzlefs: build puzzlefs into the kernel, thus avoiding the need to export rust symbols Ariel Miculas
2023-06-09 6:31 ` [PATCH 62/80] rust: alloc: add try_clone for Vec<T> Ariel Miculas
2023-06-09 6:31 ` [PATCH 63/80] rust: alloc: add from_iter_fallible " Ariel Miculas
2023-06-09 10:06 ` Miguel Ojeda
2023-06-09 6:31 ` [PATCH 64/80] samples: puzzlefs: implement to_errno and from_errno for WireFormatError Ariel Miculas
2023-06-09 6:31 ` [PATCH 65/80] samples: puzzlefs: add TryReserveError (and from conversion) to WireFormatError Ariel Miculas
2023-06-09 6:31 ` [PATCH 66/80] samples: puzzlefs: add higher level inode related functionality Ariel Miculas
2023-06-09 6:31 ` [PATCH 67/80] samples: puzzlefs: populate the directory entries with the inodes from the puzzlefs metadata file Ariel Miculas
2023-06-09 6:31 ` [PATCH 68/80] rust: hex: import crate Ariel Miculas
2023-06-09 6:31 ` [PATCH 69/80] rust: hex: add SPDX license identifiers Ariel Miculas
2023-06-09 6:31 ` [PATCH 70/80] rust: Kbuild: enable `hex` Ariel Miculas
2023-06-09 6:31 ` [PATCH 71/80] rust: hex: implement FromHex trait and hex::decode using a custom kernel_alloc feature Ariel Miculas
2023-06-09 6:31 ` [PATCH 72/80] rust: hex: add encode_hex_iter and encode_hex_upper_iter methods Ariel Miculas
2023-06-09 6:31 ` [PATCH 73/80] rust: puzzlefs: add HexError to WireFormatError and implement the From conversion Ariel Miculas
2023-06-09 6:31 ` [PATCH 74/80] rust: puzzlefs: display the error value for WireFormatError::KernelError Ariel Miculas
2023-06-09 6:31 ` [PATCH 75/80] samples: puzzlefs: add Rootfs and Digest structs to types.rs Ariel Miculas
2023-06-09 6:31 ` [PATCH 76/80] samples: puzzlefs: implement the conversion from WireFormatError to kernel::error::Error Ariel Miculas
2023-06-09 6:31 ` [PATCH 77/80] rust: puzzlefs: read the puzzlefs image manifest instead of an individual metadata layer Ariel Miculas
2023-06-09 6:31 ` [PATCH 78/80] rust: puzzlefs: rename PuzzleFs to PuzzleFsModule to avoid confusion with the PuzzleFS struct Ariel Miculas
2023-06-09 6:31 ` Ariel Miculas [this message]
2023-06-09 6:31 ` [PATCH 80/80] rust: puzzlefs: add oci_root_dir and image_manifest filesystem parameters Ariel Miculas
2023-06-09 10:26 ` [RFC PATCH 00/80] Rust PuzzleFS filesystem driver Miguel Ojeda
2023-06-09 10:36 ` Christian Brauner
2023-06-09 11:42 ` Miguel Ojeda
[not found] ` <CH0PR11MB529981313ED5A1F815350E41CD51A@CH0PR11MB5299.namprd11.prod.outlook.com>
2023-06-09 11:45 ` Christian Brauner
2023-06-09 12:03 ` Ariel Miculas (amiculas)
2023-06-09 12:56 ` Gao Xiang
2023-06-09 12:07 ` Miguel Ojeda
2023-06-09 12:11 ` Ariel Miculas (amiculas)
2023-06-09 12:21 ` Greg KH
2023-06-09 13:05 ` Alice Ryhl
2023-06-09 12:20 ` Colin Walters
2023-06-09 12:42 ` Christian Brauner
2023-06-09 17:28 ` Serge Hallyn
2023-06-09 13:45 ` Ariel Miculas (amiculas)
2023-06-09 17:10 ` Trilok Soni
2023-06-09 17:16 ` Ariel Miculas (amiculas)
2023-06-09 17:41 ` Miguel Ojeda
2023-06-09 18:49 ` James Bottomley
2023-06-09 19:08 ` Miguel Ojeda
2023-06-09 19:11 ` Ariel Miculas
2023-06-09 20:01 ` James Bottomley
2023-06-10 9:34 ` Miguel Ojeda
2023-06-09 18:43 ` James Bottomley
2023-06-09 18:59 ` Ariel Miculas (amiculas)
2023-06-09 19:20 ` Ariel Miculas
2023-06-09 19:45 ` Trilok Soni
2023-06-09 19:53 ` Alice Ryhl
2023-06-09 23:52 ` Kent Overstreet
2023-06-10 9:40 ` Miguel Ojeda
2023-06-10 0:09 ` Kent Overstreet
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=20230609063118.24852-80-amiculas@cisco.com \
--to=amiculas@cisco.com \
--cc=rust-for-linux@vger.kernel.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 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).