mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-18 10:46:25 +00:00
rump_fs: support the access of GEMDOS file systems
The GEMDOS variant is supported by NetBSD's msdos file-system driver. However, it must explicitly be enabled by a mount flag. This patch adds the principle ability for passing mount flags to file system drivers and enables the MSDOSFSMNT_GEMDOSFS flag based on the config attribute 'gemdos="yes"'. Issue #3471
This commit is contained in:
parent
ceae637416
commit
114de7721f
@ -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:
|
||||
|
||||
!<start name="rump_fs">
|
||||
! <resource name="RAM" quantum="8M" />
|
||||
! <provides><service name="File_system"/></provides>
|
||||
! <config fs="ext2fs"><default-policy root="/" writeable="yes"/></config>
|
||||
!</start>
|
||||
| <rump fs="msdos" ram="7M" writeable="yes"/>"
|
||||
|
||||
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.
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user