資源簡(jiǎn)介
Linux操作系統(tǒng)下面的文件管理系統(tǒng)inode源碼inode.c的注釋
代碼片段和文件信息
/*
*?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?();??//關(guān)閉中斷
??while?(inode->i_lock)??//?如果i?節(jié)點(diǎn)已被鎖定
??sleep_on?(&inode->i_wait);??//?不可中斷的等待狀態(tài)?
??sti?();??//開中斷
}
////?對(duì)指定的i節(jié)點(diǎn)上鎖?鎖定指定的i節(jié)點(diǎn)
//?如果i節(jié)點(diǎn)已被鎖定?則將當(dāng)前任務(wù)置為不可中斷的等待狀態(tài)。直到該i節(jié)點(diǎn)解鎖?然后對(duì)其上鎖。
?? /*?對(duì)指定的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?();
}
?////?對(duì)指定的i節(jié)點(diǎn)解鎖
//?復(fù)位i節(jié)點(diǎn)的鎖定標(biāo)志并明確地喚醒等待此i節(jié)點(diǎn)的進(jìn)程。
??
/*?對(duì)指定的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則顯示出錯(cuò)警告
??????????printk?(“inode?in?use?on?removed?disk\n\r“);
????????inode->i_dev?=?inode->i_dirt?=?0;???//?釋放該i節(jié)點(diǎn)(置設(shè)備號(hào)為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);??????//?寫盤
????}
}
?? /*?釋放一個(gè)i?節(jié)點(diǎn)(從內(nèi)存數(shù)組回寫入設(shè)備文件)?*/
void?iput?(struct?m_inode?*inode)
{
??if?(!inode)
????return;
??wait_on_inode?(inode);????//?等待inode?節(jié)點(diǎn)解鎖(如果已上鎖的話)。
??if?(!inode->i_count)
????panic?(“iput:?trying?to?free?free?inode“);
??if?(inode->i_pipe)??//?管道i?節(jié)點(diǎn)
????{
??????wake_up?(&inode->i_wait);?//?喚醒等待該管道的進(jìn)程
??????if?(--inode->i_count)??//?引用次數(shù)減1?還有引用則返回
????return;
??//?釋放管道占用的內(nèi)存頁面
??????free_page?(inode->i_size);??//?復(fù)位該節(jié)點(diǎn)的引用計(jì)數(shù)值
??????inode->i_count?=?0;
??????inode->i_dirt?=?0;??//?已修改標(biāo)志
??????inode->i_pipe?=?0;??//?管道標(biāo)志
??????return;
????}
??if?(!inode->i_dev)??//?如果i?節(jié)點(diǎn)對(duì)應(yīng)的設(shè)備號(hào)0
????{
??????inode->i_count--;??//?此節(jié)點(diǎn)的引用計(jì)數(shù)遞減1
??????return;
????}
??if?(S_ISBL
評(píng)論
共有 條評(píng)論