スポンサーリンク

VOP_FSYNC(9) FreeBSD カーネル開発者マニュアル VOP_FSYNC(9)

名称

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

書式

#include <sys/param.h>
#include <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 が書きました。

FreeBSD 10.0 July 24, 1996 FreeBSD 10.0

スポンサーリンク