Linux内核文件系统 free_inode函数

本文详细介绍了Linux内核0.11版本中free_inode函数的实现,主要关注了两个关键部分的解释:检查inode位图是否存在以及清除inode对应的位。通过分析inode的编号和位图的关系,解释了如何定位并释放inode。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


此函数为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



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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值