|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 7/7] lib/9pfs: Add read and write vnops
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,
--
2.20.1
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |