hash() 手続き
今、fs/block_dev.c に定義されている bdget() から呼び出される fs/inode.c に定義されている iget5_locked() 手続きを掘ろうとしている状態。
bdget() から呼び出されるのが以下な形。
inode = iget5_locked(bd_mnt->mnt_sb, hash(dev), bdev_test, bdev_set, &dev);
上記で呼び出されている hash() 手続きは block_dev.c の以下の hash() のはず。
static inline unsigned long hash(dev_t dev) { return MAJOR(dev)+MINOR(dev); }
で、その hash 値を受け取る iget5_locked() 手続きの定義の先頭部分が以下。
struct inode *iget5_locked(struct super_block *sb, unsigned long hashval, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *data) { struct hlist_head *head = inode_hashtable + hash(sb, hashval);
hlist_head なポインタを取得するのに使われている hash() 手続きは inode.c で定義されていて以下。
static inline unsigned long hash(struct super_block *sb, unsigned long hashval) { unsigned long tmp; tmp = (hashval * (unsigned long)sb) ^ (GOLDEN_RATIO_PRIME + hashval) / L1_CACHE_BYTES; tmp = tmp ^ ((tmp ^ GOLDEN_RATIO_PRIME) >> I_HASHBITS); return tmp & I_HASHMASK; }
32bits だと GOLDEN_RATIO_PRIME は以下な定義な模様。
/* 2^31 + 2^29 - 2^25 + 2^22 - 2^19 - 2^16 + 1 */ #define GOLDEN_RATIO_PRIME 0x9e370001UL
これ、どっかで見たな (何
今日は
色々と家がばたばたしてるんでこれで終わりッス (とほほほ