資源簡介
linux內(nèi)核系統(tǒng)下的ROMFS文件系統(tǒng)代碼(inode.c)即節(jié)點(diǎn)部分的注釋
代碼片段和文件信息
/*?
*?linux/fs/inode.c?
*?
*?(C)?1991?Linus?Torvalds?
*/??
??
#include??????//?字符串頭文件。主要定義了一些有關(guān)字符串操作的嵌入函數(shù)。???
#include????????//?文件狀態(tài)頭文件。含有文件或文件系統(tǒng)狀態(tài)結(jié)構(gòu)stat{}和常量。???
??
#include?????//?調(diào)度程序頭文件,定義了任務(wù)結(jié)構(gòu)task_struct、初始任務(wù)0?的數(shù)據(jù),???
//?還有一些有關(guān)描述符參數(shù)設(shè)置和獲取的嵌入式匯編函數(shù)宏語句。???
#include????//?內(nèi)核頭文件。含有一些內(nèi)核常用函數(shù)的原形定義。???
#include????????//?內(nèi)存管理頭文件。含有頁面大小定義和一些頁面釋放函數(shù)原型。???
#include??????//?系統(tǒng)頭文件。定義了設(shè)置或修改描述符/中斷門等的嵌入式匯編宏。???
??
struct?m_inode?inode_table[NR_INODE]?=?{?{0}?};???//?內(nèi)存中i?節(jié)點(diǎn)表(NR_INODE=32?項(xiàng))。???
??
static?void?read_inode?(struct?m_inode?*inode);??
static?void?write_inode?(struct?m_inode?*inode);??
?? /*?等待指定的i?節(jié)點(diǎn)可用?*/
//?如果i節(jié)點(diǎn)已被鎖定則將當(dāng)前任務(wù)置為不可中斷的等待狀態(tài)。直到該i節(jié)點(diǎn)解鎖
static?inline?void?wait_on_inode?(struct?m_inode?*inode)??
{??
??cli?();??
??while?(inode->i_lock)??//?如果i?節(jié)點(diǎn)已被鎖定
????sleep_on?(&inode->i_wait);??//?不可中斷的等待狀態(tài)?
??sti?();??
}???
////?對指定的i節(jié)點(diǎn)上鎖鎖定指定的i節(jié)點(diǎn)???
//?如果i節(jié)點(diǎn)已被鎖定則將當(dāng)前任務(wù)置為不可中斷的等待狀態(tài)。直到該i節(jié)點(diǎn)解鎖然后對其上鎖。
?? /*?對指定的i?節(jié)點(diǎn)上鎖?*/
static?inline?void?lock_inode?(struct?m_inode?*inode)??
{??
??cli?();??
??while?(inode->i_lock)??
????sleep_on?(&inode->i_wait);??
??inode->i_lock?=?1;?????//?置鎖定標(biāo)志。???
??sti?();??
}??
?////?對指定的i節(jié)點(diǎn)解鎖????
//?復(fù)位i節(jié)點(diǎn)的鎖定標(biāo)志并明確地喚醒等待此i節(jié)點(diǎn)的進(jìn)程。
?? /*?對指定的i?節(jié)點(diǎn)解鎖?*/
static?inline?void?unlock_inode?(struct?m_inode?*inode)??
{??
??inode->i_lock?=?0;??//?復(fù)位i?節(jié)點(diǎn)的鎖定標(biāo)志
??wake_up?(&inode->i_wait);??//?喚醒等待此i?節(jié)點(diǎn)的進(jìn)程
}?????
////?釋放內(nèi)存中設(shè)備dev的所有i節(jié)點(diǎn)。?????
//?掃描內(nèi)存中的i節(jié)點(diǎn)表數(shù)組如果是指定設(shè)備使用的i節(jié)點(diǎn)就釋放之。
?? /*?釋放內(nèi)存中設(shè)備dev?的所有i?節(jié)點(diǎn)?*/
void?invalidate_inodes?(int?dev)??
{??
??int?i;??
??struct?m_inode?*inode;??
??
??inode?=?0?+?inode_table;????//?讓指針首先指向i節(jié)點(diǎn)表指針數(shù)組首項(xiàng)
??for?(i?=?0;?i?????{?????????????????
??????wait_on_inode?(inode);?????//?等待該i節(jié)點(diǎn)可用(解鎖)?
??????if?(inode->i_dev?==?dev)???//?如果是指定設(shè)備的i節(jié)點(diǎn)則?
????{???????????
??????if?(inode->i_count)???????//?如果其引用數(shù)不為0則顯示出錯警告
????????printk?(“inode?in?use?on?removed?disk\n\r“);??
??????inode->i_dev?=?inode->i_dirt?=?0;???//?釋放該i節(jié)點(diǎn)(置設(shè)備號為0等)
????}??
????}??
}??
????////?同步所有i節(jié)點(diǎn)。?????//?同步內(nèi)存與設(shè)備上的所有i節(jié)點(diǎn)信息。
?? /*?同步內(nèi)存(inode數(shù)組)與設(shè)備上的所有i?節(jié)點(diǎn)信息?*/
void?sync_inodes?(void)??
{??
??int?i;??
??struct?m_inode?*inode;??
??
??inode?=?0?+?inode_table;?????//?讓指針首先指向i節(jié)點(diǎn)表指針數(shù)組首項(xiàng)
??for?(i?=?0;?i?????{??????????????
??????wait_on_inode?(inode);???????//?等待該i節(jié)點(diǎn)可用(解鎖)?
??????if?(inode->i_dirt?&&?!inode->i_pipe)??//?如果該i節(jié)點(diǎn)已修改且不是管道節(jié)點(diǎn)
????write_inode?(inode);??????//?寫盤
????}??
}??
?////?塊映射處理操作。(block位圖處理函數(shù)bmap?-?block?map)????
//?參數(shù)inode?-?i節(jié)點(diǎn)指針block?-?數(shù)據(jù)塊號create?-?創(chuàng)建標(biāo)志????
//?如果創(chuàng)建標(biāo)志置位則在對應(yīng)邏輯塊不存在時就申請新磁盤塊????
//?返回block數(shù)據(jù)塊對應(yīng)在設(shè)備上的邏輯塊號
???/*?文件數(shù)據(jù)塊映射到盤塊的處理操作,可能需要建立新的邏輯塊?*/
static?int?_bmap?(struct?m_inode?*inode?int?block?int?create)??
{???//?inode?文件的i?節(jié)點(diǎn);block?(相對于文件而言)文件中的數(shù)據(jù)塊號;create?創(chuàng)建標(biāo)志?
//?block是相對于文件而言,但是i_zone[block]則是相對于設(shè)備而言的。相對于文件的?
//?block可能不止i_zone數(shù)組大小,所以如果block的值大于7時,需要使用間接來尋址。?
//?如
評論
共有 條評論