KERNEL_MOUNT(9) | FreeBSD Kernel Developer's Manual | KERNEL_MOUNT(9) |
名称
free_mntarg, kernel_mount, kernel_vmount, mount_arg, mount_argb, mount_argf, mount_argsu — カーネルマウントインタフェースの一部として提供された関数書式
voidfree_mntarg( struct mntarg *ma);
int
kernel_mount( struct mntarg *ma, int flags);
int
kernel_vmount( int flags, ...);
struct mntarg *
mount_arg( struct mntarg *ma, const char *name, const void *val, int len);
struct mntarg *
mount_argb( struct mntarg *ma, int flag, const char *name);
struct mntarg *
mount_argf( struct mntarg *ma, const char *name, const char *fmt, ...);
struct mntarg *
mount_argsu( struct mntarg *ma, const char *name, const void *val, int len);
解説
kernel_mount() 関数ファミリは、カーネルの中からファイルシステムをマウントするために使用されるマウント引数のリストを構築するための API としてとして提供されます。引数のリストを蓄積することによって、API は、 mount(8) ユーティリティを制御するためのカーネルに必要な情報を具体化して提供します。エラーが発生するとき、プロセスは停止します。これは panic(9) を引き起こしません。構造体のヘッダは、マウントプロセスを容易にするために自動構造体作成を許す src/sys/kern/vfs_mount.c に格納されています。メモリ割り付けは、全体のプロセスが完了するときに、常に解放されなければなりません、そうでなければ、それはエラーです。
free_mntarg() 関数は、 mntarg 構造体を解放するか、またはクリアするために使用されます。
kernel_mount() 関数は、与えられたファイルシステムでマウント要求を実行するために構造体から情報を取り出します。さらに、 kernel_mount() 関数は常に free_mntarg() 関数を呼び出します。 ma が構築の間に生成された任意のエラーコードを含んでいるなら、そのコードが呼び出され、ファイルシステムのマウントは試みられません。
kernel_vmount() はファイルシステムをマウントするために使用される printf(9) と同様の関数です。
mount_arg() 関数は、単純な引数を取って、様々なマウントオプションを考慮して構造体の一部分をうまく作ります。長さが 0 未満の値であるなら、 strlen(3) が使用されます。この引数は free_mntarg() または kernel_mount() のいずれかが呼び出されるまで、参照されます。
mount_argb() 関数は、構造体にブール値の引数を追加するために使用されます。 flag はブール値で、 name は“ no
”で始まらなければなりません、そうでなければ、パニックが起こります。
mount_argf() 関数は printf(9) スタイルの引数を現在の構造体に追加します。
mount_argsu() 関数は、ユーザランド文字列から構造に引数を追加します。
使用例
*_cmount() 関数の例:
static int msdosfs_cmount(struct mntarg *ma, void *data, int flags, struct thread *td) { struct msdosfs_args args; int error; if (data == NULL) return (EINVAL); error = copyin(data, &args, sizeof(args)); if (error) return (error); ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN); ma = mount_arg(ma, "export", &args.export, sizeof(args.export)); ma = mount_argf(ma, "uid", "%d", args.uid); ma = mount_argf(ma, "gid", "%d", args.gid); ma = mount_argf(ma, "mask", "%d", args.mask); ma = mount_argf(ma, "dirmask", "%d", args.dirmask); ma = mount_argb(ma, args.flags & MSDOSFSMNT_SHORTNAME, "noshortname"); ma = mount_argb(ma, args.flags & MSDOSFSMNT_LONGNAME, "nolongname"); ma = mount_argb(ma, !(args.flags & MSDOSFSMNT_NOWIN95), "nowin95"); ma = mount_argb(ma, args.flags & MSDOSFSMNT_KICONV, "nokiconv"); ma = mount_argsu(ma, "cs_win", args.cs_win, MAXCSLEN); ma = mount_argsu(ma, "cs_dos", args.cs_dos, MAXCSLEN); ma = mount_argsu(ma, "cs_local", args.cs_local, MAXCSLEN); error = kernel_mount(ma, flags); return (error); }
kernel_vmount() と共に動作しているとき、 varargs は組の形式でなければなりません、例えば、{ name, value}。
error = kernel_vmount( MNT_RDONLY, "fstype", vfsname, "fspath", "/", "from", path, NULL);
歴史
kernel_mount() 関数ファミリとこのマニュアルページは、 FreeBSD 6.0 ではじめて登場しました。作者
kernel_mount() 関数ファミリと API は、 <phk@FreeBSD.org>によって開発されました。このマニュアルページは、 <trhodes@FreeBSD.org>によって書かれました。December 13, 2004 | FreeBSD |