int fusefs_inactive(void *v) { struct vop_inactive_args *ap = v; struct vnode *vp = ap->a_vp; struct proc *p = curproc; struct ucred *cred = p->p_ucred; struct fusefs_node *ip = VTOI(vp); struct fusefs_filehandle *fufh = NULL; struct fusefs_mnt *fmp; struct vattr vattr; int error = 0; int type; fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; for (type = 0; type < FUFH_MAXTYPE; type++) { fufh = &(ip->fufh[type]); if (fufh->fh_type != FUFH_INVALID) fusefs_file_close(fmp, ip, fufh->fh_type, type, (ip->vtype == VDIR), p); } error = VOP_GETATTR(vp, &vattr, cred); VOP_UNLOCK(vp, 0); if (error) vrecycle(vp, p); return (0); }
int fusefs_inactive(void *v) { struct vop_inactive_args *ap = v; struct vnode *vp = ap->a_vp; struct proc *p = ap->a_p; struct fusefs_node *ip = VTOI(vp); struct fusefs_filehandle *fufh = NULL; struct fusefs_mnt *fmp; int error = 0; int type; DPRINTF("fusefs_inactive\n"); fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; for (type = 0; type < FUFH_MAXTYPE; type++) { fufh = &(ip->fufh[type]); if (fufh->fh_type != FUFH_INVALID) fusefs_file_close(fmp, ip, fufh->fh_type, type, (ip->vtype == VDIR), ap->a_p); } VOP_UNLOCK(vp, 0, p); /* not sure if it is ok to do like that ...*/ if (ip->cached_attrs.va_mode == 0) vrecycle(vp, p); return (error); }
int fusefs_reclaim(void *v) { struct vop_reclaim_args *ap = v; struct vnode *vp = ap->a_vp; struct fusefs_node *ip = VTOI(vp); struct fusefs_filehandle *fufh = NULL; struct fusefs_mnt *fmp; struct fusebuf *fbuf; int type; fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; /*close opened files*/ for (type = 0; type < FUFH_MAXTYPE; type++) { fufh = &(ip->fufh[type]); if (fufh->fh_type != FUFH_INVALID) { printf("fusefs: vnode being reclaimed is valid\n"); fusefs_file_close(fmp, ip, fufh->fh_type, type, (ip->vtype == VDIR), curproc); } } /* * Purge old data structures associated with the inode. */ ip->parent = 0; /* * if the fuse connection is opened * ask libfuse to free the vnodes */ if (fmp->sess_init) { fbuf = fb_setup(0, ip->ufs_ino.i_number, FBT_RECLAIM, curproc); if (fb_queue(fmp->dev, fbuf)) printf("fusefs: libfuse vnode reclaim failed\n"); fb_delete(fbuf); } /* * Remove the inode from its hash chain. */ ufs_ihashrem(&ip->ufs_ino); cache_purge(vp); free(ip, M_FUSEFS); vp->v_data = NULL; return (0); }
int fusefs_close(void *v) { struct vop_close_args *ap; struct fusefs_node *ip; struct fusefs_mnt *fmp; enum fufh_type fufh_type = FUFH_RDONLY; int isdir, i; DPRINTF("fusefs_close\n"); ap = v; ip = VTOI(ap->a_vp); fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; if (!fmp->sess_init) return (0); if (ip->vtype == VDIR) { isdir = 1; if (ip->fufh[fufh_type].fh_type != FUFH_INVALID) return (fusefs_file_close(fmp, ip, fufh_type, O_RDONLY, isdir, ap->a_p)); } else { if (ap->a_fflag & IO_NDELAY) return (0); if ((ap->a_fflag & FREAD) && (ap->a_fflag & FWRITE)) fufh_type = FUFH_RDWR; else if (ap->a_fflag & (FWRITE)) fufh_type = FUFH_WRONLY; } /* * if fh not valid lookup for another valid fh in vnode. * Do we need panic if there's not a valid fh ? */ if (ip->fufh[fufh_type].fh_type != FUFH_INVALID) { for (i = 0; i < FUFH_MAXTYPE; i++) if (ip->fufh[fufh_type].fh_type != FUFH_INVALID) break; return (0); } return (0); }
int fusefs_reclaim(void *v) { struct vop_reclaim_args *ap = v; struct vnode *vp = ap->a_vp; struct fusefs_node *ip = VTOI(vp); struct fusefs_filehandle *fufh = NULL; struct fusefs_mnt *fmp; int type; DPRINTF("fusefs_reclaim\n"); fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; /*close opened files*/ for (type = 0; type < FUFH_MAXTYPE; type++) { fufh = &(ip->fufh[type]); if (fufh->fh_type != FUFH_INVALID) { printf("FUSE: vnode being reclaimed is valid"); fusefs_file_close(fmp, ip, fufh->fh_type, type, (ip->vtype == VDIR), ap->a_p); } } /* * Purge old data structures associated with the inode. */ ip->parent = 0; /* * Remove the inode from its hash chain. */ ufs_ihashrem(&ip->ufs_ino); cache_purge(vp); free(ip, M_FUSEFS); vp->v_data = NULL; return (0); }