资源简介
Linux操作系统下面的文件管理系统inode源码inode.c的注释
代码片段和文件信息
/*
* linux/fs/inode.c
*
* (C) 1991 Linus Torvalds
*/
#include // 字符串头文件。主要定义了一些有关字符串操作的嵌入函数。
#include // 文件状态头文件。含有文件或文件系统状态结构stat{}和常量。
#include // 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,
// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。
#include // 内核头文件。含有一些内核常用函数的原形定义。
#include // 内存管理头文件。含有页面大小定义和一些页面释放函数原型。
#include // 系统头文件。定义了设置或修改描述符/中断门等的嵌入式汇编宏。
struct m_inode inode_table[NR_INODE] = { {0} }; // 内存中i 节点表(NR_INODE=32 项)。
static void read_inode (struct m_inode *inode);
static void write_inode (struct m_inode *inode);
/* 等待指定的i 节点可用 */
// 如果i节点已被锁定 则将当前任务置为不可中断的等待状态。直到该i节点解锁
static inline void wait_on_inode (struct m_inode *inode)
{
cli (); //关闭中断
while (inode->i_lock) // 如果i 节点已被锁定
sleep_on (&inode->i_wait); // 不可中断的等待状态
sti (); //开中断
}
//// 对指定的i节点上锁 锁定指定的i节点
// 如果i节点已被锁定 则将当前任务置为不可中断的等待状态。直到该i节点解锁 然后对其上锁。
/* 对指定的i 节点上锁 */
static inline void lock_inode (struct m_inode *inode)
{
cli ();
while (inode->i_lock)
sleep_on (&inode->i_wait);
inode->i_lock = 1; // 置锁定标志。
sti ();
}
//// 对指定的i节点解锁
// 复位i节点的锁定标志并明确地唤醒等待此i节点的进程。
/* 对指定的i 节点解锁 */
static inline void unlock_inode (struct m_inode *inode)
{
inode->i_lock = 0; // 复位i 节点的锁定标志
wake_up (&inode->i_wait); // 唤醒等待此i 节点的进程
}
//// 释放内存中设备dev的所有i节点。
// 扫描内存中的i节点表数组如果是指定设备使用的i节点就释放之。
/* 释放内存中设备dev 的所有i 节点 */
void invalidate_inodes (int dev)
{
int i;
struct m_inode *inode;
inode = 0 + inode_table; // 让指针首先指向i节点表指针数组首项
for (i = 0; i < NR_INODE; i++ inode++) // 扫描i节点表指针数组中的所有i节点
{
wait_on_inode (inode); // 等待该i节点可用(解锁)
if (inode->i_dev == dev) // 如果是指定设备的i节点则
{
if (inode->i_count) // 如果其引用数不为0则显示出错警告
printk (“inode in use on removed disk\n\r“);
inode->i_dev = inode->i_dirt = 0; // 释放该i节点(置设备号为0等)
}
}
}
//// 同步所有i节点。 // 同步内存与设备上的所有i节点信息。
/* 同步内存(inode数组)与设备上的所有i 节点信息 */
void sync_inodes (void)
{
int i;
struct m_inode *inode;
inode = 0 + inode_table; // 让指针首先指向i节点表指针数组首项
for (i = 0; i < NR_INODE; i++ inode++) // 扫描i节点表指针数组
{
wait_on_inode (inode); // 等待该i节点可用(解锁)
if (inode->i_dirt && !inode->i_pipe) // 如果该i节点已修改且不是管道节点
write_inode (inode); // 写盘
}
}
/* 释放一个i 节点(从内存数组回写入设备文件) */
void iput (struct m_inode *inode)
{
if (!inode)
return;
wait_on_inode (inode); // 等待inode 节点解锁(如果已上锁的话)。
if (!inode->i_count)
panic (“iput: trying to free free inode“);
if (inode->i_pipe) // 管道i 节点
{
wake_up (&inode->i_wait); // 唤醒等待该管道的进程
if (--inode->i_count) // 引用次数减1 还有引用则返回
return;
// 释放管道占用的内存页面
free_page (inode->i_size); // 复位该节点的引用计数值
inode->i_count = 0;
inode->i_dirt = 0; // 已修改标志
inode->i_pipe = 0; // 管道标志
return;
}
if (!inode->i_dev) // 如果i 节点对应的设备号0
{
inode->i_count--; // 此节点的引用计数递减1
return;
}
if (S_ISBL
评论
共有 条评论