VNODE(9)

명칭
vnode - 파일 또는 디렉토리의 내부 표현

서식
<sys/param.h> <sys/vnode.h>

    /*
     * vnode 의 형태입니다. VNON 는 형태가 없는 일을 의미합니다.
     */
    enum vtype	{ VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD };
    /*
     * vnode 의 태그형입니다.
     * 외부 프로그램 (예를 들면, pstat) (을) 위해서만 있어, 결코 커널
     * 에 의해 검사되어야 하는 것이 아닙니다.
     */
    enum vtagtype	{
    	VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_PC, VT_LFS, VT_LOFS, VT_FDESC,
    	VT_PORTAL, VT_NULL, VT_UMAP, VT_KERNFS, VT_PROCFS, VT_AFS, VT_ISOFS,
    	VT_UNION, VT_MSDOSFS, VT_TFS, VT_VFS, VT_CODA, VT_NTFS
    };
    /*
     * 개개의 하위 파일 시스템은 그 사적인 area를 할당해 그것을
     * v_data 나들 적합니다. 눌이 아니다면, 이 area는 getnewvnode()로
     * 해방됩니다.
     */
    TAILQ_HEAD(buflists, buf);
    typedef	int 	vop_t __P((void *));
    struct namecache;
    /*
     * 이러한 항목의 독 붐비어 또는 기록은 적절한 락의 보관 유지를 요구합니다.
     * v_freelist 는 글로벌 vnode_free_list 단순 락으로 락 됩니다.
     * v_mntvnodes 는 글로벌 mntvnodes 단순 락으로 락 됩니다.
     * v_flag, v_usecount, v_holdcount 및 v_writecount 는 vinterlock
     *    단순 락으로 락 됩니다.
     * v_pollinfo 는 그 중에 포함되어 있는 락으로 락 됩니다.
     */
    struct vnode {
    	u_long	v_flag;				/* vnode 플래그 (이하 참조) */
    	int	v_usecount;			/* 유저의 참조 카운트 */
    	int	v_writecount;			/* 기록자의 참조 카운트 */
    	int	v_holdcnt;			/* 페이지 & 버퍼의 참조 */
    	daddr_t	v_lastr;			/* 마지막 독포함 (예측) */
    	u_long	v_id;				/* 케이파비리티 식별자 */
    	struct	mount *v_mount;			/* 지금 있는 VFS 에의 포인터 */
    	vop_t	**v_op;				/* vnode 조작 벡터 */
    	TAILQ_ENTRY(vnode) v_freelist;		/* vnode 면세표 */
    	LIST_ENTRY(vnode) v_mntvnodes;		/* 마운트 포인트의 vnode */
    	struct	buflists v_cleanblkhd;		/* 깨끗한 블록 리스트 선두 */
    	struct	buflists v_dirtyblkhd;		/* 더러워진 블록 리스트 선두 */
    	LIST_ENTRY(vnode) v_synclist;		/* 더러워진 버퍼 첨부 vnode */
    	long	v_numoutput;			/* 기입중의 수 */
    	enum	vtype v_type;			/* vnode 의 형태 */
    	union {
    		struct mount	*vu_mountedhere;/* mount 된 VFS 에의 포인터 (VDIR) */
    		struct socket	*vu_socket;	/* UNIX IPC (VSOCK) */
    		struct specinfo	*vu_specinfo;	/* 디바이스 (VCHR, VBLK) */
    		struct fifoinfo	*vu_fifoinfo;	/* FIFO (VFIFO) */
    	} v_un;
    	struct	nqlease *v_lease;		/* 대출의 소프트 참조 */
    	daddr_t	v_lastw;			/* 마지막 기록 (클러스터) */
    	daddr_t	v_cstart;			/* 클러스터의 개시 블록 */
    	daddr_t	v_lasta;			/* 마지막 할당 */
    	int	v_clen;				/* 현재의 클러스터장 */
    	int	v_maxio;			/* 최대 I/O 클러스터 사이즈 */
    	struct vm_object *v_object;		/* VM 오브젝트의 보존 장소 */
    	struct	simplelock v_interlock;		/* 사용 카운트와 플래그의 락 */
    	struct	lock *v_vnlock;			/* 비락 파일 시스템용 */
    	enum	vtagtype v_tag;			/* 하위 데이터의 형태 */
    	void 	*v_data;			/* 파일 시스템의 사적 데이터 */
    	LIST_HEAD(, namecache) v_cache_src;	/* 우리로부터의 캐쉬 엔트리 */
    	TAILQ_HEAD(, namecache) v_cache_dst;	/* 우리에게로의 캐쉬 엔트리 */
    	struct	vnode *v_dd;			/* .. 의 vnode */
    	u_long	v_ddid;				/* .. 의 케이파비리티 식별자 */
    	struct	{
    		struct	simplelock vpi_lock;	/* 이하를 보호하는 락 */
    		struct	selinfo vpi_selinfo;	/* 폴링측의 식별 */
    		short	vpi_events;		/* 무엇을 찾고 있는 것인가 */
    		short	vpi_revents;		/* 무엇이 일어났는가 */
    	} v_pollinfo;
    };
    #define	v_mountedhere	v_un.vu_mountedhere
    #define	v_socket	v_un.vu_socket
    #define	v_specinfo	v_un.vu_specinfo
    #define	v_fifoinfo	v_un.vu_fifoinfo
    /*
     * vnode 플래그입니다.
     */
    #define	VROOT		0x00001	/* 파일 시스템의 루트 */
    #define	VTEXT		0x00002	/* vnode 는 순수한 텍스트 prototype */
    #define	VSYSTEM		0x00004	/* vnode 는 커널이 사용중 */
    #define	VISTTY		0x00008	/* vnode 는 tty 를 표현 */
    #define	VXLOCK		0x00100	/* vnode 는 하위의 형태의 변경을 위해 락중 */
    #define	VXWANT		0x00200	/* 프로세스가 vnode 를 기다리고 있습니다 */
    #define	VBWAIT		0x00400	/* 출력의 완료를 기다리고 있습니다 */
    #define	VALIASED	0x00800	/* vnode 에 별명이 있습니다 */
    #define	VDIROP		0x01000	/* LFS: vnode 가 디렉토리 조작에 관여 */
    #define	VOBJBUF		0x02000	/* VM 오브젝트에 버퍼를 할당 */
    #define	VNINACT		0x04000	/* LFS: lfs_vunref 로 ufs_inactive() 하지 않는다 */
    #define	VAGE		0x08000	/* 면세표의 선두에 vnode 를 삽입 */
    #define	VOLOCK		0x10000	/* 오브젝트를 기다리기 위해서(때문에) vnode 가 락 */
    #define	VOWANT		0x20000	/* 프로세스가 VOLOCK 를 기다리고 있습니다 */
    #define	VDOOMED		0x40000	/* 이 vnode 는 재이용중 */
    #define	VFREE		0x80000	/* 이 vnode 는 면세표상 */
    #define	VTBFREE		0x100000 /* 이 vnode 는 면세표행 */
    #define	VONWORKLST	0x200000 /* syncer 작업 리스트상 */
    #define	VMOUNT		0x400000 /* mount 처리중 */

해설
vnode 는 UNIX 에서의 파일 활동의 중심입니다. 개개의 활동중의 파일, 개개의 현재의 디렉토리, 개개의 mount 된 파일, 텍스트 파일, 및 루트를 위해서(때문에) 할당일의적인 vnode 가 있습니다.

개개의 vnode 는 3 개의 참조 카운트, v_usecount, v_holdcnt 및 v_writecount (을)를 가지고 있습니다. 최초의 것은 커널내에서 이 vnode 를 사용하고 있는 클라이언트의 수입니다. 이 카운트는 vref(9), vrele(9) 및 vput(9) 에 의해 관리됩니다. 2 번째의 것은 커널내에서 이 vnode 의 재이용을 거부하고 있는 클라이언트의 수입니다. 이 카운트는 vhold(9) 및 vdrop(9) 에 의해 관리됩니다. vnode 의 v_usecount 및 v_holdcnt 의 양쪽 모두가 0 에 이르면(자), 그리고 그 vnode 는 면세표상에 놓여져 것에 의해 다른 파일 시스템으로, 다른 파일을 위해서(때문에) 재이용될지도 모릅니다. 면세표에의 및 면세표로부터의 이행은, getnewvnode(9), vfree(9) 및 vbusy(9) 에 의해 취급됩니다. 3 번째의 것은 파일에 기록중의 클라이언트의 수의 카운트입니다. 이것은 open(2) 및 close(2) 시스템 콜에 의해 관리됩니다.

vnode 를 돌려주는 모든 호출해 (예를 들면 VFS_GET(9), VOP_LOOKUP(9) 등)은 vnode 의 v_usecount (을)를 1 두개 늘립니다. 호출측이 vnode 의 이용을 완료했을 때에는, 이 참조는 vrele(9) (또는 vnode 가 락 되고 있으면 vput(9)) 의 호출에 의해 해방되어야 합니다.

그 외의 공통에 사용되는 vnode 구조체의 멤버는, 이름 캐쉬에서의 일관성을 관리하기 위해서 사용된다 v_id 라고 그 vnode 를 소유하고 있는 파일 시스템을 가리킨다 v_mount 라고 그 vnode 가 표현하는 오브젝트의 형태를 포함한다 v_type 라고 그 vnode 의 파일 시스템 특유의 데이터를 보존하기 위해서 파일 시스템에 의해 사용된다 v_data (이)가 있습니다. v_op 필드는 vnode 의 기능을 실장하는 파일 시스템내의 함수를 호출하기 위한 VOP_* 매크로에 의해 사용됩니다.

VNODE 의 형태

VNON
    형태 없음입니다.

VREG
    통상 파일입니다. VM 오브젝트의 지지가 있을지도 모르고 없을지도 모릅니다. 반드시 지지 오브젝트를 취득하고 싶은 경우에는, vfs_object_create(9) (을)를 호출합니다.

VDIR
    디렉토리입니다.

VBLK
    블록 타입 디바이스입니다. VM 오브젝트의 지지가 있을지도 모르고 없을지도 모릅니다. 반드시 지지 오브젝트를 취득하고 싶은 경우에는, vfs_object_create(9) (을)를 호출합니다.

VCHR
    캐릭터형 디바이스입니다.

VLNK
    기호 연결입니다.

VSOCK
    소켓입니다. 통지 락은 동작하지 않을 것입니다.

VFIFO
    FIFO (이름 첨부 파이프)입니다. 통지 락은 동작하지 않을 것입니다.

VBAD
    낡은 형식의 잘못된 섹터 MAP입니다.

주
VFIFO 는 /sys/kern/sys_pipe.c 의 "struct fileops" 를 사용합니다. VSOCK 는 /sys/kern/sys_socket.c 의 "struct fileops" 를 사용합니다. 그 외의 모두는 /sys/kern/vfs_vnops.c 의 "struct fileops" 를 사용합니다.

VFIFO/VSOCK 의 코드에 왠지 "struct fileops" 가 사용되고 있는 이유는, 커널에의 VFS 코드의 불완전한 통합의 문화유산입니다.

관련 항목
VFS(9)

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