bad_inodeとは
なにげなくカーネルソースを眺めていると、bad_inode.cっていうのがあった。なんだろう?と開いてみると、
実inodeアロケート失敗でも、メモリーinodeはアロケートさせ(inode番号はlast_ino)、VFSにおいての一連の処理の中でエラー処理させているようである?
void make_bad_inode(struct inode *inode) { remove_inode_hash(inode); inode->i_mode = S_IFREG; inode->i_atime = inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb); inode->i_op = &bad_inode_ops; inode->i_fop = &bad_file_ops; }inodeハッシュテーブルから、該当するinodeのハッシュを削除して、nodeオペレーションにbad_inode_ops、ファイルオペレーションにbad_file_opsをセットしている。bad_inode_ops、bad_file_opsはすべてのメンバー名の関数を、エラーを返すだけの空の関数として定義してある。
static ssize_t bad_file_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos) { return -EIO; } static ssize_t bad_file_write(struct file *filp, const char __user *buf, size_t siz, loff_t *ppos) { return -EIO; }どんな場合に使うのだろうと、参照元を調べてみると、ext2のケースでは、ext2_new_inode関数のinodeアロケートで、実inodeが取得できなかった時にmake_bad_inodeが呼ばれるようである。
実inodeアロケート失敗でも、メモリーinodeはアロケートさせ(inode番号はlast_ino)、VFSにおいての一連の処理の中でエラー処理させているようである?