阅读:3120回复:11
问一个块设备mount的问题
测试LDD3里的sbull的例子,正常操作的情况下,工作都正常。
但是如果mount了块设备以后,就无法rmmod sbull了,提示是 ERROR: Module sbull is in use 我加了一个定时器,60 秒后启动一个work,在work里调用 del_gendisk(gd); put_disk(gd); blk_cleanup_queue(queue); 定时器到期,卸载disk后,就无法umount原来已经mount了的目录。 请问在driver里如何彻底卸载一个之前用add_disk注册的设备(包括自动umount)? ps 我用u盘做了个试验,发现u盘拔了以后,它会自动umount。 |
|
沙发#
发布于:2007-01-18 08:31
你在该设备驱动中umount自己,肯定会报设备忙. USB自动umount是因为USB 执行umount的驱动与mount的存储设备可能不是一个驱动.
可否采用强制umount 的相关内核函数,是否存在,可查一下? |
|
板凳#
发布于:2007-01-18 09:10
引用第1楼zhaoyanghong于2007-01-18 08:31发表的“”: 不是在驱动中umount。在块设备驱动中都是用add_disk注册一个块设备,对应地,用del_gendisk和put_disk来删除之前注册的块设备,现在问题是,如果在已经mount的情况下,用这两个函数并不能完全删除块设备。 |
|
地板#
发布于:2007-01-18 10:29
刚才我错了,在驱动中应是可以umount FS的.释放设备[在内核态可以拥有无限的权限],这样文件系统在使用的情况可能不安全.
你讲的是删除注册的块设备驱动.当该设备mount后, 其使用的引用计数可能非0, 是否为当你调用相关函数free时,报正在使用.设备的上层设备还在使用. 是否可以free注册的块设备.最后再释放驱动:先释放该驱动的 FS层[设备], 然后再释放驱动. |
|
地下室#
发布于:2007-01-19 14:57
“free注册的块设备”,我用以下几个函数:
del_gendisk(gd); put_disk(gd); blk_cleanup_queue(queue); “释放驱动的FS层[设备]”这个就不知道该怎么做啦。 是不是在open函数里保存 inode->i_bdev,然后在释放的时候对期进行操作。 需要用到哪些函数? |
|
5楼#
发布于:2007-01-19 17:11
可以看一下umount的内核操作,具体也忘了,参照一下.应该是相同的原理,或直接调用umount的内核系统调用函数.然后运行你的free函数.
|
|
6楼#
发布于:2007-01-22 11:20
弱问一下,如何查看umount的源代码?
umount命令好像不属于内核? |
|
7楼#
发布于:2007-01-22 12:48
内核系统调用函数: 好象是sys_umount(...)
|
|
8楼#
发布于:2007-01-22 14:00
我试试
不过感觉这样治标不治本啊 如果有其他的程序也已经打开块设备,如fdisk,dd等,还是会存在这个问题? |
|
9楼#
发布于:2007-01-22 14:18
引用第8楼munaiyi88于2007-01-22 14:00发表的“”: 你在kernel中,可以处理用户态的应用问题,用户态是没法影响你的! |
|
10楼#
发布于:2007-01-22 15:08
引用第9楼zhaoyanghong于2007-01-22 14:18发表的“”: 不是很明白 :( |
|
11楼#
发布于:2007-01-23 14:07
当你的代码运行时,用户的进程对内核的访问是挂起的,你完全可以修改相关用户的进程登记的相关参数,然后运行你想运行的代码.
|
|