Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165468
  • 博文数量: 22
  • 博客积分: 126
  • 博客等级: 入伍新兵
  • 技术积分: 459
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-26 21:14
文章分类
文章存档

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销毁

阅读(1818) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~