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