diff --git a/repos/dde_rump/README b/repos/dde_rump/README index 7fe111b6b..7c39e76e6 100644 --- a/repos/dde_rump/README +++ b/repos/dde_rump/README @@ -2,16 +2,18 @@ Genode's Rump Kernel kernel port ================================ -This repository contains the Genode version of the [http://wiki.netbsd.org/rumpkernel/ - rump kernel]. -The kernel is currently used to gain file-system access from within Genode. In -order to achieve that, a Genode file-system server is located at -_src/server/rump_fs_. For accessing the server through the libc, the _libc_fs_ -plugin can be facilitated, which is available in the _libports_ repository. +This repository contains the Genode version of the +[http://wiki.netbsd.org/rumpkernel/ - rump kernel]. +The kernel is currently used to gain file-system access from within Genode. +In order to achieve that, the rump kernel is integrated into a VFS plugin, +located at _src/lib/vfs/rump_. It can thereby by used directly by libc +applications, or indirectly by using the VFS-server component. + Building instructions ##################### -In order to build the file-system server, issue +In order to build the VFS plugin, issue ! ./tool/ports/prepare_port dde_rump @@ -26,32 +28,27 @@ to your _etc/build.conf_ file of you build directory. Finally, -! make server/rumps_fs +! make lib/vfs/rump -called from your build directory will build the server. You may also specify - -! make run/rump_ext2 - -to run a simple test scenario. +called from your build directory will build the plugin. Configuration ############# -Here is an example snippet that configures the server: +Here is an example snippet that configures the VFS plugin: -! -! -! -! -! +| " -The server is looking for a service that provides a Genode block session. If -there is more than one block session in the system, the block session must be -routed to the right block-session server. The value of the _fs_ attribute of -the _config_ node can be one of the following: _ext2fs_ for EXT2, _cd9660_ for -ISO-9660, or _msdos_ for FAT file-system support. _root_ defines the directory -of the file system as seen as root directory by the client. The server hands -most of its RAM quota to the rump kernel. This means the larger the quota is, -the larger the internal block caches of the rump kernel will be. +The VFS plugin obtains a block session. If there is more than one block +session in the system, the block session must be routed to the right +block-session server. The value of the _fs_ attribute can be one of the +following: _ext2fs_ for EXT2, _cd9660_ for ISO-9660, or _msdos_ for FAT +file-system support. When accessing a _msdos_ file system, the optional +attribute 'gemdos="yes"' can be specified to operate in GEMDOS compatibility +mode. + +The VFS plugin hands over the specified amount of RAM quota to the rump +kernel. The larger the quota is, the larger the internal block caches of the +rump kernel will be. diff --git a/repos/dde_rump/src/lib/vfs/rump/vfs_rump.cc b/repos/dde_rump/src/lib/vfs/rump/vfs_rump.cc index 7b3269dfc..997e37118 100644 --- a/repos/dde_rump/src/lib/vfs/rump/vfs_rump.cc +++ b/repos/dde_rump/src/lib/vfs/rump/vfs_rump.cc @@ -342,16 +342,23 @@ class Vfs::Rump_file_system : public File_system } }; - /** - * We define our own fs arg structure to fit all sizes, we assume that 'fspec' - * is the only valid argument and all other fields are unused. + /* + * Must fit 'struct msdosfs_args' and 'struct ufs_args'. Needed to + * pass mount flags the file-system drivers. */ struct fs_args { char *fspec; - char pad[164]; - fs_args() { Genode::memset(pad, 0, sizeof(pad)); } + /* unused */ + struct export_args30 _pad1; + uid_t _uid; + gid_t _gid; + mode_t _mask; + + int flags; + + char _pad[164]; }; static bool _check_type(char const *type) @@ -403,7 +410,13 @@ class Vfs::Rump_file_system : public File_system } /* mount into extra-terrestrial-file system */ - struct fs_args args; + struct fs_args args { }; + + if (fs_type == "msdos" && config.attribute_value("gemdos", false)) { + enum { MSDOSFSMNT_GEMDOSFS = 8 }; + args.flags |= MSDOSFSMNT_GEMDOSFS; + } + int opts = config.attribute_value("writeable", true) ? 0 : RUMP_MNT_RDONLY;