struct m_inode inode_table[NR_INODE]={
{0,},};
static void read_inode(struct m_inode * inode);
static void write_inode(struct m_inode * inode);
/*参考sleep_on函数,另一篇文中有说*/
static inline void wait_on_inode(struct m_inode * inode)
{
cli();
while (inode->i_lock)
sleep_on(&inode->i_wait);
sti();
}
static inline void lock_inode(struct m_inode * inode)
{
cli();
while (inode->i_lock)
sleep_on(&inode->i_wait);
inode->i_lock=1;
sti();
}
static inline void unlock_inode(struct m_inode * inode)
{
inode->i_lock=0;
wake_up(&inode->i_wait);
}
/*把所有的inode写入到磁盘中。读取的inode记录在全局数组inode_table中*/
void sync_inodes(void)
{
int i;
struct m_inode * inode;
inode = 0+inode_table;
for(i=0 ; i<NR_INODE ; i++,inode++) {
wait_on_inode(inode);
if (inode->i_dirt && !inode->i_pipe)
write_inode(inode);
}
}
/*
*直接映射时,i_zone[0-6]分别记录一个块,也就是记录7个块
*一级间接映射:i_zone[7]指向一个块,块中的所有数据都用来记录下一级的块号。可记录512块
*二级间接映射i_zone[8]指向一个块a,块a用来记录512个块,这512个块又分别记录512个块号
*/
/*create=0时获取数据块再设备上的逻辑块号,create=1时创建数据块对应的逻辑块*/
/*0-6直接块 7一级间接映射块,8二级间接映射块*/
static int _bmap(struct m_inode * inode,int block,int create)
{
struct buffer_head * bh;
int i;
if (block<0)
panic("_bmap: block<0");
if (block >= 7+512+512*512)
panic("_bmap: block>big");
/*当block小于7时,且逻辑块映射成员i_zone[block]为空,就创建一个新块并赋值给i_zone[block];并返回逻辑块号*/
if (block<7) {
if (create && !inode->i_zone[block])
if (inode->i_zone[block]=new_block(inode->i_dev)) {
inode->i_ctime=CURRENT_TIME;
inode->i_dirt=1;
}
return inode->
linux-011文件系统节点操作函数解析
最新推荐文章于 2022-10-29 19:27:55 发布
本文详细解析了Linux内核中关于文件系统节点的操作,包括读取、写入、等待、锁定和解锁inode,以及sync_inodes函数实现。还介绍了bmap函数用于获取或创建数据块的逻辑块号,涉及直接映射和间接映射。最后,讲解了iput函数释放节点、get_empty_inode获取空inode、get_pipe_inode创建管道节点以及iget读取指定inode等核心操作。
摘要由CSDN通过智能技术生成