summaryrefslogtreecommitdiffstats
path: root/sys/fs/pseudofs/pseudofs_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/pseudofs/pseudofs_vnops.c')
-rw-r--r--sys/fs/pseudofs/pseudofs_vnops.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/sys/fs/pseudofs/pseudofs_vnops.c b/sys/fs/pseudofs/pseudofs_vnops.c
index 91614d6..1152c11 100644
--- a/sys/fs/pseudofs/pseudofs_vnops.c
+++ b/sys/fs/pseudofs/pseudofs_vnops.c
@@ -121,7 +121,32 @@ pfs_access(struct vop_access_args *va)
static int
pfs_close(struct vop_close_args *va)
{
- PFS_RETURN (0);
+ struct vnode *vn = va->a_vp;
+ struct pfs_vdata *pvd = (struct pfs_vdata *)vn->v_data;
+ struct pfs_node *pn = pvd->pvd_pn;
+ struct proc *proc;
+ int error;
+
+ PFS_TRACE((pn->pn_name));
+
+ /*
+ * Do nothing unless this is the last close and the node has a
+ * last-close handler.
+ */
+ if (vn->v_usecount > 1 || pn->pn_close == NULL)
+ PFS_RETURN (0);
+
+ if (pvd->pvd_pid != NO_PID)
+ proc = pfind(pvd->pvd_pid);
+ else
+ proc = NULL;
+
+ error = (pn->pn_close)(va->a_td, proc, pn);
+
+ if (proc != NULL)
+ PROC_UNLOCK(proc);
+
+ PFS_RETURN (error);
}
/*
OpenPOWER on IntegriCloud