VOP_LOOKUP(9) | FreeBSD Kernel Developer's Manual | VOP_LOOKUP(9) |
名称
VOP_LOOKUP — パス名の構成要素を検索する書式
#include < sys/param.h>#include < sys/vnode.h>
#include < sys/namei.h>
int
VOP_LOOKUP( struct vnode *dvp, struct vnode **vpp, struct componentname *cnp);
解説
このエントリポイントは、与えられたディレクトリの単一のパス名の構成要素を検索します。引数は、次の通りです:
- dvp
- 検索するディレクトリのロックされた vnode。
- vpp
- 結果のロックされた vnode が格納されるべき、変数のアドレス。
- cnp
- 検索されるパス名の構成要素。
cnp は、次のように定義される componentname 構造体へのポインタです:
struct componentname { /* * 検索する引数. */ u_long cn_nameiop; /* namei 操作 */ u_long cn_flags; /* namei へのフラグ */ struct thread *cn_thread; /* 検索を要求するスレッド */ struct ucred *cn_cred; /* 資格証明 */ /* * 検索ルーチンとコミットルーチンで共有される. */ char *cn_pnbuf; /* パス名バッファ */ char *cn_nameptr; /* 検索された名前へのポインタ */ long cn_namelen; /* 検索された構成要素の長さ */ u_long cn_hash; /* 検索された名前のハッシュ値 */ long cn_consume; /* lookup() で消費された文字数 */ };
パス名の構成要素をロックされた vnode へのポインタに変換します。これは、中心的で、やや複雑なルーチンです。ファイルシステムが厳密なツリー階層で維持されていないなら、これは、デッドロック状態の結果となるかもしれません。
cnp->cn_nameiop 引数は、オブジェクトの使用目的に依存する LOOKUP, CREATE, RENAME または DELETE です。 CREATE, RENAME または DELETE が指定されるとき、ディレクトリエントリを作成、名前の変更、または削除に使用可能な情報が計算されます。
VOP_LOOKUP の全体的な概要は、次の通りです:
ディレクトリのアクセス可能性をチェックする。キャッシュ中の名前を検索し、見つかったなら、名前を返します。ディレクトリ中の名前を検索し、適切に found (見つかった) または notfound (見つからない) に進みます。
notfound(見つからない):
作成または名前の変更とパス名の終わりであるなら、
EJUSTRETURN を返し、利用可能なスロットに情報を残し、そうでなければ、
ENOENT を返します。
found (見つかった):
パスの終りで削除であるなら、削除を許可するための情報を返します。パスの終りで名前の変更であるなら、ターゲットの inode をロックして、名前の変更を許可するための情報を返します。終りでないなら、名前をキャッシュに追加します。終わりで作成でも削除でもないなら、名前をキャッシュに追加します。
ロック
ディレクトリ dvp は、(呼び出しの) 入口でロックされるべきです。エラー (注: 返り値 EJUSTRETURN は、エラーと見なされません) が検出されるなら、ロックされて返されます。そうでなければ、 LOCKPARENT と ISLASTCN の両方が cnp->cn_flags で指定されないなら、アンロックされません。エントリがディレクトリで見つけらるなら、ロックされて返されます。戻り値
構成要素が見つけられるなら、ファイルのロックされた vnode に設定する *vpp を 0 にして返されます。検索されている構成要素が "."であるなら、vnode には、ちょうど vref(9) で、追加された特別な参照があります。呼び出し側は、この場合、適切にロックを解放することに注意しなければなりません。構成要素が見つからず、操作が CREATE または RENAME であるなら、フラグ ISLASTCN が指定され、操作は、成功し、特別の返り値 EJUSTRETURN が返されます。そうでなければ、適切なエラーコードが返されます。
エラー
- [ ENOTDIR]
- vnode dvp がディレクトリを表わしていません。
- [ ENOENT]
- 構成要素 dvp が、このディレクトリに見つかりませんでした。
- [ EACCES]
- 指定された操作のためのアクセスが否定されました。
- [ EJUSTRETURN]
- CREATE または RENAME の操作が成功しました。
関連項目
vnode(9), VOP_ACCESS(9), VOP_CREATE(9), VOP_MKDIR(9), VOP_MKNOD(9), VOP_RENAME(9), VOP_SYMLINK(9)歴史
関数 VOP_LOOKUP は、 4.3BSD で登場しました。作者
このマニュアルページは、 ufs_lookup.c のコメントのいくつかのテキストとともに によって書かれました。November 24, 1997 | FreeBSD |