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