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  호출하고 있는 thread.

인수 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 하지만 썼습니다.