|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 10/22] lib/vfscore: introduce UK_FS_REGISTER
The macro registers the filesystem in the static array
Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>
---
lib/vfscore/Makefile.uk | 2 ++
lib/vfscore/extra.ld | 9 +++++++++
lib/vfscore/include/vfscore/mount.h | 6 +++++-
lib/vfscore/mount.c | 24 ++++++++++++++++++------
4 files changed, 34 insertions(+), 7 deletions(-)
create mode 100644 lib/vfscore/extra.ld
diff --git a/lib/vfscore/Makefile.uk b/lib/vfscore/Makefile.uk
index 1246ae53..06933d96 100644
--- a/lib/vfscore/Makefile.uk
+++ b/lib/vfscore/Makefile.uk
@@ -5,3 +5,5 @@ CINCLUDES-y += -I$(LIBVFSCORE_BASE)/include
LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/fd.c
LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/file.c
LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/stdio.c
+
+EXTRA_LD_SCRIPT-$(CONFIG_LIBVFSCORE) += $(LIBVFSCORE_BASE)/extra.ld
\ No newline at end of file
diff --git a/lib/vfscore/extra.ld b/lib/vfscore/extra.ld
new file mode 100644
index 00000000..173b2350
--- /dev/null
+++ b/lib/vfscore/extra.ld
@@ -0,0 +1,9 @@
+SECTIONS
+{
+ .uk_fs_list : {
+ PROVIDE(uk_fslist_start = .);
+ KEEP (*(.uk_fs_list))
+ PROVIDE(uk_fslist_end = .);
+ }
+}
+INSERT AFTER .text;
diff --git a/lib/vfscore/include/vfscore/mount.h
b/lib/vfscore/include/vfscore/mount.h
index 7a638dbe..b4a07323 100644
--- a/lib/vfscore/include/vfscore/mount.h
+++ b/lib/vfscore/include/vfscore/mount.h
@@ -100,12 +100,16 @@ struct mount {
/*
* Filesystem type switch table.
*/
-struct vfssw {
+struct vfscore_fs_type {
const char *vs_name; /* name of file system */
int (*vs_init)(void); /* initialize routine */
struct vfsops *vs_op; /* pointer to vfs operation */
};
+#define UK_FS_REGISTER(fssw) \
+ static void __attribute((__section__(".uk_fs_list"))) \
+ *__ptr_##fssw __used = &fssw; \
+
/*
* Operations supported on virtual file system.
*/
diff --git a/lib/vfscore/mount.c b/lib/vfscore/mount.c
index 04f96c4c..9158b5d9 100644
--- a/lib/vfscore/mount.c
+++ b/lib/vfscore/mount.c
@@ -59,20 +59,32 @@ UK_LIST_HEAD(mount_list);
*/
static struct uk_mutex mount_lock;
+extern const struct vfscore_fs_type *uk_fslist_start;
+extern const struct vfscore_fs_type *uk_fslist_end;
+
+#define for_each_fs(iter) \
+ for (iter = &uk_fslist_start; \
+ iter < &uk_fslist_end; \
+ iter++)
+
/*
* Lookup file system.
*/
-static const struct vfssw *
+static const struct vfscore_fs_type *
fs_getfs(const char *name)
{
- const struct vfssw *fs;
+ const struct vfscore_fs_type *fs = NULL, **__fs;
+
+ for_each_fs(__fs) {
+ fs = *__fs;
+ if (fs == NULL)
+ continue;
- for (fs = vfssw; fs->vs_name; fs++) {
if (!strncmp(name, fs->vs_name, FSMAXNAMES))
break;
}
- if (!fs->vs_name)
- return nullptr;
+ if (!fs || !fs->vs_name)
+ return NULL;
return fs;
}
@@ -96,7 +108,7 @@ int device_close(struct device *dev)
int
sys_mount(const char *dev, const char *dir, const char *fsname, int flags,
const void *data)
{
- const struct vfssw *fs;
+ const struct vfscore_fs_type *fs;
struct mount *mp;
struct device *device;
struct dentry *dp_covered = NULL;
--
2.19.2
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |