VNODE(9)

名称
vnode - ファイルまたはディレクトリの内部表現

書式
<sys/param.h> <sys/vnode.h>

解説
vnode は UNIX でのファイル活動の中心です。 vnode は struct vnode で記述されます。 個々の活動中のファイル、 個々の現在のディレクトリ、個々のマウントされたファイル、 テキストファイル、およびルートのために割当てられた一意的な 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 を返すあらゆる呼び出し (例えば vget(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
    古い形式のバッドセクタマップです。

実装に関する注
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 コードの不完全な統合の文化遺産です。

vnode(9) インタロックを保持している時の malloc() または free() への全ての呼出しは、VM オブジェクトと vnode のもつれ合いのために、 LOR (ロック順序の逆転) を引き起こします。

関連項目
malloc(9), VFS(9)

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