|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 5/7] lib/9pfs: Add create, mkdir, rmdir, remove vnops
From: Cristian Banu <cristb@xxxxxxxxx>
This patch adds file and directory creation and deletion VFS node
operations.
Signed-off-by: Cristian Banu <cristb@xxxxxxxxx>
---
lib/9pfs/9pfs_vnops.c | 78 ++++++++++++++++++++++++++++++++++++++++---
1 file changed, 74 insertions(+), 4 deletions(-)
diff --git a/lib/9pfs/9pfs_vnops.c b/lib/9pfs/9pfs_vnops.c
index 0fe3eb22..50f83148 100644
--- a/lib/9pfs/9pfs_vnops.c
+++ b/lib/9pfs/9pfs_vnops.c
@@ -62,6 +62,17 @@ static int uk_9pfs_posix_perm_from_mode(int mode)
return res;
}
+static uint32_t uk_9pfs_perm_from_posix_mode(mode_t mode)
+{
+ int res;
+
+ res = mode & 0777;
+ if (S_ISDIR(mode))
+ res |= UK_9P_DMDIR;
+
+ return res;
+}
+
static int uk_9pfs_posix_mode_from_mode(int mode)
{
int res;
@@ -189,6 +200,69 @@ static int uk_9pfs_inactive(struct vnode *vp)
return 0;
}
+static int uk_9pfs_create_generic(struct vnode *dvp, char *name, mode_t mode)
+{
+ struct uk_9pdev *dev = UK_9PFS_MD(dvp->v_mount)->dev;
+ struct uk_9pfid *fid;
+ int rc;
+
+ if (strlen(name) > NAME_MAX)
+ return ENAMETOOLONG;
+
+ /* Clone parent fid. */
+ fid = uk_9p_walk(dev, UK_9PFS_VFID(dvp), NULL);
+
+ rc = uk_9p_create(dev, fid, name, uk_9pfs_perm_from_posix_mode(mode),
+ UK_9P_OTRUNC | UK_9P_OWRITE, NULL);
+
+ uk_9pfid_put(fid);
+ return -rc;
+}
+
+static int uk_9pfs_create(struct vnode *dvp, char *name, mode_t mode)
+{
+ if (!S_ISREG(mode))
+ return EINVAL;
+
+ return uk_9pfs_create_generic(dvp, name, mode);
+}
+
+static int uk_9pfs_remove_generic(struct vnode *dvp, struct vnode *vp)
+{
+ struct uk_9pdev *dev = UK_9PFS_MD(dvp->v_mount)->dev;
+ struct uk_9pfs_node_data *nd = UK_9PFS_ND(vp);
+ int rc = 0;
+
+ if (!nd->removed && !nd->nb_open_files)
+ rc = uk_9p_remove(dev, nd->fid);
+ else
+ nd->removed = true;
+
+ uk_9pfs_free_vnode_data(vp);
+
+ return -rc;
+}
+
+static int uk_9pfs_remove(struct vnode *dvp, struct vnode *vp,
+ char *name __unused)
+{
+ return uk_9pfs_remove_generic(dvp, vp);
+}
+
+static int uk_9pfs_mkdir(struct vnode *dvp, char *name, mode_t mode)
+{
+ if (!S_ISDIR(mode))
+ return EINVAL;
+
+ return uk_9pfs_create_generic(dvp, name, mode);
+}
+
+static int uk_9pfs_rmdir(struct vnode *dvp, struct vnode *vp,
+ char *name __unused)
+{
+ return uk_9pfs_remove_generic(dvp, vp);
+}
+
static int uk_9pfs_readdir(struct vnode *vp, struct vfscore_file *fp,
struct dirent *dir)
{
@@ -206,11 +280,7 @@ static int uk_9pfs_readdir(struct vnode *vp, struct
vfscore_file *fp,
#define uk_9pfs_readlink ((vnop_readlink_t)vfscore_vop_einval)
#define uk_9pfs_symlink ((vnop_symlink_t)vfscore_vop_eperm)
#define uk_9pfs_fallocate ((vnop_fallocate_t)vfscore_vop_nullop)
-#define uk_9pfs_create ((vnop_create_t)vfscore_vop_einval)
-#define uk_9pfs_remove ((vnop_remove_t)vfscore_vop_einval)
#define uk_9pfs_rename ((vnop_rename_t)vfscore_vop_einval)
-#define uk_9pfs_mkdir ((vnop_mkdir_t)vfscore_vop_einval)
-#define uk_9pfs_rmdir ((vnop_rmdir_t)vfscore_vop_einval)
#define uk_9pfs_open ((vnop_open_t)vfscore_vop_einval)
#define uk_9pfs_close ((vnop_close_t)vfscore_vop_einval)
#define uk_9pfs_read ((vnop_read_t)vfscore_vop_einval)
--
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 |