2013年(22)
分类: LINUX
2013-08-04 18:25:35
Q:打开文件,往文件中写入数据,关闭文件的过程中dentry,inode的产生销毁过程?
1.打开文件,创建dentry,创建inode
sys_open()
//a.创建dentry
dentry = d_alloc(parent, name);
//b.创建inode,将inode加入全局inode_in_use链表,sb->s_inodes链表和icache
get_new_inode_fast()
list_add(&inode->i_list, &inode_in_use);
list_add(&inode->i_sb_list, &sb->s_inodes);
hlist_add_head(&inode->i_hash, head);
//c.将dentry和inode关联,最后才将dentry加入到dcache
d_add(dentry, inode);
2.往文件写入数据,inode被移动到super_block的dirty链表中
sys_write()
generic_write_end()
mark_inode_dirty()
//将inode从inode_in_use移动到super_block的dirty链表中
list_move(&inode->i_list, &sb->s_dirty);
3.关闭文件,dentry被移到sb的未使用dentry链表,inode的引用计数不受影响
sys_close()
filp_close()
dput(dentry)
dentry_lru_add(dentry);
list_add(&dentry->d_lru, &dentry->d_sb->s_dentry_lru);
4.回写文件脏页,文件所有的脏页都回写完毕后,如果引用计数大于0,重新将inode放回inode_in_use链表,否则放回全局inode_unused链表
__sync_single_inode()
if (atomic_read(&inode->i_count))
list_move(&inode->i_list, &inode_in_use);
else
list_move(&inode->i_list, &inode_unused);
5.内存回收,压缩dcache,dentry被销毁,inode被转移到全局inode_unused链表
prune_dcache()
//a.将dentry从dcache中删除
__d_drop()
//b.取消到inode的关联,减少inode的引用计数
dentry_iput()
//c.减少dentry到inode的引用计数后,如果inode的引用计数为0,inode被加入到全局inode_unused
list_move(&inode->i_list, &inode_unused);
inodes_stat.nr_unused++;
//d.销毁dentry
d_free()
6.内存回收,压缩icache,销毁inode
prune_icache()
a.先将inode从io/dirty/inode_ununsed链表移除
b.再将inode从icache和superblock->i_sb_list移除
c.最后将inode销毁