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

これ、どっかで見たな (何

今日は

色々と家がばたばたしてるんでこれで終わりッス (とほほほ