Print this page
basic fsh prototype (no comments yet)
*** 82,91 ****
--- 82,93 ----
#include <sys/attr.h>
#include <sys/zio.h>
#include <sys/spa.h>
#include <sys/lofi.h>
#include <sys/bootprops.h>
+ #include <sys/fsh.h>
+ #include <sys/fsh_impl.h>
#include <vm/page.h>
#include <fs/fs_subr.h>
/* Private interfaces to create vopstats-related data structures */
*** 214,237 ****
*/
int
fsop_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
{
! return (*(vfsp)->vfs_op->vfs_mount)(vfsp, mvp, uap, cr);
}
int
fsop_unmount(vfs_t *vfsp, int flag, cred_t *cr)
{
! return (*(vfsp)->vfs_op->vfs_unmount)(vfsp, flag, cr);
}
int
fsop_root(vfs_t *vfsp, vnode_t **vpp)
{
refstr_t *mntpt;
! int ret = (*(vfsp)->vfs_op->vfs_root)(vfsp, vpp);
/*
* Make sure this root has a path. With lofs, it is possible to have
* a NULL mountpoint.
*/
if (ret == 0 && vfsp->vfs_mntpt != NULL && (*vpp)->v_path == NULL) {
--- 216,239 ----
*/
int
fsop_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
{
! return (fsh_mount(vfsp, mvp, uap, cr));
}
int
fsop_unmount(vfs_t *vfsp, int flag, cred_t *cr)
{
! return (fsh_unmount(vfsp, flag, cr));
}
int
fsop_root(vfs_t *vfsp, vnode_t **vpp)
{
refstr_t *mntpt;
! int ret = fsh_root(vfsp, vpp);
/*
* Make sure this root has a path. With lofs, it is possible to have
* a NULL mountpoint.
*/
if (ret == 0 && vfsp->vfs_mntpt != NULL && (*vpp)->v_path == NULL) {
*** 245,255 ****
}
int
fsop_statfs(vfs_t *vfsp, statvfs64_t *sp)
{
! return (*(vfsp)->vfs_op->vfs_statvfs)(vfsp, sp);
}
int
fsop_sync(vfs_t *vfsp, short flag, cred_t *cr)
{
--- 247,257 ----
}
int
fsop_statfs(vfs_t *vfsp, statvfs64_t *sp)
{
! return (fsh_statfs(vfsp, sp));
}
int
fsop_sync(vfs_t *vfsp, short flag, cred_t *cr)
{
*** 272,282 ****
*/
if (vfs_has_feature(vfsp, VFSFT_SYSATTR_VIEWS) &&
fidp->fid_len == XATTR_FIDSZ)
return (xattr_dir_vget(vfsp, vpp, fidp));
! return (*(vfsp)->vfs_op->vfs_vget)(vfsp, vpp, fidp);
}
int
fsop_mountroot(vfs_t *vfsp, enum whymountroot reason)
{
--- 274,284 ----
*/
if (vfs_has_feature(vfsp, VFSFT_SYSATTR_VIEWS) &&
fidp->fid_len == XATTR_FIDSZ)
return (xattr_dir_vget(vfsp, vpp, fidp));
! return (fsh_vget(vfsp, vpp, fidp));
}
int
fsop_mountroot(vfs_t *vfsp, enum whymountroot reason)
{
*** 526,535 ****
--- 528,538 ----
vfsp->vfs_lofi_minor = 0;
sema_init(&vfsp->vfs_reflock, 1, NULL, SEMA_DEFAULT, NULL);
vfsimpl_setup(vfsp);
vfsp->vfs_data = (data);
vfs_setops((vfsp), (op));
+ vfsp->vfs_fshrecord = fsh_fsrec_create();
}
/*
* Allocate and initialize the vfs implementation private data
* structure, vfs_impl_t.
*** 1783,1792 ****
--- 1786,1796 ----
vfs_unlock(vfsp);
}
}
/* Return vfsp to caller. */
*vfspp = vfsp;
+ fsh_exec_create_callbacks(vfsp);
}
errout:
vfs_freeopttbl(&mnt_mntopts);
if (resource != NULL)
kmem_free(resource, strlen(resource) + 1);
*** 4317,4326 ****
--- 4321,4334 ----
mutex_destroy(&vfsp->vfs_femhead->femh_lock);
kmem_free(vfsp->vfs_femhead, sizeof (*(vfsp->vfs_femhead)));
vfsp->vfs_femhead = NULL;
}
+ /* FSH cleanup */
+ fsh_fsrec_destroy(vfsp->vfs_fshrecord);
+ vfsp->vfs_fshrecord = NULL;
+
if (vfsp->vfs_implp)
vfsimpl_teardown(vfsp);
sema_destroy(&vfsp->vfs_reflock);
kmem_cache_free(vfs_cache, vfsp);
}
*** 4343,4352 ****
--- 4351,4361 ----
void
vfs_rele(vfs_t *vfsp)
{
ASSERT(vfsp->vfs_count != 0);
if (atomic_add_32_nv(&vfsp->vfs_count, -1) == 0) {
+ fsh_exec_destroy_callbacks(vfsp);
VFS_FREEVFS(vfsp);
lofi_remove(vfsp);
if (vfsp->vfs_zone)
zone_rele_ref(&vfsp->vfs_implp->vi_zone_ref,
ZONE_REF_VFS);