VOP_FSYNC(9)

名称
VOP_FSYNC - ファイルシステムバッファのファイルへの吐き出し

書式
<sys/param.h> <sys/vnode.h> int VOP_FSYNC(struct vnode *vp, struct ucred *cred, int waitfor, struct thread *td)

解説
この呼び出しはファイルの全ての汚れたバッファを吐き出します。 sync(2) および fsync(2) システムコールを実装するために使用されます。

引数は以下の通りです。

vp  ファイルの vnode。

cred
    呼び出し側の証明。

waitfor
    入出力の完了を関数が待つべきかどうか。

    MNT_WAIT
        入出力の完了を同期的に待ちます。

    MNT_NOWAIT
        全ての入出力を開始しますが、それを待ちません。

    MNT_LAZY
        ファイルシステムの syncer によって書込まれていないデータを出力します。

td  呼び出しているスレッド。

引数 waitfor は MNT_WAIT または MNT_NOWAIT のどちらかで、関数が戻る前に書き込みの終了を待つべきかどうかを指定します。

ロック
ファイルはエントリ時にロックされるべきです。

戻り値
呼び出しが成功した場合には 0 が返され、 そうでない場合には適切なエラーコードが返されます。

疑似コード

    int
    vop_fsync(struct vnode *vp, struct ucred *cred, int waitfor, struct thread *td)
    {
        struct buf *bp;
        struct buf *nbp;
        struct timeval tv;
        int s;
    loop:
        s = splbio();
        for (bp = vp->v_dirtyblkhd.lh_first; bp; bp = nbp) {
    	nbp = bp->b_vnbufs.le_next;
    	/*
    	 * 既に書き込み中のバッファを無視します。
    	 */
    	if (bp->b_flags & B_BUSY)
    	    continue;

    	/*
    	 * バッファが汚れているか確認します。
    	 */
    	if ((bp->b_flags & B_DELWRI) == 0)
    	    panic("vop_fsync: not dirty");
    	vfs_bio_awrite(bp);
    	splx(s);
    	goto loop;
        }
        splx(s);
        if (waitfor == MNT_WAIT) {
    	s = splbio();
    	while (vp->v_numoutput) {
    	    vp->v_flag |= VBWAIT;
    	    tsleep((caddr_t)&vp->v_numoutput, PRIBIO + 1, "vopfsn");
    	}
    	splx(s);
    #ifdef DIAGNOSTIC
    	if (vp->v_dirtyblkhd.lh_first) {
    	    vprint("vop_fsync: dirty", vp);
    	    goto loop;
    	}
    #endif
        }
        /*
         * ディスク上の vnode を書き出します。
         */
        tv = time;
        return VOP_UPDATE(vp, &tv, &tv, waitfor == MNT_WAIT);
    }

エラー

[ENOSPC]
    ファイルシステムが一杯です。

[EDQUOT]
    クォータを超過しました。

関連項目
vnode(9)

作者
このマニュアルページは Doug Rabson が書きました。