⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inode.c.txt

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻 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 + -