[問題] 請問linux文件系統(ext2)
恩,老師要求做一個ext2 fs的修改版,具體要求是modify the ext2 fs to include c
hecksuming on a per block basis,就是說對于文件系統的每個指針,都增加一個chec
ksum域。在寫一個block的時候,同時計算其checksum并寫入,在讀一個block的時候,
計算其checksum并與預存的checksum比較,如不符合即報錯。
可憐我以前從沒碰過linux內核的代碼,看到一堆函數指來指去調來調去腦袋都大了...
所以做到一半實在做不下去了,上來求教一個方向...
我現在已經做了的:在inode以及indirect block里添加存儲checksum的域(我把它放在
每個指針的后面,占用一個__le32的空間。現在看來并不是很好的實現,不過what's d
one is done…),并修改ext2 fs里順序查找block的方式(ext2_get_branch, ext2_al
loc_branch, ext2_splice_branch等等函數)。這部分已經編譯通過,好像沒啥大問題
。。。
我現在需要做的:修改ext2的read,write函數,以實現讀時比較checksum,寫時寫入c
hecksum的功能。
我的問題是,應該是在哪里修改呢?
我目前有兩個選擇:一個是在從page cache讀或寫文件的時候實現checksuming,也就是
說,修改file->f_op->aio_read, file->f_op->aio_write(這里其實應該是 address_
space->a_ops->write_end()才對),等等。這個的好處在于,實現起來比較簡單。比較
容易由要讀要寫的file range推出要讀/寫的block在文件中的邏輯編號(其實也還是挺
麻煩,因為這里傳遞的參數是iocb或者直接就是mapping之類的,還需要我自己遍歷這個
address space里所有的page,get buffer才能得到其在文件中的相對positon?)。其壞
處,一是每讀/寫一次page cache就需要計算checksum一次,開銷太大;二是讀寫文件的
地方實在是太分散了….有普通文件的aio_read/write, 有nobh的read,write,有mappin
g, 有direct I/0, 還有目錄,符號鏈接的讀寫。。。我實在沒有這個勇氣和信心把它們
一一找出來,修改對……
另一個選擇就是在從硬盤中讀/把寫commit到硬盤的時候再進行checksuming。這個的好
處是比較明顯了,但是壞處也有。其一,這個讀寫硬盤的操作好像也挺分散的…..我目
前研究代碼的結果是普通文件的寫以及后臺的把page cache刷到硬盤的操作好像都調用
到ext2_writepage了….(ext2_writepages會調用__mpage_writepage, 而__mpage_writ
epage在該文件是ext2文件的情況下,是會調用ext2_writepage,而不是直接submit bio
,是吧?)但是nobh的,direct I/0的等等,是不是最終都會調用到ext2_writepage還
不清楚…….求高人指點…. 其二,如此底層的函數有的時候參數只有一個bio….從這里
出發得到讀寫內容在文件中的相對位置以確定把checksum往哪里寫太不直接…..最后是
好像有的文件操作直接調用的是ll_rw_block????(比如說simple_fsync) 根本就跳過了
ext2_fs嘛! 這個叫我怎么辦?
恩,問題很多,請大家不吝指點:)
p.s 話說generic_file_sync,先調了write_and_wait_range刷新,然后調simple_fsync
刷新,然后再調sync_inode刷新….請問有什么必要如此冗余呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 128.141.48.32
→
08/19 13:02, , 1F
08/19 13:02, 1F
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章