VOP_LOCK(9)

명칭
VOP_LOCK, VOP_UNLOCK, VOP_ISLOCKED, vn_lock - vnode 액세스의 직렬화

서식
<sys/param.h> <sys/lock.h> <sys/vnode.h> int VOP_LOCK(struct vnode *vp, int flags, struct thread *td) int VOP_UNLOCK(struct vnode *vp, int flags, struct thread *td) int VOP_ISLOCKED(struct vnode *vp, struct thread *td) int vn_lock(struct vnode *vp, int flags, struct thread *td)

해설
이러한 호출은, 파일 시스템에의 액세스를 직렬화하기 위해서(때문에) 사용됩니다. 예를 들면, 동일 파일에 대한 2 개의 기입이 동시에 발생하는 것을 피하기 위해서(때문에) 사용합니다.

인수는 이하와 같습니다.

vp  락 또는 락 해제되는 vnode.

flags
    이하의 락 요구 타입의 하나.
    LK_SHARED | 공유 락
    LK_EXCLUSIVE | 배타적 락
    LK_UPGRADE | 공유로부터 배타적에의 업그레이드
    LK_EXCLUPGRADE | 최초의 공유로부터 배타적에의 업그레이드
    LK_DOWNGRADE | 배타적으로부터 공유에의 다운 그레이드
    LK_RELEASE | 모든 락 타입의 해제
    LK_DRAIN | 락 상태 종료까지의 대기

    락 타입은, 이하의 락 플래그와 OR 되고 있을지도 모릅니다.
    LK_NOWAIT | 락을 기다리기 위해서(때문에) sleep 하지 않는다
    LK_SLEEPFAIL | sleep 해, 실패를 돌려준다
    LK_CANRECURSE | 재귀적 배타적 락을 인정한다
    LK_REENABLE | 락 소실 후재유효화 되어야 한다
    LK_NOPAUSE | 표류하지 않는다

    락 타입은, 이하의 제어 플래그와 OR 되고 있을지도 모릅니다.
    LK_INTERLOCK | 호출측이 이미 간이 락을 보관 유지하고 있을 때로 지정
    (VOP_LOCK 는 락을 취득한 다음에 간이 락을 해제합니다)
    LK_RETRY | 락 될 때까지 리트라이
    LK_NOOBJ | 오브젝트를 작성하지 않는다

td  락을 사용하기 위한 thread 문맥.

커널 코드는 vnode 를 잠그기 위해서(때문에) VOP_LOCK() (을)를 직접 호출하지 않고 , vn_lock() (을)를 사용해야 합니다.

반환값
성공시에는 0 이 돌려주어져 그렇지 않은 경우에는 에러가 돌려주어집니다.

유사 코드

    struct vopnode {
        int von_flag;
        /*
         * 다른 파일 시스템 고유 데이터
         */
        ...;
    };
    #define VON_LOCKED	1
    #define VON_WANTED	2
    #define VTOVON(vp)	((struct vopnode *) (vp)->v_data)
    int
    vop_lock(struct vnode *vp)
    {
        struct vopnode* vop;
    start:
        while (vp->v_flag & VXLOCK) {
    	vp->v_flag |= VXWANT;
    	tsleep((caddr_t) vp, PINOD, "voplk1", 0);
        }
        if (vp->v_tag == VT_NON)
    	return ENOENT;
        vop = VTOVON(vp);
        if (vop->von_flag & VON_LOCKED) {
    	vop->von_flag |= VON_WANTED;
    	tsleep((caddr_t) vop, PINOD, "voplk2", 0);
    	goto start;
        }
        vop->von_flag |= VON_LOCKED;
        return 0;
    }
    int
    vop_unlock(struct vnode *vp)
    {
        struct vopnode *vop = VTOVON(vp);
        if ((vop->von_flag & VON_LOCKED) == 0) {
    	panic("vop_unlock not locked");
        }
        vop->von_flag &= ~VON_LOCKED;
        if (vop->von_flag & VON_WANTED) {
    	vop->von_flag &= ~VON_WANTED;
    	wakeup((caddr_t) vop);
        }
        return 0;
    }
    int
    vop_islocked(struct vnode *vp)
    {
        struct vopnode *vop = VTOVON(vp);
        if (vop->von_flag & VON_LOCKED)
    	return 1;
        else
    	return 0;
    }

관련 항목
vnode(9)

저자
이 메뉴얼 페이지는 Doug Rabson 하지만 썼습니다.