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