EN JA
VOP_LOOKUP(9)
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 は、エラーと見なされません) が検出されるなら、ロックされて返されます。そうでなければ、 LOCKPARENTISLASTCN の両方が cnp->cn_flags で指定されないなら、アンロックされません。エントリがディレクトリで見つけらるなら、ロックされて返されます。

戻り値

構成要素が見つけられるなら、ファイルのロックされた vnode に設定する *vpp を 0 にして返されます。検索されている構成要素が "."であるなら、vnode には、ちょうど vref(9) で、追加された特別な参照があります。呼び出し側は、この場合、適切にロックを解放することに注意しなければなりません。

構成要素が見つからず、操作が CREATE または RENAME であるなら、フラグ ISLASTCN が指定され、操作は、成功し、特別の返り値 EJUSTRETURN が返されます。そうでなければ、適切なエラーコードが返されます。

エラー

[ ENOTDIR]
vnode dvp がディレクトリを表わしていません。
[ ENOENT]
構成要素 dvp が、このディレクトリに見つかりませんでした。
[ EACCES]
指定された操作のためのアクセスが否定されました。
[ EJUSTRETURN]
CREATE または RENAME の操作が成功しました。

歴史

関数 VOP_LOOKUP は、 4.3BSD で登場しました。

作者

このマニュアルページは、 ufs_lookup.c のコメントのいくつかのテキストとともに Doug Rabson によって書かれました。
November 24, 1997 FreeBSD