VOP_CREATE(9)

명칭
VOP_CREATE, VOP_MKNOD, VOP_MKDIR, VOP_SYMLINK - 파일, 소켓, FIFO, 디바이스, 디렉토리 또는 기호 연결의 작성

서식
<sys/param.h> <sys/vnode.h> <sys/namei.h> int VOP_CREATE(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp, struct vattr *vap) int VOP_MKNOD(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp, struct vattr *vap) int VOP_MKDIR(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp, struct vattr *vap) int VOP_SYMLINK(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp, struct vattr *vap, char *target)

해설
이러한 엔트리 포인트는, 새로운 파일, 소켓, FIFO, 디바이스, 디렉토리 또는 기호 연결을, 지정된 디렉토리안에 작성합니다.

인수는 이하와 같습니다.

dvp 디렉토리의 락 된 vnode.

vpp 작성 결과의 락 된 vnode 가 격납되어야 한다, 변수의 주소.

cnp 생성된 요소의 패스명.

vap 새로운 오브젝트의 작성시에 사용되어야 할 속성.

target
    기호 연결의 대상의 패스명.

이러한 엔트리 포인트는, 오브젝트의 생성중에 VOP_LOOKUP(9) 의 후에 불려 갑니다. 통상, VOP_LOOKUP(9) 하 SAVENAME 플래그를 cnp->cn_flags 안으로 설정해, cnp->cn_pnbuf 그리고 가리켜지는 메모리를 정당한 그대로에 유지합니다. 파일의 작성시에 에러가 검출되었을 경우에는, 이 메모리는 해방됩니다. 파일이 잘 작성되었을 경우에는, cnp 에 SAVESTART 플래그가 지정되어 있지 않으면, 해방됩니다.

락
디렉토리 dvp (은)는 들어갈 때에 락 되어 돌아올 때에도 락 계속 되지 않으면 안됩니다. 호출이 성공의 경우에는, 새로운 오브젝트가 락 되어 돌려주어집니다.

반환값
성공시에는, 새로운 오브젝트의 vnode 가 *vpp 에 놓여져 0 이 돌려주어집니다. 그렇지 않은 경우에는, 적절한 에러가 돌려주어집니다.

유사 코드

    int
    vop_create(struct vnode *dvp,
    	   struct vnode **vpp,
    	   struct componentname *cnp
    	   struct vattr *vap)
    {
        int mode = MAKEIMODE(vap->va_type, vap->va_mode);
        struct vnode *vp;
        int error;
        *vpp = NULL;
        if ((mode & IFMT) == 0)
    	mode |= IFREG;
        error = SOMEFS_VALLOC(dvp, mode, cnp->cn_cred, &vp);
        if (error) {
    	free(cnp->cn_pnbuf, M_NAMEI);
    	vput(dvp);
    	return error;
        }
        /*
         * 새로운 vnode 의 퍼미션을 갱신합니다.
         * 이것에는, 디렉토리로부터의 그룹의 카피를 포함합니다.
         */
        ...;
    #ifdef QUOTA
        /*
         * 할 수 있는 한 쿼터 정보를 체크합니다.
         */
        ...;
    #endif
        /*
         * 디렉토리에 새로운 vnode 를 넣어 디렉토리 내용이 변경된다
         * 전에 vnode 가 디스크를 액세스 하지 않게 주의합니다.
         */
        error = ...;
        if (error)
    	goto bad;
        if ((cnp->cn_flags & SAVESTART) == 0)
    	free(cnp->cn_pnbuf, M_NAMEI);
        vput(dvp);
        *vpp = vp;
        return 0;
    bad:
        /*
         * inode 또는 디렉토리의 갱신의 시도로 기입해 에러가
         * 발생했기 때문에 inode 의 할당을 해방하지 않으면 안됩니다.
         */
        free(cnp->cn_pnbuf, M_NAMEI);
        vput(vp);
        /*
         * vp 를 위한 파일 시스템 자원을 해방.
         */
        ...;
        vput(dvp);
        return error;
    }

에러

[ENOSPC]
    파일 시스템이 가득합니다.

[EDQUOT]
    그 유저의 파일 시스템 공간 또는 inode 의 쿼터를 초과했습니다.

관련 항목
VOP_LOOKUP(9,) vnode(9)

역사
함수 VOP_CREATE 하 4.3BSD 그리고 등장했습니다.

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