diff mbox series

[3/7] Mini-OS: add support for runtime mounts

Message ID 20230203091809.14478-4-jgross@suse.com (mailing list archive)
State New, archived
Headers show
Series Mini-OS: ad minimal 9pfs support | expand

Commit Message

Jürgen Groß Feb. 3, 2023, 9:18 a.m. UTC
Add the support to mount a device at runtime. The number of dynamic
mounts is limited by a #define.

For devices supporting multiple files struct file is modified to hold
a pointer to file specific data in contrast to device specific data.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 include/lib.h |  5 +++++
 lib/sys.c     | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 1 deletion(-)

Comments

Samuel Thibault Feb. 5, 2023, 12:42 p.m. UTC | #1
Juergen Gross, le ven. 03 févr. 2023 10:18:05 +0100, a ecrit:
> Add the support to mount a device at runtime. The number of dynamic
> mounts is limited by a #define.
> 
> For devices supporting multiple files struct file is modified to hold
> a pointer to file specific data in contrast to device specific data.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>

Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

> ---
>  include/lib.h |  5 +++++
>  lib/sys.c     | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 54 insertions(+), 1 deletion(-)
> 
> diff --git a/include/lib.h b/include/lib.h
> index 36d94ec4..fd8c36de 100644
> --- a/include/lib.h
> +++ b/include/lib.h
> @@ -172,6 +172,7 @@ struct file {
>      union {
>          int fd; /* Any fd from an upper layer. */
>          void *dev;
> +        void *filedata;
>      };
>  };
>  
> @@ -194,6 +195,10 @@ struct mount_point {
>      void *dev;
>  };
>  
> +int mount(const char *path, void *dev,
> +          int (*open)(struct mount_point *, const char *, int, mode_t));
> +void umount(const char *path);
> +
>  unsigned int alloc_file_type(const struct file_ops *ops);
>  
>  off_t lseek_default(struct file *file, off_t offset, int whence);
> diff --git a/lib/sys.c b/lib/sys.c
> index 1475c621..4171bfd6 100644
> --- a/lib/sys.c
> +++ b/lib/sys.c
> @@ -339,7 +339,14 @@ static int open_mem(struct mount_point *mnt, const char *pathname, int flags,
>      return fd;
>  }
>  
> -static struct mount_point mount_points[] = {
> +#ifdef CONFIG_CONSFRONT
> +#define STATIC_MNTS   4
> +#else
> +#define STATIC_MNTS   2
> +#endif
> +#define DYNAMIC_MNTS  8
> +
> +static struct mount_point mount_points[STATIC_MNTS + DYNAMIC_MNTS] = {
>      { .path = "/var/log",     .open = open_log,  .dev = NULL },
>      { .path = "/dev/mem",     .open = open_mem,  .dev = NULL },
>  #ifdef CONFIG_CONSFRONT
> @@ -365,6 +372,8 @@ int open(const char *pathname, int flags, ...)
>      for ( m = 0; m < ARRAY_SIZE(mount_points); m++ )
>      {
>          mnt = mount_points + m;
> +        if ( !mnt->path )
> +            continue;
>          mlen = strlen(mnt->path);
>          if ( !strncmp(pathname, mnt->path, mlen) &&
>               (pathname[mlen] == '/' || pathname[mlen] == 0) )
> @@ -375,6 +384,45 @@ int open(const char *pathname, int flags, ...)
>      return -1;
>  }
>  
> +int mount(const char *path, void *dev,
> +          int (*open)(struct mount_point *, const char *, int, mode_t))
> +{
> +    unsigned int m;
> +    struct mount_point *mnt;
> +
> +    for ( m = 0; m < ARRAY_SIZE(mount_points); m++ )
> +    {
> +        mnt = mount_points + m;
> +        if ( !mnt->path )
> +        {
> +            mnt->path = strdup(path);
> +            mnt->open = open;
> +            mnt->dev = dev;
> +            return 0;
> +        }
> +    }
> +
> +    errno = ENOSPC;
> +    return -1;
> +}
> +
> +void umount(const char *path)
> +{
> +    unsigned int m;
> +    struct mount_point *mnt;
> +
> +    for ( m = 0; m < ARRAY_SIZE(mount_points); m++ )
> +    {
> +        mnt = mount_points + m;
> +        if ( mnt->path && !strcmp(mnt->path, path) )
> +        {
> +            free((char *)mnt->path);
> +            mnt->path = NULL;
> +            return;
> +        }
> +    }
> +}
> +
>  int isatty(int fd)
>  {
>      return files[fd].type == FTYPE_CONSOLE;
> -- 
> 2.35.3
>
diff mbox series

Patch

diff --git a/include/lib.h b/include/lib.h
index 36d94ec4..fd8c36de 100644
--- a/include/lib.h
+++ b/include/lib.h
@@ -172,6 +172,7 @@  struct file {
     union {
         int fd; /* Any fd from an upper layer. */
         void *dev;
+        void *filedata;
     };
 };
 
@@ -194,6 +195,10 @@  struct mount_point {
     void *dev;
 };
 
+int mount(const char *path, void *dev,
+          int (*open)(struct mount_point *, const char *, int, mode_t));
+void umount(const char *path);
+
 unsigned int alloc_file_type(const struct file_ops *ops);
 
 off_t lseek_default(struct file *file, off_t offset, int whence);
diff --git a/lib/sys.c b/lib/sys.c
index 1475c621..4171bfd6 100644
--- a/lib/sys.c
+++ b/lib/sys.c
@@ -339,7 +339,14 @@  static int open_mem(struct mount_point *mnt, const char *pathname, int flags,
     return fd;
 }
 
-static struct mount_point mount_points[] = {
+#ifdef CONFIG_CONSFRONT
+#define STATIC_MNTS   4
+#else
+#define STATIC_MNTS   2
+#endif
+#define DYNAMIC_MNTS  8
+
+static struct mount_point mount_points[STATIC_MNTS + DYNAMIC_MNTS] = {
     { .path = "/var/log",     .open = open_log,  .dev = NULL },
     { .path = "/dev/mem",     .open = open_mem,  .dev = NULL },
 #ifdef CONFIG_CONSFRONT
@@ -365,6 +372,8 @@  int open(const char *pathname, int flags, ...)
     for ( m = 0; m < ARRAY_SIZE(mount_points); m++ )
     {
         mnt = mount_points + m;
+        if ( !mnt->path )
+            continue;
         mlen = strlen(mnt->path);
         if ( !strncmp(pathname, mnt->path, mlen) &&
              (pathname[mlen] == '/' || pathname[mlen] == 0) )
@@ -375,6 +384,45 @@  int open(const char *pathname, int flags, ...)
     return -1;
 }
 
+int mount(const char *path, void *dev,
+          int (*open)(struct mount_point *, const char *, int, mode_t))
+{
+    unsigned int m;
+    struct mount_point *mnt;
+
+    for ( m = 0; m < ARRAY_SIZE(mount_points); m++ )
+    {
+        mnt = mount_points + m;
+        if ( !mnt->path )
+        {
+            mnt->path = strdup(path);
+            mnt->open = open;
+            mnt->dev = dev;
+            return 0;
+        }
+    }
+
+    errno = ENOSPC;
+    return -1;
+}
+
+void umount(const char *path)
+{
+    unsigned int m;
+    struct mount_point *mnt;
+
+    for ( m = 0; m < ARRAY_SIZE(mount_points); m++ )
+    {
+        mnt = mount_points + m;
+        if ( mnt->path && !strcmp(mnt->path, path) )
+        {
+            free((char *)mnt->path);
+            mnt->path = NULL;
+            return;
+        }
+    }
+}
+
 int isatty(int fd)
 {
     return files[fd].type == FTYPE_CONSOLE;