• 大小: 18KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: 其他
  • 标签: inode  

资源简介

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

评论

共有 条评论