Chinaunix首页 | 论坛 | 博客
  • 博客访问: 752058
  • 博文数量: 79
  • 博客积分: 2671
  • 博客等级: 少校
  • 技术积分: 1247
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-02 15:26
个人简介

宅男

文章分类

全部博文(79)

文章存档

2017年(11)

2016年(12)

2015年(6)

2012年(10)

2011年(33)

2010年(7)

分类: LINUX

2015-01-29 13:43:55

很多时候在我们想尝试卸载一个文件系统的时候,会被提示设备正忙。这时候就会抓狂了。因为你根本不知道到底是哪一个进程打开了到底哪一个文件导致的。

点击(此处)折叠或打开

  1. static int do_umount(struct mount *mnt, int flags)

  2. 1225 br_write_lock(&vfsmount_lock);
  3. 1226 if (mnt_get_count(mnt) != 2) {
  4. 1227 br_write_unlock(&vfsmount_lock);
  5. 1228 return -EBUSY;
  6. 1229 }
  7. 1230 br_write_unlock(&vfsmount_lock);
当尝试卸载文件系统的时候,会先检查mnt的应用计数,如果这个计数不等于2的话(其实是大于2的情况),会提示EBUSY。

下面看看这个计数是怎么初始化的。这个值会在alloc_vfsmnt的时候,也就是mount的时候初始化为1.然后在attach_mnt的时候再次+1.
那么mount之后,这个值就变为2了。
以后每次打开一个文件,这个值就会被+1.

其实在android的vold demon中,当出现EBUSY的时候,会遍历/proc/下的所有进程。查询相应的打开文件,如果这个进程有打开这个文件系统中的文件的话。VOLD会将其杀死。
虽然有点傻乎乎的,但是好像也没什么别的办法。




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