int nnpfs_getnewvnode(struct nnpfs *nnpfsp, struct vnode **vpp, struct nnpfs_handle *handle) { struct nnpfs_node *result, *check; int error; error = getnewvnode(VT_NNPFS, NNPFS_TO_VFS(nnpfsp), &nnpfs_vops, vpp); if (error) return error; result = nnpfs_alloc(sizeof(*result), M_NNPFS_NODE); bzero(result, sizeof(*result)); (*vpp)->v_data = result; result->vn = *vpp; result->handle = *handle; result->flags = 0; result->tokens = 0; result->offset = 0; #if defined(HAVE_KERNEL_LOCKMGR) || defined(HAVE_KERNEL_DEBUGLOCKMGR) lockinit (&result->lock, PVFS, "nnpfs_lock", 0, LK_NOPAUSE); #else result->vnlocks = 0; #endif result->anonrights = 0; result->rd_cred = NULL; result->wr_cred = NULL; #if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 105280000 genfs_node_init(*vpp, &nnpfs_genfsops); #endif check = nnpfs_node_find(&nnpfsp->nodehead, handle); if (check) { vput(*vpp); *vpp = result->vn; return 0; } nnpfs_insert(&nnpfs->nodehead, result); return 0; }
int xfs_unmount_common(struct mount *mp, int mntflags) { struct xfs *xfsp = VFS_TO_NNPFS(mp); int flags = 0; int error; if (mntflags & MNT_FORCE) { #ifdef HAVE_KERNEL_DOFORCE if (!doforce) return EINVAL; #endif flags |= FORCECLOSE; } error = free_all_xfs_nodes(xfsp, flags, 1); if (error) return error; xfsp->status = 0; NNPFS_TO_VFS(xfsp) = NULL; return 0; }
int free_all_nnpfs_nodes(struct nnpfs *nnpfsp, int flags, int unmountp) { int error = 0; struct mount *mp = NNPFS_TO_VFS(nnpfsp); if (mp == NULL) { NNPFSDEB(XDEBNODE, ("free_all_nnpfs_nodes already freed\n")); return 0; } NNPFSDEB(XDEBNODE, ("free_all_nnpfs_nodes starting\n")); nnpfs_dnlc_purge_mp(mp); if (nnpfsp->root) { NNPFSDEB(XDEBNODE, ("free_all_nnpfs_nodes now removing root\n")); vgone(XNODE_TO_VNODE(nnpfsp->root)); nnpfsp->root = NULL; } NNPFSDEB(XDEBNODE, ("free_all_nnpfs_nodes root removed\n")); NNPFSDEB(XDEBNODE, ("free_all_nnpfs_nodes now killing all remaining nodes\n")); /* * If we have a syncer vnode, release it (to emulate dounmount) * and the create it again when if we are going to need it. */ #ifdef HAVE_STRUCT_MOUNT_MNT_SYNCER if (!unmountp) { if (mp->mnt_syncer != NULL) { #ifdef HAVE_KERNEL_VFS_DEALLOCATE_SYNCVNODE vfs_deallocate_syncvnode(mp); #else /* * FreeBSD and OpenBSD uses different semantics, * FreeBSD does vrele, and OpenBSD does vgone. */ #if defined(__OpenBSD__) vgone(mp->mnt_syncer); #elif defined(__FreeBSD__) vrele(mp->mnt_syncer); #else #error what os do you use ? #endif mp->mnt_syncer = NULL; #endif } } #endif error = nnpfs_vflush(mp, flags); #ifdef HAVE_STRUCT_MOUNT_MNT_SYNCER if (!unmountp) { NNPFSDEB(XDEBNODE, ("free_all_nnpfs_nodes not flushing syncer vnode\n")); if (mp->mnt_syncer == NULL) if (vfs_allocate_syncvnode(mp)) panic("failed to allocate syncer node when nnpfs daemon died"); } #endif if (error) { NNPFSDEB(XDEBNODE, ("xfree_all_nnpfs_nodes: vflush() error == %d\n", error)); return error; } NNPFSDEB(XDEBNODE, ("free_all_nnpfs_nodes done\n")); return error; }