Linux内核文件系统 free_inode函数

2017-01-14 08:48:46来源:CSDN作者:r21nn人点击


此函数为Linux 内核 0.11版本中的,目录为Linux/fs/bitmap.c  源代码如下:


107 void free_inode(struct m_inode * inode)
108 {
109     struct super_block * sb;
110     struct buffer_head * bh;
111 
112     if (!inode)
113         return;
114     if (!inode->i_dev) {
115         memset(inode,0,sizeof(*inode));
116         return;
117     }
118     if (inode->i_count>1) {
119         printk("trying to free inode with count=%d/n",inode->i_count);
120         panic("free_inode");
121     }
122     if (inode->i_nlinks)
123         panic("trying to free inode with links");
124     if (!(sb = get_super(inode->i_dev)))
125         panic("trying to free inode on nonexistent device");
126     if (inode->i_num < 1 || inode->i_num > sb->s_ninodes)
127         panic("trying to free inode 0 or nonexistant inode");
128     if (!(bh=sb->s_imap[inode->i_num>>13]))
129         panic("nonexistent imap in superblock");
130     if (clear_bit(inode->i_num&8191,bh->b_data))
131         printk("free_inode: bit already cleared./n/r");
132     bh->b_dirt = 1;
133     memset(inode,0,sizeof(*inode));
134 }

这里只对代码中较难理解的两段进行解释,其他的代码都在赵炯的Linux内核完全注释中有详细解释

128     if (!(bh=sb->s_imap[inode->i_num>>13]))
129         panic("nonexistent imap in superblock");

这里是如果该i节点对应的节点位图不存在,则出错,inode->i_num是该inode节点在inode块的序号,即第多少个inode。而一个inode位图块占1k字节大小,也就是有1024*8=8192位,即可标注8192个inode,i_num右移13位等于其除以8192即可得到该inode的标注bit在哪个inode位图块中,也就是s_imap的下标索引值。

130     if (clear_bit(inode->i_num&8191,bh->b_data))
131         printk("free_inode: bit already cleared./n/r");

从前面的代码可知bh->data为该释放inode的标注bit所在的位图块,i_num&8191得到被释放inode在位图块中偏移bit



上图可帮助理解这段程序。当然,这只是我自己对这段代码的理解,我自己感觉很多地方理解得并不到位,如有错误,希望大家能给予指正


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台