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

Re: [Minios-devel] [UNIKRAFT PATCH 7/7] lib/9pfs: Add read and write vnops



Reviewed-by: Costin Lupu <costin.lupu@xxxxxxxxx>

On 9/7/19 12:59 PM, Vlad-Andrei BĂDOIU (78692) wrote:
> From: Cristian Banu <cristb@xxxxxxxxx>
> 
> This patch adds the read and write VFS node operations.
> 
> Signed-off-by: Cristian Banu <cristb@xxxxxxxxx>
> ---
>  lib/9pfs/9pfs_vnops.c | 108 +++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 106 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/9pfs/9pfs_vnops.c b/lib/9pfs/9pfs_vnops.c
> index bf008a88..53d00b8e 100644
> --- a/lib/9pfs/9pfs_vnops.c
> +++ b/lib/9pfs/9pfs_vnops.c
> @@ -443,6 +443,112 @@ out:
>       return -rc;
>  }
>  
> +static int uk_9pfs_read(struct vnode *vp, struct vfscore_file *fp,
> +                     struct uio *uio, int ioflag __unused)
> +{
> +     struct uk_9pdev *dev = UK_9PFS_MD(vp->v_mount)->dev;
> +     struct uk_9pfid *fid = UK_9PFS_FD(fp)->fid;
> +     struct iovec *iov;
> +     int rc;
> +
> +     if (vp->v_type == VDIR)
> +             return EISDIR;
> +     if (vp->v_type != VREG)
> +             return EINVAL;
> +     if (uio->uio_offset < 0)
> +             return EINVAL;
> +     if (uio->uio_offset >= (off_t) vp->v_size)
> +             return 0;
> +
> +     if (!uio->uio_resid)
> +             return 0;
> +
> +     iov = uio->uio_iov;
> +     while (!iov->iov_len) {
> +             uio->uio_iov++;
> +             uio->uio_iovcnt--;
> +     }
> +
> +     rc = uk_9p_read(dev, fid, uio->uio_offset,
> +                        iov->iov_len, iov->iov_base);
> +     if (rc < 0)
> +             return -rc;
> +
> +     iov->iov_base = (char *)iov->iov_base + rc;
> +     iov->iov_len -= rc;
> +     uio->uio_resid -= rc;
> +     uio->uio_offset += rc;
> +
> +     return 0;
> +}
> +
> +static int uk_9pfs_write(struct vnode *vp, struct uio *uio, int ioflag)
> +{
> +     struct uk_9pdev *dev = UK_9PFS_MD(vp->v_mount)->dev;
> +     struct uk_9pfid *fid;
> +     struct iovec *iov;
> +     int rc;
> +
> +     if (vp->v_type == VDIR)
> +             return EISDIR;
> +     if (vp->v_type != VREG)
> +             return EINVAL;
> +     if (uio->uio_offset < 0)
> +             return EINVAL;
> +     if (uio->uio_offset >= LONG_MAX)
> +             return EFBIG;
> +     if (uio->uio_resid == 0)
> +             return 0;
> +
> +     if (ioflag & IO_APPEND)
> +             uio->uio_offset = vp->v_size;
> +
> +     /* Clone vnode fid. */
> +     fid = uk_9p_walk(dev, UK_9PFS_VFID(vp), NULL);
> +     if (PTRISERR(fid))
> +             return -PTR2ERR(fid);
> +
> +     rc = uk_9p_open(dev, fid, UK_9P_OWRITE);
> +     if (rc < 0)
> +             goto out;
> +
> +     if (!uio->uio_resid)
> +             return 0;
> +
> +     iov = uio->uio_iov;
> +     while (!iov->iov_len) {
> +             uio->uio_iov++;
> +             uio->uio_iovcnt--;
> +     }
> +
> +     rc = uk_9p_write(dev, fid, uio->uio_offset,
> +                         iov->iov_len, iov->iov_base);
> +     if (rc < 0)
> +             return -rc;
> +
> +     iov->iov_base = (char *)iov->iov_base + rc;
> +     iov->iov_len -= rc;
> +     uio->uio_resid -= rc;
> +     uio->uio_offset += rc;
> +
> +     if (rc < 0)
> +             goto out;
> +
> +     rc = 0;
> +
> +     /*
> +      * If the uio offset after completion of the write requests is bigger
> +      * than the vnode's associated size, then the size must be updated
> +      * accordingly.
> +      */
> +     if (uio->uio_offset > vp->v_size)
> +             vp->v_size = uio->uio_offset;
> +
> +out:
> +     uk_9pfid_put(fid);
> +     return -rc;
> +}
> +
>  #define uk_9pfs_seek         ((vnop_seek_t)vfscore_vop_nullop)
>  #define uk_9pfs_ioctl                ((vnop_ioctl_t)vfscore_vop_einval)
>  #define uk_9pfs_fsync                ((vnop_fsync_t)vfscore_vop_nullop)
> @@ -455,8 +561,6 @@ out:
>  #define uk_9pfs_symlink              ((vnop_symlink_t)vfscore_vop_eperm)
>  #define uk_9pfs_fallocate    ((vnop_fallocate_t)vfscore_vop_nullop)
>  #define uk_9pfs_rename               ((vnop_rename_t)vfscore_vop_einval)
> -#define uk_9pfs_read         ((vnop_read_t)vfscore_vop_einval)
> -#define uk_9pfs_write                ((vnop_write_t)vfscore_vop_einval)
>  
>  struct vnops uk_9pfs_vnops = {
>       .vop_open       = uk_9pfs_open,
> 

_______________________________________________
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®.