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]
    クォータを超過しました。

関連項目
VOP_LOOKUP(9,) vnode(9)

歴史
関数 VOP_CREATE は 4.3BSD で登場しました。

作者
このマニュアルページは Doug Rabson が書きました。