Hello,
On Mon, 25 May 2026 22:27:53 Samuel Thibault wrote:
> This way of managing the multiple disks seems to me it would be
> confusing for users, and doing more than it should be. We of course
> don't want to require users to set a partfs translator by hand with
> the enumeration of the disks to be handled, we want that to be
> automatic. And if we make it automatic, just numbering the entries
> inside the partfs directory will prevent users from knowing what these
> devices actually are: usb sticks, sata disks, etc. I believe we do want
> to keep the underlying driver device name such as wd0. But then it's not
> really useful to have just one partfs that would contain all disks, we
> can as well just have one partfs per disk.
Why not create a separate directory with the partfs translator for each type
of media? The hd/ directory for disks, the usb/ directory for usb, and
so on?
> These are replicating a lot of the storeio logics, which we'd rather
> avoid, to avoid having yet more code to maintain. We can just migrate
> storeio into using netfs rather than trivfs, and make its root behave
> like before, except it additionally implements get_dirents, and the
> nodes thusly exposed can behave like a parted-based storeio. Essentially
> that's a convergence of your current partfs and the existing storeio,
> throwing away some parts of each.
I think that's the right approach. The only question is about the storeio
translator launch parameters: should keep the part:N:file:/root/...
mechanism
or open partitions automatically?
> And notably that does get sense: if the disk is not partitioned, it's
> not a "directory" :)
I hadn't thought about that. Do you mean the disk has a GPT partitioning
system, but no partitions?
Also, while reviewing the code for the netfs_get_dirents function, I found a
bug that was giving nodes an incorrect dirent_type instead of defining a
dirent_type for each node. Interestingly, this didn't show up when using the
stat and file commands.
Thanks,
--
Mikhail Karpov
From c69a792d6b0716ebb8e959938598ea050ce3e90d Mon Sep 17 00:00:00 2001
From: Mikhail Karpov <[email protected]>
Date: Tue, 26 May 2026 17:34:41 +0700
Subject: [PATCH 2/2] fix netfs_get_dirents
---
partfs/netfs.c | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/partfs/netfs.c b/partfs/netfs.c
index 66a30129..ffe9a15b 100644
--- a/partfs/netfs.c
+++ b/partfs/netfs.c
@@ -375,7 +375,11 @@ netfs_get_dirents (struct iouser *cred, struct node *dir, int entry,
*data = mmap (0, size, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
if ((void *) *data == (void *) -1)
- return errno;
+ {
+ debug ("(void *) *data == (void *) -1\n");
+ debug ("netfs_get_dirents end with errno: %d\n", errno);
+ return errno;
+ }
*datacnt = size;
*amt = count;
@@ -396,18 +400,19 @@ netfs_get_dirents (struct iouser *cred, struct node *dir, int entry,
}
debug ("Fill in the real directory entries\n");
- int dirent_type;
- if (dir->nn->entries_size > 0)
- dirent_type = DT_DIR;
- else
- if (dir->nn->store->block_size == 1)
- dirent_type = DT_CHR;
- else
- dirent_type = DT_BLK;
+ int dirent_type;
for (size_t i = 0; i < dir->nn->entries_size; ++i)
{
current_node = dir->nn->entries[i];
+ if (current_node->nn->entries_size > 0)
+ dirent_type = DT_DIR;
+ else
+ if (current_node->nn->store->block_size == 1)
+ dirent_type = DT_CHR;
+ else
+ dirent_type = DT_BLK;
+
add_dir_entry (&ptr_data, current_node->nn->name,
current_node->nn_stat.st_ino, dirent_type, &count,
nentries, &size);
--
2.43.0