微视linux 释放文件节点流程

long do_unlinkat(int dfd, const char __user *pathname)
{
	struct dentry *dentry;
	struct nameidata nd;
	struct inode *inode = NULL;

	error = user_path_parent(dfd, pathname, &nd, &name);
	
	dentry = lookup_hash(&nd);
	
	inode = dentry->d_inode;
	if (inode)
		atomic_inc(&inode->i_count);
	error = mnt_want_write(nd.path.mnt);
	
	error = vfs_unlink(nd.path.dentry->d_inode, dentry);
	
	mnt_drop_write(nd.path.mnt);
	
	dput(dentry);
	
	if (inode)
		iput(inode);	/* truncate the inode here */
		=>void iput(struct inode *inode)
		{
			if (inode) {
				BUG_ON(inode->i_state == I_CLEAR);

				if (atomic_dec_and_lock(&inode->i_count, &inode_lock))
					iput_final(inode);
					=>void iput_final(struct inode *inode)
					{
						const struct super_operations *op = inode->i_sb->s_op;
						void (*drop)(struct inode *) = generic_drop_inode;

						if (op && op->drop_inode)
							drop = op->drop_inode;
						drop(inode);
						=>void generic_drop_inode(struct inode *inode)
						{
							if (!inode->i_nlink)
								generic_delete_inode(inode);//Super.c (fs\ext2):	.delete_inode	= ext2_delete_inode,
								=>void ext2_delete_inode (struct inode * inode)
								{
									if (!is_bad_inode(inode))
										dquot_initialize(inode);
									truncate_inode_pages(&inode->i_data, 0);

									if (is_bad_inode(inode))
										goto no_delete;
									EXT2_I(inode)->i_dtime	= get_seconds();
									mark_inode_dirty(inode);
									__ext2_write_inode(inode, inode_needs_sync(inode));

									inode->i_size = 0;
									if (inode->i_blocks)
										ext2_truncate (inode);
									ext2_free_inode (inode);//真正释放文件节点

									return;
								no_delete:
									clear_inode(inode);	/* We must guarantee clearing of inode... */
								}

							else
								generic_forget_inode(inode);
						}
					}
			}
		}
		
	path_put(&nd.path);
	putname(name);
	return error;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值