📄 inode.c.txt
字号:
any problems,send mails to sindybear@163.com
相关文件
/ext2/inode.c
/include/linux/fs.h
******************************基本数据结构***********************************
static LIST_HEAD(inode_in_use); //正在使用中的inode节点的链表
static LIST_HEAD(inode_unused); //没有使用的inode节点的链表
struct inodes_stat_t inodes_stat; //inode节点的状态(fs.h)
*****************************************************************************
**************************系统按照inode号寻找相应的inode节点的过程**********************
//这个函数的主要作用是按照参数ino传递进来的inode的number号来得到相应的inode结构
(1)struct inode *iget4(struct super_block *sb, unsigned long ino, find_inode_t find
_actor, void *opaque)
struct list_head * head = inode_hashtable + hash(sb,ino);//先得到hash表的第一个指针
inode = find_inode(sb, ino, head, find_actor, opaque); //看是否能在缓存中找到这个节点
if (inode) {
__iget(inode); //如果找到的话,
spin_unlock(&inode_lock);
wait_on_inode(inode); //这一步很重要,我们必须等待inode没有处于锁状态才能使用
return inode;
}
return get_new_inode(sb, ino, head, find_actor, opaque); //得到一个新的inode节点
(2)static struct inode * find_inode(struct super_block * sb, unsigned long ino, st
uct list_head *head, find_inode_t find_actor, void *opaque)
tmp = head;
for (;;) {
…… //沿着head循环查找inode节点,直到找到和ino相同的节点,或者没找到返回null
}
(5)static inline void wait_on_inode(struct inode *inode)
if (inode->i_state & I_LOCK) //如果inode处于锁状态,就要等待。
__wait_on_inode(inode);
(6)static void __wait_on_inode(struct inode * inode)
DECLARE_WAITQUEUE(wait, current);
add_wait_queue(&inode->i_wait, &wait);
repeat:
set_current_state(TASK_UNINTERRUPTIBLE);
if (inode->i_state & I_LOCK) { //一直等待直到inode的状态不时lock
schedule();
goto repeat;
}
remove_wait_queue(&inode->i_wait, &wait);
current->state = TASK_RUNNING;
//这个函数主要是对新来的inode进行一些外围的数据结构和链表的处理
(7)static inline void __iget(struct inode * inode)
if (atomic_read(&inode->i_count)) { //如果inode不止一个来访问,就加一,返回
atomic_inc(&inode->i_count);
return;
}
atomic_inc(&inode->i_count); //如果还没有进程访问,就先加一
if (!(inode->i_state & (I_DIRTY|I_LOCK))) { //如果inode节点没有加锁也不脏
list_del(&inode->i_list); //就将inode从现在所在的链表中删除
list_add(&inode->i_list, &inode_in_use);//把这个inode加入到使用中的inode链表中
}
inodes_stat.nr_unused--; //未用inode数目减一
//这是最为重要的一个函数,主要来处理得到新的inode的问题
(8)static struct inode * get_new_inode(struct super_block *sb, unsigned long ino,
struct list_head *head, find_inode_t find_actor, void *opaque)
inode = alloc_inode(); //分配一个inode结构
if (inode) { //如果分配成功
conditional_schedule(); //就先把一些脏的数据先写回到磁盘上去。
old = find_inode(sb, ino, head, find_actor, opaque);
if (!old) { //如果还没有人使用以ino这个号标志的inode
inodes_stat.nr_inodes++; //增加inode的数量
…… //就使用这个inode进行各种初始化
clean_inode(inode); //对inode的一些域进行初始化
if (sb->s_op->read_inode2) {
sb->s_op->read_inode2(inode, opaque) ;
} else {
sb->s_op->read_inode(inode);
} //然后调用相应的文件系统的函数读出相应的inode然后对vfs的inode的一些
//和特定的文件系统相关的域进行初始化,例如ext2_read_inode
wake_up(&inode->i_wait); //唤醒在这个inode上等待的其他的进程,这个
//很重要,因为一次只能由一个进程访问inode
return inode; //函数返回这个inode
}
//如果在inode表中发现了相同ino的inode,说明有人在使用这个inode,那就使用
//这个旧的inode,不过要在上面耐心地等待
__iget(old);
spin_unlock(&inode_lock);
destroy_inode(inode); //把新生成的inode节点删掉
inode = old;
wait_on_inode(inode); //在旧的inode节点上等待,因为现在有人可能正在使用
}
return inode;
(9)static void clean_inode(struct inode *inode) //对inode的一些域进行初始化
//主要是对一些特殊的域进行初始化,比如u域
***************************************************************************************
************************有用的基本函数**********************************
这个函数很有用,它可以返回给定的一个文件(用inode代表)中相应的block块相应在磁盘上的block号。
输入的block是这个文件的逻辑块号,输出的是在磁盘上的物理块号
(1)int bmap(struct inode * inode, int block)
if (inode->i_mapping->a_ops->bmap)
res = inode->i_mapping->a_ops->bmap(inode->i_mapping, block);
************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -