Esempio n. 1
0
static int
devfs_spec_fsync(struct vop_fsync_args *ap)
{
	struct vnode *vp = ap->a_vp;
	int error;

	if (!vn_isdisk(vp, NULL))
		return (0);

	/*
	 * Flush all dirty buffers associated with a block device.
	 */
	error = vfsync(vp, ap->a_waitfor, 10000, NULL, NULL);
	return (error);
}
Esempio n. 2
0
/*
 * fsync is usually a NOP, but we must take action when unmounting or
 * when recycling.
 */
static int
tmpfs_fsync(struct vop_fsync_args *v)
{
	struct tmpfs_node *node;
	struct vnode *vp = v->a_vp;

	node = VP_TO_TMPFS_NODE(vp);

	tmpfs_update(vp);
	if (vp->v_type == VREG) {
		if (vp->v_flag & VRECLAIMED) {
			if (node->tn_links == 0)
				tmpfs_truncate(vp, 0);
			else
				vfsync(v->a_vp, v->a_waitfor, 1, NULL, NULL);
		}
	}
	return 0;
}
Esempio n. 3
0
/* ARGSUSED */
static int
ffs_fsync(struct vop_fsync_args *ap)
{
	struct vnode *vp = ap->a_vp;
	int error;

	if (vn_isdisk(vp, NULL))
		if (vp->v_rdev && vp->v_rdev->si_mountpoint != NULL &&
		    (vp->v_rdev->si_mountpoint->mnt_flag & MNT_SOFTDEP))
			softdep_fsync_mountdev(vp);

	/*
	 * Flush all dirty buffers associated with a vnode.
	 */
	error = vfsync(vp, ap->a_waitfor, NIADDR + 1, ffs_checkdeferred,
		       softdep_sync_metadata);
	if (error == 0)
		error = ffs_update(vp, (ap->a_waitfor == MNT_WAIT));
	return (error);
}
Esempio n. 4
0
static int
flushvncache(struct vnode *vp, int waitfor)
{
    struct puffs_node *pn = VPTOPP(vp);
    struct vattr va;
    int error = 0;

    /* flush out information from our metacache, see vop_setattr */
    if (pn->pn_stat & PNODE_METACACHE_MASK
            && (pn->pn_stat & PNODE_DYING) == 0) {
        vattr_null(&va);
        error = dosetattr(vp, &va, FSCRED, SETATTR_CHSIZE |
                          (waitfor == MNT_NOWAIT ? 0 : SETATTR_ASYNC));
        if (error)
            return error;
    }

    /*
     * flush pages to avoid being overly dirty
     */
    vfsync(vp, waitfor, 0, NULL, NULL);

    return error;
}
Esempio n. 5
0
/*
 * hpfs_fsync(struct vnode *a_vp, int a_waitfor)
 */
static int
hpfs_fsync(struct vop_fsync_args *ap)
{
	struct vnode *vp = ap->a_vp;

	/*
	 * Flush all dirty buffers associated with a vnode.
	 */
#ifdef DIAGNOSTIC
loop:
#endif
	vfsync(vp, ap->a_waitfor, 0, NULL, NULL);
#ifdef DIAGNOSTIC
	if (ap->a_waitfor == MNT_WAIT && !RB_EMPTY(&vp->v_rbdirty_tree)) {
		vprint("hpfs_fsync: dirty", vp);
		goto loop;
	}
#endif

	/*
	 * Write out the on-disc version of the vnode.
	 */
	return hpfs_update(VTOHP(vp));
}