VOP_LINK(9)

名称
VOP_LINK - ファイルの新しい名前の作成

書式
<sys/param.h> <sys/vnode.h> int VOP_LINK(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)

解説
これは、既存のファイルに対し、 指定したディレクトリ中の新しい名前をリンクします。

引数は以下の通りです。

dvp ディレクトリの vnode。

vp  リンクされるファイルの vnode。

cnp ファイルについてのパス名情報。

パス名情報は、戻り時に開放されなければなりません。 ディレクトリとファイルの vnode は戻り時に開放されるべきではありません。

ロック
ディレクトリ dvp は、入る時にロックされていて、戻り時もロックされ続けているべきです。 ファイル vp は、入る時にロックされておらず、戻り時もそのままであるべきです。 VOP コードが vp をロックする場合には、戻る前に必ずロックを解除しなければなりません。

戻り値
ファイルが成功裏にリンクされた場合には 0 が返され、 そうでない場合にはエラーが返されます。

疑似コード

    int
    vop_link(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
    {
        int error = 0;
        if (vp->v_mount != dvp->v_mount) {
    	VOP_ABORTOP(dvp, cnp);
    	error = EXDEV;
    	goto out2;
        }
        if (vp != dvp && (error = VOP_LOCK(vp))) {
    	VOP_ABORTOP(dvp, cnp);
    	goto out2;
        }
        /*
         * 今、vp をロックしたので、out2 の代わりに out1 を使用
         * しなければなりません。
         */
        if (vp would have too many links) {
    	VOP_ABORTOP(dvp, cnp);
    	error = EMLINK;
    	goto out1;
        }
        if (vp is immutable) {
    	VOP_ABORTOP(dvp, cnp);
    	error = EPERM;
    	goto out1;
        }
        /*
         * vp のリンクカウントをインクリメントし、ディスクに書き戻します。
         */
        ...;
        if (!error) {
    	/*
    	 * ディレクトリの新しい名前を追加します。
    	 */
    	...;
        }
        free(cnp->cn_pnbuf, M_NAMEI);
    out1:
        if (vp != dvp)
    	VOP_UNLOCK(vp);
    out2:
        return error;
    }

エラー

[EPERM]
    ファィルが変更不可能です。

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

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