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