很多时候在我们想尝试卸载一个文件系统的时候,会被提示设备正忙。这时候就会抓狂了。因为你根本不知道到底是哪一个进程打开了到底哪一个文件导致的。
-
static int do_umount(struct mount *mnt, int flags)
-
-
1225 br_write_lock(&vfsmount_lock);
-
1226 if (mnt_get_count(mnt) != 2) {
-
1227 br_write_unlock(&vfsmount_lock);
-
1228 return -EBUSY;
-
1229 }
-
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) |