|
[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.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |