GETVFSENT(3)

名称
getvfsent, setvfsent, endvfsent, vfsisloadable, vfsload - 仮想ファイルシステムモジュールを管理

書式
#include <sys/param.h> #include <sys/mount.h> struct ovfsconf * getvfsent(void) void setvfsent(int cachelist) void endvfsent(void) int vfsisloadable(const char *name) int vfsload(const char *name)

解説
getvfsent() 関数によって、カーネルが管理する仮想ファイルシステムモジュール の実装リストに、簡単にアクセスできます。リストのファイルシステムを 1 回に 1 つづつ段階的に処理します。利用できるデータがそれ以上なくなると、 null ポインタが返ります。構造体 “struct ovfsconf” のフィールドは次のとおりです。

vfc_name
    ファイルシステムの名前。
vfc_index
    カーネルによって割り当てられ mount(2) の呼び出しに使用された、ファイルシステムのタイプ番号。
vfc_refcount
    このファイルシステムの参照数 (通常は実装数ですが、 アンロードできないファイルシステム、または静的にこのカーネルにリンク されているファイルシステムなどがあると、実装数を上回ります) 。
vfc_flags
    現在なにも定義されていないフラグビット。

setvfsent() および endvfsent() 関数は、 sysctl(3) のよってカーネル からまとめて取得されるファイルシステムリストの、キャッシング制御に 使用されます。 setvfsent() の cachelist パラメータがゼロでなければ、これら 検索関数のどれかを最初に呼び出した時点でリストはただ 1 回だけ取り出され、 キャッシュをクリアするために endvfsent() が呼び出されるまで保持されます。 一般に setvfsent(1) は、 getvfsent() を使用するプログラムによって呼び出される必要があり、 setvfsent(0) は (これもデフォルトの状態で) 、 vfsload() 関数を使用するプログラムによって呼び出される必要があります。

vfsisloadable() 関数は、後で vfsload(name) の呼び出しが続きそうだと非ゼロ値を返します。ここで 「そう」と言うのは、 vfsisloadable() によってチェックされる条件だけが、 vfsload() が後続するために必要な条件の小さな サブセットだからです。詳しく説明すれば、 vfsisloadable() は /dev/lkm が 存在するか、書き込みのためにオープンできるか、また LKM (ロード可能カーネルモジュール) 用に指定したディレクトリの 1 つで、 ~name_mod.o が 見付かるかなどをチェックします。

vfsload() 関数は、ファイルシステム name の実装カーネルモジュールをロード しようと試みます。ファイルシステムモジュールを無事に突き止めてロードした 場合はゼロが、その他の場合は非ゼロが返ります。この関数を呼び出せるのは次に 示す状況だけです。

1.  getvfsbyname() を呼び出して非ゼロ値が返った場合。

2.  vfsisloadable() を呼び出して非ゼロ値が返った場合。

3.  十分な一時ファイル空間が利用でき、 ${TMPDIR} の /var/tmp または /tmp の 1 つに 書き込みもできる場合。

mount_cd9660(8) のソースから取った使用例を次に示します。

    struct vfsconf *vfc;
    int error;
    /* ここにセットアップコードが入る */
    error = getvfsbyname("cd9660", &vfc);
    if (error && vfsisloadable("cd9660")) {
    	if (vfsload("cd9660"))
    		err(EX_OSERR, "vfsload(cd9660)");
    	endvfsent();	/* flush cache */
    	error = getvfsbyname("cd9660", &vfc);
    }
    if (error)
    	errx(1, "cd9660 filesystem is not available");
    if (mount(vfc.vfc_name, dir, mntflags, &args) < 0)
    	err(1, NULL);

戻り値
getvfsent() ルーチンは、成功すると静的データ構造体のポインタを、失敗すると null ポインタを返します。原因が sysctl(3) または malloc(3) で失敗した場合は、 errno がそれら関数用にドキュメントされた値の 1 つに 設定されることがあります。その他の場合 errno は改変されません。

vfsload() 関数は失敗すると非ゼロ値を、成功するとゼロを返します。 vfsload() が失敗した場合、 errno がフォーク fork(2) 、 waitpid(2) 、 chdir(2) 、 または execlp(3) 用としてドキュメントされた値の 1 つに設定されるか、または、 現在特に有用ではないにしても結局は便利な modload(8) プログラムの、 ステータスを返す可能性があります。さらに、もし modload(8) がシグナルで終了した場合、 vfsload() は失敗し errno を EINVAL に設定します。

環境変数
TMPDIR
    vfsload() に代わって modload(8) によって作成された一時ファイルの位置。
LKMDIR
    ロード可能モジュールを検索する vfsisloadable() および vfsload() 用の代替ディレクトリ。

関連項目
mount(2) 、 modload(8) 、 mount(8)

バグ
modload(8) コマンドの戻り値は、 errno 値として解釈する場合 (もっと言えば、ほかのどんなものとして解釈する場合も)、 特に有用ではありません。

作者
このロード可能ファイルシステムサポートは、 Terry Lambert による汎用のロード可能カーネルモジュールサポートをベースに、 Garrett A. Wollman によって書かれました。

歴史
getvfsent() 関数ファミリは FreeBSD 2.0 で最初に取り入れられました。