[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 3/7] lib/9pfs: Implement mount and unmount
From: Cristian Banu <cristb@xxxxxxxxx> This patch implements the mount and unmount operations and adds the skeleton for VFS node operations. Signed-off-by: Cristian Banu <cristb@xxxxxxxxx> --- lib/9pfs/9pfs_vfsops.c | 189 +++++++++++++++++++++++++++++++++++++++++ lib/9pfs/9pfs_vnops.c | 135 +++++++++++++++++++++++++++++ lib/9pfs/Makefile.uk | 3 + 3 files changed, 327 insertions(+) create mode 100644 lib/9pfs/9pfs_vfsops.c create mode 100644 lib/9pfs/9pfs_vnops.c diff --git a/lib/9pfs/9pfs_vfsops.c b/lib/9pfs/9pfs_vfsops.c new file mode 100644 index 00000000..accb3a56 --- /dev/null +++ b/lib/9pfs/9pfs_vfsops.c @@ -0,0 +1,189 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* + * Authors: Cristian Banu <cristb@xxxxxxxxx> + * + * Copyright (c) 2019, University Politehnica of Bucharest. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + */ + +#include <uk/config.h> +#include <uk/errptr.h> +#include <uk/9p.h> +#include <uk/9pdev_trans.h> +#include <vfscore/mount.h> +#include <vfscore/dentry.h> + +#include "9pfs.h" + +extern struct vnops uk_9pfs_vnops; + +static int uk_9pfs_mount(struct mount *mp, const char *dev, int flags, + const void *data); + +static int uk_9pfs_unmount(struct mount *mp, int flags); + +#define uk_9pfs_sync ((vfsop_sync_t)vfscore_nullop) +#define uk_9pfs_vget ((vfsop_vget_t)vfscore_nullop) +#define uk_9pfs_statfs ((vfsop_statfs_t)vfscore_nullop) + +struct vfsops uk_9pfs_vfsops = { + .vfs_mount = uk_9pfs_mount, + .vfs_unmount = uk_9pfs_unmount, + .vfs_sync = uk_9pfs_sync, + .vfs_vget = uk_9pfs_vget, + .vfs_statfs = uk_9pfs_statfs, + .vfs_vnops = &uk_9pfs_vnops +}; + +static struct vfscore_fs_type uk_9pfs_fs = { + .vs_name = "9pfs", + .vs_init = NULL, + .vs_op = &uk_9pfs_vfsops +}; + +UK_FS_REGISTER(uk_9pfs_fs); + +static const char *uk_9pfs_proto_str[UK_9P_PROTO_MAX] = { + [UK_9P_PROTO_2000U] = "9P2000.u" +}; + +static int uk_9pfs_parse_options(struct uk_9pfs_mount_data *md, + const void *data __unused) +{ + int rc = 0; + + md->trans = uk_9pdev_trans_get_default(); + if (!md->trans) + goto out; + + /* Currently, no options are supported. */ + + md->proto = UK_9P_PROTO_2000U; + md->uname = ""; + md->aname = ""; + +out: + return rc; +} + +static int uk_9pfs_mount(struct mount *mp, const char *dev, + int flags __unused, const void *data) +{ + struct uk_9pfs_mount_data *md; + struct uk_9preq *version_req; + struct uk_9p_str rcvd_version; + struct uk_9pfid *rootfid; + int version_accepted; + int rc; + + /* Set data as null, vnop_inactive() checks this for the root fid. */ + mp->m_root->d_vnode->v_data = NULL; + + /* Allocate mount data, parse options. */ + md = malloc(sizeof(*md)); + if (!md) + return ENOMEM; + + rc = uk_9pfs_parse_options(md, data); + if (rc) + goto out_free_mdata; + + mp->m_data = md; + + /* Establish connection with the given 9P endpoint. */ + md->dev = uk_9pdev_connect(md->trans, dev, data, NULL); + if (PTRISERR(md->dev)) { + rc = -PTR2ERR(md->dev); + goto out_free_mdata; + } + + /* Create a new 9pfs session via a VERSION message. */ + version_req = uk_9p_version(md->dev, uk_9pfs_proto_str[md->proto], + &rcvd_version); + if (PTRISERR(version_req)) { + rc = -PTR2ERR(version_req); + goto out_disconnect; + } + + version_accepted = uk_9p_str_equal(&rcvd_version, + uk_9pfs_proto_str[md->proto]); + uk_9pdev_req_remove(md->dev, version_req); + + if (!version_accepted) { + rc = EIO; + uk_pr_warn("Could not negotiate protocol %s\n", + uk_9pfs_proto_str[md->proto]); + goto out_disconnect; + } + + /* Create root fid. */ + rootfid = uk_9p_attach(md->dev, UK_9P_NOFID, md->uname, + md->aname, UK_9P_NONUNAME); + if (PTRISERR(rootfid)) { + rc = -PTR2ERR(rootfid); + goto out_disconnect; + } + + rc = uk_9pfs_allocate_vnode_data(mp->m_root->d_vnode, rootfid); + if (rc != 0) { + rc = -rc; + goto out_disconnect; + } + + return 0; + +out_disconnect: + uk_9pdev_disconnect(md->dev); +out_free_mdata: + free(md); + return rc; +} + +static void uk_9pfs_release_tree_fids(struct dentry *d) +{ + struct dentry *p; + + uk_list_for_each_entry(p, &d->d_child_list, d_child_link) + uk_9pfs_release_tree_fids(p); + + if (d->d_vnode->v_data) + uk_9pfs_free_vnode_data(d->d_vnode); +} + +static int uk_9pfs_unmount(struct mount *mp, int flags __unused) +{ + struct uk_9pfs_mount_data *md = UK_9PFS_MD(mp); + + uk_9pfs_release_tree_fids(mp->m_root); + vfscore_release_mp_dentries(mp); + uk_9pdev_disconnect(md->dev); + free(md); + + return 0; +} diff --git a/lib/9pfs/9pfs_vnops.c b/lib/9pfs/9pfs_vnops.c new file mode 100644 index 00000000..809fac43 --- /dev/null +++ b/lib/9pfs/9pfs_vnops.c @@ -0,0 +1,135 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* + * Authors: Cristian Banu <cristb@xxxxxxxxx> + * + * Copyright (c) 2019, University Politehnica of Bucharest. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + */ + +#define _GNU_SOURCE + +#include <fcntl.h> +#include <dirent.h> +#include <uk/config.h> +#include <uk/9p.h> +#include <uk/errptr.h> +#include <vfscore/mount.h> +#include <vfscore/dentry.h> +#include <vfscore/vnode.h> +#include <vfscore/file.h> +#include <vfscore/fs.h> + +#include "9pfs.h" + +int uk_9pfs_allocate_vnode_data(struct vnode *vp, struct uk_9pfid *fid) +{ + struct uk_9pfs_node_data *nd; + + nd = malloc(sizeof(*nd)); + if (nd == NULL) + return -ENOMEM; + + nd->fid = fid; + nd->nb_open_files = 0; + nd->removed = false; + vp->v_data = nd; + + return 0; +} + +void uk_9pfs_free_vnode_data(struct vnode *vp) +{ + struct uk_9pdev *dev = UK_9PFS_MD(vp->v_mount)->dev; + struct uk_9pfs_node_data *nd = UK_9PFS_ND(vp); + + if (nd->nb_open_files > 0) + return; + + if (nd->removed) + uk_9p_remove(dev, nd->fid); + + uk_9pfid_put(nd->fid); + free(nd); + vp->v_data = NULL; +} + +static int uk_9pfs_readdir(struct vnode *vp, struct vfscore_file *fp, + struct dirent *dir) +{ + return ENOENT; +} + +#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) +#define uk_9pfs_getattr ((vnop_getattr_t)vfscore_vop_nullop) +#define uk_9pfs_setattr ((vnop_setattr_t)vfscore_vop_nullop) +#define uk_9pfs_truncate ((vnop_truncate_t)vfscore_vop_nullop) +#define uk_9pfs_inactive ((vnop_inactive_t)vfscore_vop_nullop) +#define uk_9pfs_link ((vnop_link_t)vfscore_vop_eperm) +#define uk_9pfs_cache ((vnop_cache_t)NULL) +#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) +#define uk_9pfs_write ((vnop_write_t)vfscore_vop_einval) +#define uk_9pfs_lookup ((vnop_lookup_t)vfscore_vop_einval) + +struct vnops uk_9pfs_vnops = { + .vop_open = uk_9pfs_open, + .vop_close = uk_9pfs_close, + .vop_read = uk_9pfs_read, + .vop_write = uk_9pfs_write, + .vop_seek = uk_9pfs_seek, + .vop_ioctl = uk_9pfs_ioctl, + .vop_fsync = uk_9pfs_fsync, + .vop_readdir = uk_9pfs_readdir, + .vop_lookup = uk_9pfs_lookup, + .vop_create = uk_9pfs_create, + .vop_remove = uk_9pfs_remove, + .vop_rename = uk_9pfs_rename, + .vop_mkdir = uk_9pfs_mkdir, + .vop_rmdir = uk_9pfs_rmdir, + .vop_getattr = uk_9pfs_getattr, + .vop_setattr = uk_9pfs_setattr, + .vop_inactive = uk_9pfs_inactive, + .vop_truncate = uk_9pfs_truncate, + .vop_link = uk_9pfs_link, + .vop_cache = uk_9pfs_cache, + .vop_fallocate = uk_9pfs_fallocate, + .vop_readlink = uk_9pfs_readlink, + .vop_symlink = uk_9pfs_symlink +}; diff --git a/lib/9pfs/Makefile.uk b/lib/9pfs/Makefile.uk index e93ecc34..9d4dfb57 100644 --- a/lib/9pfs/Makefile.uk +++ b/lib/9pfs/Makefile.uk @@ -1 +1,4 @@ $(eval $(call addlib_s,lib9pfs,$(CONFIG_LIB9PFS))) + +LIB9PFS_SRCS-y += $(LIB9PFS_BASE)/9pfs_vfsops.c +LIB9PFS_SRCS-y += $(LIB9PFS_BASE)/9pfs_vnops.c -- 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 |