Show page source of internal22-151-デバイスファイル作成と削除 #25491

[[PageNavi(internal22-navi)]]

{{{ comment
h2w-title:デバイスファイル作成と削除
}}}
 

= デバイスファイル作成と削除 = #SECTION0310140000000000000000

デバイスファイルは、iノードがデバイスファイル属性を持つことと、データブロックを持たない(通常のファイルシステムではだが)ことを除けば、通常ファイルと同じである。

デバイスファイルの作成は、vfs sys_mknod(do_mknod)関数においてlookup_dentry関数を用いてファイルを登録する親ディレクトリのiノードを求めた後、そのiノードのmknodオペレーションを呼び出すことにより実現されている。ext2ファイルシステムでは、ext_mknod関数が呼び出される。(正確には、mknod処理のパラメータで、デバイス以外に 通常ファイルやパイプも生成可能である)

{{{
   ext2_mknod(親ディレクトリのiノード, 登録するdentry)
      フリーiノードを一つ確保(ext2_new_inode関数)
      iノードの初期化
      このiノードを親ディレクトリに登録(ext2_add_entry関数)
      ディレクトリエントリに、このファイルのiノード番号を書き込む
      switch(ファイルタイプ)
        case 通常ファイル:
           iノードに通常ファイル用のiノードオペレーションテーブル登録
        case キャラクタデバイス:
           iノードにキャラクタデバイス用のiノードオペレーションテーブル登録
        case ブロックデバイス:
           iノードにブロックデバイス用のiノードオペレーションテーブル登録
        case パイプ:
           iノードにパイプファイル用のiノードオペレーションテーブル登録(init_fifo関数)
      ◇iノードの遅延書き込み要求(mark_inode_dirty関数)
      ◇ディレクトリブロックの遅延書き込み要求(mark_buffer_dirty関数)
      if(SYNC属性 ?) {
          ◆ディレクトリブロックの書き込み(ll_rw_block関数, wait_on_buffer関数)
      }
      新規作成したファイルのdentryとiノードをリンク(d_instantiate関数)
      ディレクトリブロック用のバッファ解放(brelse関数)
}}}

デバイスファイルの削除は、通常ファイルと同じくunlink処理で行われる。処理手順は全く同じである。

'''問題点'''

  1.  SYNCモードでマウントの場合でも、初期化したiノードの	同期書き込みが行われておらず、	ゴミのiノードがディレクトリに登録されるタイミングがある。	システムクラッシュによりDUPブロックが発生する可能性がある。

----

''(NIS)HirokazuTakahashi [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1

[[PageNavi(internal22-navi)]]