日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

f2fs学习笔记 - 9. f2fs 写文件

發(fā)布時間:2023/12/31 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 f2fs学习笔记 - 9. f2fs 写文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.前言

本文主要介紹f2fs寫入流程. 寫入流程主要分為meta, data, node的寫入,本文主要介紹data的寫入流程。

2.總體流程

sys_writefdgetfile_pos_readvfs_writefile_pos_write
  • fdget是從當(dāng)前進程的文件描述符表獲取一個fd;

  • file_pos_read獲取文件描述符當(dāng)前的讀寫位置

  • vfs_write執(zhí)行文件寫入操作

  • file_pos_write更新文件的寫入位置

  • 3.vfs_write

    vfs_writerw_verify_areafile->f_op->write (do_sync_write)generic_file_aio_write__generic_file_aio_writegeneric_segment_checksgeneric_write_checksgeneric_file_direct_write或generic_file_buffered_write
  • sys_write系統(tǒng)調(diào)用會調(diào)用到vfs_write,進而調(diào)用到file->f_op->write,這個write回調(diào)是在創(chuàng)建文件時初始化為inode->i_fops->write, 對于f2fs就是do_sync_write,它會進一步調(diào)用generic_file_aio_write->__generic_file_aio_write

  • __generic_file_aio_write通過generic_segment_checks來檢查segment的數(shù)目和要寫入數(shù)據(jù)的數(shù)目進行必要的檢查,最終確定寫入文件的位置和數(shù)據(jù)的數(shù)目;之后通過generic_write_checks進一步對寫入文件的位置和數(shù)目進行檢查

  • 3.1 generic_file_direct_write

    generic_file_direct_writefilemap_write_and_wait_range(mapping, pos, pos + write_len - 1)do_writepages(mapping, &wbc)mapping->a_ops->writepages(mapping, wbc)generic_writepages(mapping, wbc)write_cache_pages(mapping, wbc, __writepage, mapping)

    對于直寫的情況將執(zhí)行g(shù)eneric_file_direct_write,它調(diào)用writepages回調(diào),對于f2fs為f2fs_write_data_pages,進而它會執(zhí)行g(shù)eneric_writepages,對于每一page都將調(diào)用 __writepage,實際上調(diào)用了mapping->a_ops->writepage(page, wbc)回調(diào),對于f2fs即為f2fs_write_data_page

    3.1.1 f2fs_write_data_page

    f2fs_write_data_pagedo_write_data_page(page)get_dnode_of_data(&dn, page->index, RDONLY_NODE)write_data_page(inode, page, &dn,old_blk_addr, &new_blk_addr);set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version)do_write_page(sbi, page, old_blkaddr,new_blkaddr, &sum, DATA)__add_sum_entry(sbi, type, sum, curseg->next_blkoff)__refresh_next_blkoff(sbi, curseg)refresh_sit_entry(sbi, old_blkaddr, *new_blkaddr)submit_write_page(sbi, page, *new_blkaddr, p_type)do_submit_bio(sbi, type, false)

    get_dnode_of_data:通過page->index查找dnode(直接node)中對應(yīng)的block地址,保存在dn->data_blkaddr中

    write_data_page:old_blk_addr為當(dāng)前要寫入的block的地址,new_blk_addr為下一個要寫入的block地址

    set_summary:由于要寫入數(shù)據(jù),需要更新current segment的summary, 此處是構(gòu)造新的segment summary entry.

    do_write_page: 執(zhí)行page寫入操作。
    __add_sum_entry:更新current segment中要寫入block的summary entry
    __refresh_next_blkoff: 更新current sgement的下一個block offset, 根據(jù)SSR(thread mode)和LFS模式有所不同;
    refresh_sit_entry:
    submit_write_page:通過調(diào)用do_submit_bio->submit_bio提交給block層

    3.2 .generic_file_buffered_write

    generic_file_buffered_writegeneric_perform_write(file, &i, pos)a_ops->write_beginiov_iter_copy_from_user_atomica_ops->write_endf2fs_set_data_page_dirty

    對于非直寫的情況將調(diào)用generic_file_buffered_write。它將調(diào)用generic_perform_write(file, &i, pos)執(zhí)行寫入操作

    f2fs_write_begin:a_ops->write_begin對應(yīng)f2fs就是f2fs_write_begin。通過f2fs_write_begin確定了要寫入的page對應(yīng)的磁盤block地址。

    iov_iter_copy_from_user_atomic:將用戶空間數(shù)據(jù)拷貝到page;

    a_ops->write_end->generic_write_end:當(dāng)用戶空間數(shù)據(jù)拷貝到page后,用作善后處理,標記頁面為最新且是臟頁,這樣在sync時就會將這些頁面寫入磁盤
    f2fs_set_data_page_dirty:在address space 中標記page為dirty

    總結(jié)

    以上是生活随笔為你收集整理的f2fs学习笔记 - 9. f2fs 写文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。