Linux(vfs)
iノード操作関数テーブル
ファイルオープン時にinodeとファイルテーブルに設定される
struct inode_operations {
メンバ | 2.4 | 2.6 | 説明 | |
create | ○ | ○ | ファイルを作成する | |
lookup | ○ | ○ | 名前からiノードを取得/検索する | |
link | ○ | ○ | ハードリンクファイルを作成する | |
unlink | ○ | ○ | ファイルのアンリンク(削除)を行う | |
symlink | ○ | ○ | シンボリックリンクファイルを作成する | |
mkdir | ○ | ○ | ディレクトリを作成する | |
rmdir | ○ | ○ | ディレクトリを削除する | |
mknod | ○ | ○ | スペシャルデバイスファイルやPIPEを作成する | |
rename | ○ | ○ | ファイル/ディレクトリの名前を変更する | |
readlink | ○ | ○ | シンボリックリンクファイルのパス情報を読み込む | |
follow_link | ○ | ○ | シンボリックリンクが指すパス名を解決する | |
put_link | × | ○ | シンボリックリンクのページ解放 | |
truncate | ○ | ○ | ファイルサイズを変更する(切り詰める) | |
permission | ○ | ○ | ACL動作 | |
revalidate | ○ | × | メタデータの更新(kernel2.6ではgetattrの延長で呼ぶ) | |
setattr | ○ | ○ | iノードのデータ(メタデータ)を更新する(通称setmeta)属性変更等 | |
getattr | ○ | ○ | iノードのデータ(メタデータ)を最新状態とする(通称getmeta) | |
setxattr | × | ○ | 拡張属性設定(SELinux等で使用) | |
getxattr | × | ○ | 拡張属性取得(SELinux等で使用) | |
listxattr | × | ○ | 拡張属性取得(SELinux等で使用) | |
removexattr | × | ○ | 拡張属性削除(SELinux等で使用) |
};
一度利用したinodeは、ハッシュ構造でキャッシュしている。
inodeの更新は遅延書き込みで実現されている。 ディスクに未反映のiノードは
Dirtyの印がつけられた上でスーパブロックのdirtyリストにリンクされる。
(kupdateデーモン、sync/umount処理などでフラッシュ)
ディスクに反映済みのinodeは、inode_in_useリストにリンクされる。
利用されていないinodeはフリーリストinode_unusedにリンクされる。
ハッシュとフリーリストの両方に継っているという状態は存在しない。
複数のプロセスから、同時一つのファイルへの更新を排他するため、inodeにロック用のセマフォ(i_sem/i_zombie)がある。
以下の処理でinodeをロック(down)する。
複数ロックする際は、アドレス順でロックを行う。double_down(s1,s2)
・ページキャッシュ経由でのファイルへの書き込み ・ファイルのトランケート ・パス名の検索処理中のディレクトリ ・各種ファイル作成/削除/リンク時の親ディレクトリ ・ディレクトリ削除時の対象ディレクトリと親ディレクトリ ・ファイルrename時の移動元の親ディレクトリと移動先の親ディレクトリ ディレクトリの場合はさらにターゲットディレクトリも同時にロック ・fsyncシステムコール
ファイルのread処理ではiノードのロックを行わないので、ファイルへのwrite処中でもファイルからのread処理が行える。
※休憩( ・∀・)つ旦~