ソースコードリーディング: static void init_once(void *foo)

カーネルトリビア

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 カーネルと言えど「あれ、こんなんでいいのかな???」という変数名 やコメント(時にはジョーク) が混じっていたりして おおらかな気分になれる。他にもいろいろあった気がしたので、思い出したらここに書こう