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

Juergen Gross posted 7 patches 1 year, 9 months ago
There is a newer version of this series
[PATCH v2 3/7] Mini-OS: add support for runtime mounts
Posted by Juergen Gross 1 year, 9 months ago
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 2f33c937..dc8a8c69 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
Re: [PATCH v2 3/7] Mini-OS: add support for runtime mounts
Posted by Andrew Cooper 1 year, 9 months ago
On 10/02/2023 10:46 am, Juergen Gross wrote:
> diff --git a/lib/sys.c b/lib/sys.c
> index 2f33c937..dc8a8c69 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

This ought to be

#define STATIC_MNTS (2 + (IS_ENABLED(CONFIG_CONSFRONT) * 2))

because it shows where the parts come from, and is much cleaner to add a
3rd one to in due course.


That said, it would be simpler to just have a total mounts set at 16 or
so?  Does a difference of two dynamic mounts depending on CONSFRONT
actually matter?

~Andrew

Re: [PATCH v2 3/7] Mini-OS: add support for runtime mounts
Posted by Juergen Gross 1 year, 9 months ago
On 10.02.23 12:43, Andrew Cooper wrote:
> On 10/02/2023 10:46 am, Juergen Gross wrote:
>> diff --git a/lib/sys.c b/lib/sys.c
>> index 2f33c937..dc8a8c69 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
> 
> This ought to be
> 
> #define STATIC_MNTS (2 + (IS_ENABLED(CONFIG_CONSFRONT) * 2))
> 
> because it shows where the parts come from, and is much cleaner to add a
> 3rd one to in due course.

In principle fine, but I'm not sure it is worth the effort to add
IS_ENABLED() support to Mini-OS.

> That said, it would be simpler to just have a total mounts set at 16 or
> so?  Does a difference of two dynamic mounts depending on CONSFRONT
> actually matter?

Probably not. Samuel, any thoughts on that?


Juergen

Re: [PATCH v2 3/7] Mini-OS: add support for runtime mounts
Posted by Samuel Thibault 1 year, 9 months ago
Juergen Gross, le ven. 10 févr. 2023 13:14:20 +0100, a ecrit:
> On 10.02.23 12:43, Andrew Cooper wrote:
> > On 10/02/2023 10:46 am, Juergen Gross wrote:
> > > diff --git a/lib/sys.c b/lib/sys.c
> > > index 2f33c937..dc8a8c69 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
> > 
> > This ought to be
> > 
> > #define STATIC_MNTS (2 + (IS_ENABLED(CONFIG_CONSFRONT) * 2))
> > 
> > because it shows where the parts come from, and is much cleaner to add a
> > 3rd one to in due course.
> 
> In principle fine, but I'm not sure it is worth the effort to add
> IS_ENABLED() support to Mini-OS.
> 
> > That said, it would be simpler to just have a total mounts set at 16 or
> > so?  Does a difference of two dynamic mounts depending on CONSFRONT
> > actually matter?
> 
> Probably not. Samuel, any thoughts on that?

We can probably as well just have 16 mount entries indeed.

Samuel

Re: [PATCH v2 3/7] Mini-OS: add support for runtime mounts
Posted by Andrew Cooper 1 year, 9 months ago
On 10/02/2023 12:44 pm, Samuel Thibault wrote:
> Juergen Gross, le ven. 10 févr. 2023 13:14:20 +0100, a ecrit:
>> On 10.02.23 12:43, Andrew Cooper wrote:
>>> On 10/02/2023 10:46 am, Juergen Gross wrote:
>>>> diff --git a/lib/sys.c b/lib/sys.c
>>>> index 2f33c937..dc8a8c69 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
>>> This ought to be
>>>
>>> #define STATIC_MNTS (2 + (IS_ENABLED(CONFIG_CONSFRONT) * 2))
>>>
>>> because it shows where the parts come from, and is much cleaner to add a
>>> 3rd one to in due course.
>> In principle fine, but I'm not sure it is worth the effort to add
>> IS_ENABLED() support to Mini-OS.
>>
>>> That said, it would be simpler to just have a total mounts set at 16 or
>>> so?  Does a difference of two dynamic mounts depending on CONSFRONT
>>> actually matter?
>> Probably not. Samuel, any thoughts on that?
> We can probably as well just have 16 mount entries indeed.

I'm happy to fix that up on commit if it's the only other issue in this
patch.

~Andrew