To tell the second Ned about your new FS, you will have to link it with libmount (l4/pkg/libc_backends/lib/mount) and provide an fstab file during startup in the Lua config as this:
ldr:startv( { caps = {}, log = { "myapp", "red" } }, "rom/myapp", { FSTAB_FILE="rom/myfstab.fstab" });
This lib will then mount the new file system locally into your application (e.g., the second ned instance).
Ned doesn't need to know about this filesystem, but my manager application and the l4re thread of the new task do.
Linking and using the manager with libmount works fine.
But I have some problems linking l4re with libmount. Mostly undefined references:
Initially, I tried simply adding libmount to REQUIRES_LIBS of the makefile, but that gave a lot of linker errors. So I replaced most of the minimal lib versions with the full- fledged ones: REQUIRES_LIBS := libc l4re-util libstdc++ libloader \ cxx_libc_io libc_be_minimal_log_io
Without libmount, this also builds fine. But after adding libmount, this leads to undefined references of open, fstat, mount and close. After adding libc_be_l4refile to the list (since it seems to contain the missing symbols), l4re_env_posix_vfs_ops is undefined. And since this is AFAIK only found in libl4re-vfs, I tried adding it, but then the build stops with this error: "src/l4/mk/binary.inc:335: *** Never include 'libl4re-vfs'!. Stop."
Ok, so I worked around this error message by removing the sanity check from src/l4/mk/binary.inc; l4re then gets linked with libmount.
I then also linked libl4revfs-fs-l4fs successfully to l4re.
However, whenever I supply a fstab-file to a new task (via FSTAB_FILE=...), mounting with libmount still fails, and the target task then even stops without executing main(). Error displayed: " test | mmap() called without MAP_ANON flag, not supported! test | libmount: Parsing 'rom/fstab' MOE[rm]: unhandled read page fault at 0x0 pc=0xb000eeb4"
Anyway, then I tried to let l4re mount the filesystem without libmount, by inserting mount("none","/tmp","l4fs",0,0); just after the line boot.printf("load binary '%s'\n", Global::l4re_aux->binary);.
However, the mount fails; a perror("mount") after simply yields "mount: Invalid argument". The same mount command however works fine in conventional threads. (Note that a l4fs/libfs-server is running and the needed IPC-Gate has been given to the task. "Normal" tasks/ threads can actually use this server.)
Any ideas how I could convince l4re (l4re_kernel) to mount a libfs/l4fs-type FS?
Thanks in advance, Josef
P.S.: If you view this mail via the mailinglist-archive, the first half of this thread can be found in 2014, since it began there.