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

Re: [Minios-devel] [UNIKRAFT PATCH v3 22/23] lib/vfscore: re-implement stdio and enable new code



Hey looks good, but one question: Would you introduce a similar slim version of 
vfscore that we had before back again (e.g., with a configuration option)? I 
think we should keep the ability to easily minimize or reduce features on 
libraries whenever needed.

Reviewed-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>

On 07.02.19, 15:01, "Minios-devel on behalf of Yuri Volchkov" 
<minios-devel-bounces@xxxxxxxxxxxxxxxxxxxx on behalf of 
yuri.volchkov@xxxxxxxxx> wrote:

    Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>
    ---
     lib/vfscore/Config.uk              |  1 +
     lib/vfscore/Makefile.uk            |  9 ++++
     lib/vfscore/exportsyms.uk          | 27 +++++++++++
     lib/vfscore/file.c                 | 61 +------------------------
     lib/vfscore/include/vfscore/file.h |  2 +-
     lib/vfscore/stdio.c                | 73 +++++++++++++++++++-----------
     6 files changed, 85 insertions(+), 88 deletions(-)
    
    diff --git a/lib/vfscore/Config.uk b/lib/vfscore/Config.uk
    index 49d6daa1..6cf6c63a 100644
    --- a/lib/vfscore/Config.uk
    +++ b/lib/vfscore/Config.uk
    @@ -3,3 +3,4 @@ config LIBVFSCORE
        default n
        select LIBNOLIBC if !HAVE_LIBC
        select LIBUKDEBUG
    +   select LIBUKLOCK
    diff --git a/lib/vfscore/Makefile.uk b/lib/vfscore/Makefile.uk
    index 06933d96..1fd35858 100644
    --- a/lib/vfscore/Makefile.uk
    +++ b/lib/vfscore/Makefile.uk
    @@ -5,5 +5,14 @@ CINCLUDES-y += -I$(LIBVFSCORE_BASE)/include
     LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/fd.c
     LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/file.c
     LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/stdio.c
    +LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/mount.c
    +LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/vnode.c
    +LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/dentry.c
    +LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/syscalls.c
    +LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/main.c
    +LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/task.c
    +LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/lookup.c
    +LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/fops.c
    +LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/subr_uio.c
     
     EXTRA_LD_SCRIPT-$(CONFIG_LIBVFSCORE) += $(LIBVFSCORE_BASE)/extra.ld
    \ No newline at end of file
    diff --git a/lib/vfscore/exportsyms.uk b/lib/vfscore/exportsyms.uk
    index 9e229a11..5438a64c 100644
    --- a/lib/vfscore/exportsyms.uk
    +++ b/lib/vfscore/exportsyms.uk
    @@ -5,3 +5,30 @@ vfscore_get_file
     close
     write
     read
    +sys_mount
    +vfscore_nullop
    +vfscore_release_mp_dentries
    +vfscore_vget
    +vfscore_uiomove
    +vfscore_vop_nullop
    +vfscore_vop_einval
    +vfscore_vop_eperm
    +vfscore_vop_erofs
    +open
    +write
    +close
    +read
    +mkdir
    +fsync
    +fstat
    +stat
    +chmod
    +dup
    +dup2
    +dup3
    +vfscore_uiomove
    +sys_sync
    +vfscore_mount_dump
    +sys_umount
    +sys_umount2
    +unlink
    diff --git a/lib/vfscore/file.c b/lib/vfscore/file.c
    index 0f6dfa93..e56f16dc 100644
    --- a/lib/vfscore/file.c
    +++ b/lib/vfscore/file.c
    @@ -38,66 +38,7 @@
     #include <uk/print.h>
     #include <vfscore/file.h>
     #include <uk/assert.h>
    -#include <uk/arch/atomic.h>
    -
    -int close(int fd)
    -{
    -   struct vfscore_file *file = vfscore_get_file(fd);
    -
    -   if (!file) {
    -           uk_pr_warn("no such file descriptor: %d\n", fd);
    -           errno = EBADF;
    -           return -1;
    -   }
    -
    -   if (!file->fops->close) {
    -           errno = EIO;
    -           return -1;
    -   }
    -
    -   return file->fops->close(file);
    -}
    -
    -ssize_t write(int fd, const void *buf, size_t count)
    -{
    -   struct vfscore_file *file = vfscore_get_file(fd);
    -
    -   if (!file) {
    -           uk_pr_warn("no such file descriptor: %d\n", fd);
    -           errno = EBADF;
    -           return -1;
    -   }
    -
    -   if (!file->fops->write) {
    -           uk_pr_warn("file does not have write op: %d\n", fd);
    -           errno = EINVAL;
    -           return -1;
    -   }
    -
    -   return file->fops->write(file, buf, count);
    -}
    -
    -ssize_t read(int fd, void *buf, size_t count)
    -{
    -   struct vfscore_file *file = vfscore_get_file(fd);
    -
    -   if (!file) {
    -           uk_pr_warn("no such file descriptor: %d\n", fd);
    -           errno = EBADF;
    -           return -1;
    -   }
    -
    -   if (!file->fops->read) {
    -           uk_pr_warn("file does not have read op: %d\n", fd);
    -           errno = EINVAL;
    -           return -1;
    -   }
    -
    -   return file->fops->read(file, buf, count);
    -}
    -
    -/* TODO: remove stub */
    -#define vfs_close(fp) (0)
    +#include "vfs.h"
     
     int fdrop(struct vfscore_file *fp)
     {
    diff --git a/lib/vfscore/include/vfscore/file.h 
b/lib/vfscore/include/vfscore/file.h
    index b7320cc1..7f45ca78 100644
    --- a/lib/vfscore/include/vfscore/file.h
    +++ b/lib/vfscore/include/vfscore/file.h
    @@ -38,6 +38,7 @@
     
     #include <stdint.h>
     #include <sys/types.h>
    +#include <vfscore/dentry.h>
     
     #ifdef __cplusplus
     extern "C" {
    @@ -58,7 +59,6 @@ struct vfscore_file {
        off_t           f_offset;       /* current position in file */
        void            *f_data;        /* file descriptor specific data */
        struct dentry   *f_dentry;
    -   const struct vfscore_fops *fops;
     };
     
     int vfscore_alloc_fd(void);
    diff --git a/lib/vfscore/stdio.c b/lib/vfscore/stdio.c
    index a9bdfd61..5f15ef2a 100644
    --- a/lib/vfscore/stdio.c
    +++ b/lib/vfscore/stdio.c
    @@ -34,23 +34,37 @@
      */
     
     #include <vfscore/file.h>
    +#include <vfscore/fs.h>
     #include <uk/plat/console.h>
     #include <uk/essentials.h>
     #include <termios.h>
    +#include <vfscore/vnode.h>
    +#include <unistd.h>
     
     /* One function for stderr and stdout */
    -static ssize_t stdout_write(struct vfscore_file *vfscore_file __unused,
    -                       const void *buf, size_t count)
    +static ssize_t stdio_write(struct vnode *vp __unused,
    +                      struct uio *uio,
    +                      int ioflag __unused)
     {
    -   return ukplat_coutk(buf, count);
    +   UK_ASSERT(!uio->uio_offset);
    +   UK_ASSERT(uio->uio_iovcnt == 1);
    +   return ukplat_coutk(uio->uio_iov->iov_base, uio->uio_iov->iov_len);
     }
     
    -static ssize_t stdin_read(struct vfscore_file *vfscore_file __unused,
    -                     void *_buf, size_t count)
    +static ssize_t stdio_read(struct vnode *vp __unused,
    +                 struct vfscore_file *file __unused,
    +                 struct uio *uio,
    +                 int ioflag __unused)
     {
        int bytes_read;
    -   size_t bytes_total = 0;
    -   char *buf = (char *)_buf;
    +   size_t bytes_total = 0, count;
    +   char *buf;
    +
    +   UK_ASSERT(!uio->uio_offset);
    +   UK_ASSERT(uio->uio_iovcnt == 1);
    +
    +   buf = uio->uio_iov->iov_base;
    +   count = uio->uio_iov->iov_len;
     
        do {
                while ((bytes_read = ukplat_cink(buf,
    @@ -61,8 +75,8 @@ static ssize_t stdin_read(struct vfscore_file 
*vfscore_file __unused,
                *(buf - 1) = *(buf - 1) == '\r' ?
                                        '\n' : *(buf - 1);
     
    -           stdout_write(vfscore_file, (buf - bytes_read),
    -                           bytes_read);
    +           /* Echo the input */
    +           ukplat_coutk(buf - bytes_read, bytes_read);
                bytes_total += bytes_read;
     
        } while (bytes_total < count && *(buf - 1) != '\n'
    @@ -71,33 +85,38 @@ static ssize_t stdin_read(struct vfscore_file 
*vfscore_file __unused,
        return bytes_total;
     }
     
    -static struct vfscore_fops stdin_fops = {
    -   .read = stdin_read,
    -};
     
    -static struct vfscore_fops stdout_fops = {
    -   .write = stdout_write,
    +static struct vnops stdio_vnops = {
    +   .vop_write = stdio_write,
    +   .vop_read = stdio_read,
     };
     
    -static struct vfscore_file  stdin_file = {
    -   .fd = 0,
    -   .fops = &stdin_fops,
    +static struct vnode stdio_vnode = {
    +   .v_ino = 1,
    +   .v_op = &stdio_vnops,
    +   .v_lock = UK_MUTEX_INITIALIZER(stdio_vnode.v_lock),
    +   .v_refcnt = 1,
     };
     
    -static struct vfscore_file  stdout_file = {
    -   .fd = 1,
    -   .fops = &stdout_fops,
    +static struct dentry stdio_dentry = {
    +   .d_vnode = &stdio_vnode,
     };
     
    -static struct vfscore_file  stderr_file = {
    -   .fd = 2,
    -   .fops = &stdout_fops,
    +static struct vfscore_file  stdio_file = {
    +   .fd = 1,
    +   .f_flags = FWRITE | FREAD,
    +   .f_dentry = &stdio_dentry,
    +   /* reference count is 2 because close(0) is a valid
    +    * operation. However it is not properly handled in the
    +    * current implementation. */
    +   .f_count = 2,
     };
     
    -
     void init_stdio(void)
     {
    -   vfscore_install_fd(0, &stdin_file);
    -   vfscore_install_fd(1, &stdout_file);
    -   vfscore_install_fd(2, &stderr_file);
    +   vfscore_install_fd(0, &stdio_file);
    +   if (dup2(0, 1) != 1)
    +           uk_pr_err("failed to dup to stdin\n");
    +   if (dup2(0, 2) != 2)
    +           uk_pr_err("failed to dup to stderr\n");
     }
    -- 
    2.19.2
    
    
    _______________________________________________
    Minios-devel mailing list
    Minios-devel@xxxxxxxxxxxxxxxxxxxx
    https://lists.xenproject.org/mailman/listinfo/minios-devel

_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

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