EN JA
VNODE(9)
VNODE(9) FreeBSD Kernel Developer's Manual VNODE(9)

名称

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

書式

#include < sys/param.h>
#include < sys/vnode.h>

解説

vnode は、 UNIX でのファイル活動の中心です。 vnode は、 struct vnode で記述されます。個々の活動中のファイル、個々の現在のディレクトリ、個々のマウントされたファイル、テキストファイル、およびルートのために割当てられた一意的な vnode があります。

個々の vnode は、3 つの参照カウント、 v_usecount, v_holdcntv_writecount を持っています。最初のものは、カーネル内でこの vnode を使用しているクライアントの数です。このカウントは、 vref(9), vrele(9)vput(9) によって管理されます。 2 番目のものは、カーネル内でこの vnode の再利用を拒否しているクライアントの数です。このカウントは、 vhold(9)vdrop(9) によって管理されます。 vnode の v_usecountv_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 オブジェクトの支持が有るかもしれませんし無いかもしれません。必ず支持オブジェクトを取得したい場合には、 vnode_create_vobject() を呼び出します。
VDIR
ディレクトリです。
VBLK
ブロック型デバイスです。 VM オブジェクトの支持が有るかもしれませんし無いかもしれません。必ず支持オブジェクトを取得したい場合には、 vnode_create_vobject() を呼び出します。
VCHR
文字型デバイスです。
VLNK
シンボリックリンクです。
VSOCK
ソケットです。通知ロックは、動作しないでしょう。
VFIFO
FIFO (名前付きパイプ) です。通知ロックは、動作しないでしょう。
VBAD
vnode が再請求 (reclaim) されたことを示します。

実装に関する注

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

作者

このマニュアルページは、 Doug Rabson によって書かれました。
February 13, 2010 FreeBSD