[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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@xxxxxxxx>

Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>

> ---
>  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
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.