vop_vector2006年07月31日 14時27分19秒

vfsops はファイルシステムへの操作であった。違う言い方をすれば、mount や umount など root が行なう操作である。

ファイルシステムがマウントされると、そこに保存されているファイルやディレクトリ等が操作出来るようになる。UFS の場合は、/usr/src/sys/ufs/ufs_vnops.c にまとめられている。


/* Global vfs data structures for ufs. */
struct vop_vector ufs_vnodeops = {
        .vop_default =          &default_vnodeops,
        .vop_fsync =            VOP_PANIC,
        .vop_read =             VOP_PANIC,
        .vop_reallocblks =      VOP_PANIC,
        .vop_write =            VOP_PANIC,
        .vop_access =           ufs_access,
        .vop_advlock =          ufs_advlock,
        .vop_bmap =             ufs_bmap,
        .vop_cachedlookup =     ufs_lookup,
        .vop_close =            ufs_close,
        .vop_create =           ufs_create,
        .vop_getattr =          ufs_getattr,
        .vop_inactive =         ufs_inactive,
        .vop_link =             ufs_link,
        .vop_lookup =           vfs_cache_lookup,
...

実は、vop_vector をヘッダファイルの中を探したのだが見つからなかった。find -name '*.h' をやっていたのだが。不思議に思い、もう一度 find を試したところ見つかった。自動生成していたらしい。

/usr/src/sys/tools/vnode_if.awk が使われて、/usr/obj/usr/src/sys/GENERIC/vnode_if.h などと作られるらしい。さらに、vop_vector 自体は vnode_if_typedef.h の中で定義されている。

smbfs 用には /usr/src/sys/fs/smbfs_vnops.c に以下のように定義されている。


struct vop_vector smbfs_vnodeops = {
        .vop_default =          &default_vnodeops,

        .vop_access =           smbfs_access,
        .vop_advlock =          smbfs_advlock,
        .vop_close =            smbfs_close,
        .vop_create =           smbfs_create,
        .vop_fsync =            smbfs_fsync,
...

これらの関数を通して、ファイルやディレクトリにたどり着けるわけだ。

前回次回