Show page source of internal24-134-ファイルの生成 #25235

[[PageNavi(internal24-navi)]]

{{{ comment
h2w-title:ファイルの生成
}}}
 

= ファイルの生成 = #SECTION031020000000000000000

creatシステムコールまたはopenシステムコールにおいてO_CREATが指定された場合、 open_namei()関数がパス検索に失敗した場合、指定されたパス名を持つファイルの生成を試みる。ファイルの生成は、親ディレクトリのiノードのcreateオペレーションを呼び出すことにより実現されている。

ext2ファイルシステムの場合は、 ext2_create関数が呼び出される。

{{{
   ext2_create(親ディレクトリのiノード, 登録するdentry)
      フリーiノードを一つ確保(ext2_new_inode関数)
      iノードの初期化
         (ファイル操作テーブルとして、ext2_file_inode_operations,
          ext2_file_operations, ext2_aopsを登録する)
      ◇iノードの遅延書き込み要求(mark_inode_dirty関数)
      このiノードを親ディレクトリに登録(ext2_add_entry関数)
      新規作成したファイルのdentryとiノードをリンク(d_instantiate関数)
}}}

下に簡単な図で動作を示す。◆は同期書き込み、◇は遅延書き込み、◆と◇の横に書いてある番号は、処理順序を表している。

 [[Embed(internal24-images:img45.gif)]]
 

'''問題点'''

  1.  SYNCモードのマウント時であっても、初期化を行ったiノードの	更新は、遅延書き込みとなっている。つまり、ディスク上では	初期化されていないiノードがディレクトリに登録されるという	状態が発生する。 このタイミングでシステムがクラッシュすると、一世代前の削除された	筈のiノード情報を参照してしまい、DUPブロックを発生してしまう。
  1.  ディレクトリブロックの拡張が発生した場合、 SYNCモードであってもディレクトリのiノードの書き込みが 同期的に行われていない。つまりディスク上ではディレクトリサイズが 変更されていないタイミングが存在することになる。 このタイミングでシステムがクラッシュすると、ディレクトリの	この拡張ブロック部分に登録したファイルが参照できなることを	意味している。(見えなくなるだけで、DUPブロックは発生しない)

----

''(NIS)HirokazuTakahashi [[BR]]2000年12月09日 (土) 23時55分06秒 JST''1

[[PageNavi(internal24-navi)]]