lookup_bdev() の核心

今から bd_acquire() 手続きを掘ります。気づきを以下にメモるかも。

bd_acquire() 手続き

渡された inode オブジェクトが指す i_bdev 属性が NULL ではなくって igrab() な手続きの戻りも NULL でなければ、i_bdev 属性を戻す模様。
igrab() 手続きに渡されるのは、block_device なオブジェクトを指す i_bdev 属性の bd_inode 属性。3rd Edition には

bdev ファイルシステムのブロック型デバイスに対応するファイルの i ノードへのポインタ


との説明がある。ちょっとややこしい。ただ、igrab() 手続きの核心は

	if (!(inode->i_state & I_FREEING))
		__iget(inode);

で、上記な条件が偽なケースでは NULL が戻ります。bd_aquire() 手続きで言うと以下なナニ。

	if (bdev && igrab(bdev->bd_inode)) {
		spin_unlock(&bdev_lock);
		return bdev;
	}

inode オブジェクトの i_state 属性とか I_FREEING ってマクロとか不明点多い。

i_state 属性については 3rd Edition 12.2.2 に詳細な説明あり。でも、I_FREEING な状態の説明が

i ノードオブジェクトの解放処理が行われている状態


とあるんですが、どーゆー意味なのか。

と、ゆーコトで

grep してみたんですが、fs/inode.c な模様。曰く

 * I_FREEING is set so that no-one will take a new reference to the inode while
 * it is being deleted.

との事。これは generic_delete_inode() 手続きなコメント。
あるいは __wait_on_freeint_inode() 手続きなコメントが以下。

	 * I_FREEING and I_CLEAR are cleared in process context under
	 * inode_lock, so we have to give the tasks who would clear them
	 * a chance to run and acquire inode_lock.

これ、状態遷移を確認したいですな。