カーネル・トリビア
Linux カーネルのソース (CentOS7) を読んでいると、下記のようなコードを見つけた
static void init_once(void *foo) { struct socket_alloc *ei = (struct socket_alloc *)foo; inode_init_once(&ei->vfs_inode); }
変数名が foo とは ... 何とも適当ぽい。もうちょっと調べてみると他の箇所にもある
static void init_once(void *foo) { struct ext4_inode_info *ei = (struct ext4_inode_info *) foo; INIT_LIST_HEAD(&ei->i_orphan); init_rwsem(&ei->xattr_sem); init_rwsem(&ei->i_data_sem); init_rwsem(&ei->i_mmap_sem); inode_init_once(&ei->vfs_inode); }
GNU global でリストしてみると いろんなファイルシステムで同様の宣言が見られる
init_once 262 fs/adfs/super.c static void init_once(void *foo) init_once 127 fs/affs/super.c static void init_once(void *foo) init_once 298 fs/befs/linuxvfs.c static void init_once(void *foo) init_once 262 fs/bfs/inode.c static void init_once(void *foo) init_once 412 fs/block_dev.c static void init_once(void *foo) init_once 8670 fs/btrfs/inode.c static void init_once(void *foo) init_once 69 fs/coda/inode.c static void init_once(void *foo) init_once 80 fs/efs/super.c static void init_once(void *foo) init_once 183 fs/ext2/super.c static void init_once(void *foo) init_once 506 fs/ext3/super.c static void init_once(void *foo) init_once 936 fs/ext4/super.c static void init_once(void *foo) init_once 72 fs/f2fs/super.c static void init_once(void *foo) init_once 40 fs/fat/cache.c static void init_once(void *foo) init_once 594 fs/fat/inode.c static void init_once(void *foo) init_once 192 fs/hpfs/super.c static void init_once(void *foo) init_once 711 fs/hugetlbfs/inode.c static void init_once(void *foo) init_once 383 fs/inode.c static void init_once(void *foo) init_once 89 fs/isofs/inode.c static void init_once(void *foo) init_once 186 fs/jfs/jfs_metapage.c static void init_once(void *foo) init_once 860 fs/jfs/super.c static void init_once(void *foo) init_once 82 fs/minix/inode.c static void init_once(void *foo) init_once 70 fs/ncpfs/inode.c static void init_once(void *foo) init_once 1832 fs/nfs/inode.c static void init_once(void *foo) init_once 94 fs/proc/inode.c static void init_once(void *foo) init_once 373 fs/qnx4/inode.c static void init_once(void *foo) init_once 633 fs/qnx6/inode.c static void init_once(void *foo) init_once 589 fs/reiserfs/super.c static void init_once(void *foo) init_once 408 fs/squashfs/super.c static void init_once(void *foo) init_once 332 fs/sysv/inode.c static void init_once(void *p) init_once 155 fs/udf/super.c static void init_once(void *foo) init_once 1449 fs/ufs/super.c static void init_once(void *foo) init_once 346 ipc/mqueue.c static void init_once(void *foo) init_once 282 net/socket.c static void init_once(void *foo) init_once 1495 net/sunrpc/rpc_pipe.c init_once(void *foo) init_once 148 security/integrity/iint.c static void init_once(void *foo)
static void init_once(void *foo)
は kmem_cache_create() に渡す関数ポインタとして利用されていて、みな同じ宣言になっている。
所謂 foo bar の foo なんだろうけど、他になんか意味があるのかなぁ ... とか勘ぐりを入れてしまう。ただ単に最初にコミットされたコードが そのまま伝染しているのかもしれない。いや、やっぱり foo は構成員のみが知り得る特殊な暗号としての意味が潜んでいて ... (考え過ぎ)
Linux カーネルと言えど「あれ、こんなんでいいのかな???」という変数名 やコメント(時にはジョーク) が混じっていたりして おおらかな気分になれる。他にもいろいろあった気がしたので、思い出したらここに書こう