FreeBSD の mount の仕組み ― 2006年07月30日 10時47分44秒
mount.h を覗く。
struct vfsops {
vfs_mount_t *vfs_mount;
vfs_cmount_t *vfs_cmount;
vfs_unmount_t *vfs_unmount;
vfs_root_t *vfs_root;
vfs_quotactl_t *vfs_quotactl;
vfs_statfs_t *vfs_statfs;
vfs_sync_t *vfs_sync;
vfs_vget_t *vfs_vget;
vfs_fhtovp_t *vfs_fhtovp;
vfs_checkexp_t *vfs_checkexp;
vfs_vptofh_t *vfs_vptofh;
vfs_init_t *vfs_init;
vfs_uninit_t *vfs_uninit;
vfs_extattrctl_t *vfs_extattrctl;
vfs_sysctl_t *vfs_sysctl;
};
各種操作時に、これらの関数が呼ばれる。異なったファイルシステムでも、統一された入口を持つのでカーネル側は、どの様なファイルシステムを操作しているのかを、認知する必要がない。
smbfs では以下のように定義されている。smbfs 用の構造体の初期値だ。
static struct vfsops smbfs_vfsops = {
.vfs_init = smbfs_init,
.vfs_cmount = smbfs_cmount,
.vfs_mount = smbfs_mount,
.vfs_quotactl = smbfs_quotactl,
.vfs_root = smbfs_root,
.vfs_statfs = smbfs_statfs,
.vfs_sync = vfs_stdsync,
.vfs_uninit = smbfs_uninit,
.vfs_unmount = smbfs_unmount,
};
vfs_init は、ファイルシステムに読み込まれた時に実行されるようだ。kldload や mount_smbfs をやると、実行されているのがわかる。それに対応するのが、vfs_uninit だ。kldunload や shutdown する時に実行される。init はそのファイルシステムを使うにあたって必要な情報を初期化しているようだ。smbfs_init は大したことをしてはいない。
mount が実行されるときは、二段階の様だ。まず、vfs_mount が mount を実行された初期の段階で呼ばれて、その後に vfs_cmount が呼ばれるみたいである。
次回。
最近のコメント