[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 |