ログ日記

作業ログと日記とメモ

データ書き込みの流れ

メモ

  1. sys_write()
    • fs/read_write.c
    • struct fileと現在のファイルポインタが指している位置を取得してvfs_write()を呼び出す
  2. vfs_write()
    • fs/read_write.c
    • 操作関するチェックをしてfile_operationsのwrite()を呼び出す
  3. generic_file_write()
    • mm/filemap.c
    • デフォルトのファイル書き込み操作関数
    • struct i_node を取得、ロックしてgeneric_file_write_nolock()を呼び出す
  4. generic_file_write_nolock()
    • mm/filemap.c
    • struct kiocbを初期化してgeneric_file_aio_write_nolock()を呼び出す
  5. generic_file_aio_write_nolock()
    • mm/filemap.c
    • O_DIRECTが指定されていない場合
      1. 書き込む長さをcount変数に入れる
      2. struct address_space_operatoinsのprepare_write()を呼び出す
      3. filemap_copy_from_user()を呼び出す
      4. struct address_space_operatoinsのcommit_write()を呼び出す
      5. count -= 書き込まれた長さ
      6. countが0になるまで繰り返し
  1. mpage_writepages()
    • fs/mpage.c
    • pagevec_lookup_tag()を呼び出しstruct pageを取得する
  2. struct address_space_operationsのwritepage()を呼び出す