munaiyi88
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2009-07-19
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望53点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:3120回复:11

问一个块设备mount的问题

楼主#
更多 发布于:2007-01-17 16:51
  测试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。
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-01-18 08:31
你在该设备驱动中umount自己,肯定会报设备忙. USB自动umount是因为USB 执行umount的驱动与mount的存储设备可能不是一个驱动.
     可否采用强制umount 的相关内核函数,是否存在,可查一下?
munaiyi88
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2009-07-19
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望53点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-18 09:10
引用第1楼zhaoyanghong2007-01-18 08:31发表的“”:
你在该设备驱动中umount自己,肯定会报设备忙. USB自动umount是因为USB 执行umount的驱动与mount的存储设备可能不是一个驱动.
     可否采用强制umount 的相关内核函数,是否存在,可查一下?



不是在驱动中umount。在块设备驱动中都是用add_disk注册一个块设备,对应地,用del_gendisk和put_disk来删除之前注册的块设备,现在问题是,如果在已经mount的情况下,用这两个函数并不能完全删除块设备。
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-01-18 10:29
刚才我错了,在驱动中应是可以umount  FS的.释放设备[在内核态可以拥有无限的权限],这样文件系统在使用的情况可能不安全.
    你讲的是删除注册的块设备驱动.当该设备mount后, 其使用的引用计数可能非0, 是否为当你调用相关函数free时,报正在使用.设备的上层设备还在使用.
    是否可以free注册的块设备.最后再释放驱动:先释放该驱动的 FS层[设备], 然后再释放驱动.
munaiyi88
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2009-07-19
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望53点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-01-19 14:57
“free注册的块设备”,我用以下几个函数:
   del_gendisk(gd);
    put_disk(gd);
    blk_cleanup_queue(queue);

“释放驱动的FS层[设备]”这个就不知道该怎么做啦。
是不是在open函数里保存 inode->i_bdev,然后在释放的时候对期进行操作。
需要用到哪些函数?
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-01-19 17:11
可以看一下umount的内核操作,具体也忘了,参照一下.应该是相同的原理,或直接调用umount的内核系统调用函数.然后运行你的free函数.
munaiyi88
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2009-07-19
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望53点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-01-22 11:20
弱问一下,如何查看umount的源代码?
umount命令好像不属于内核?
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-01-22 12:48
内核系统调用函数: 好象是sys_umount(...)
munaiyi88
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2009-07-19
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望53点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-01-22 14:00
我试试
不过感觉这样治标不治本啊
如果有其他的程序也已经打开块设备,如fdisk,dd等,还是会存在这个问题?
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-01-22 14:18
引用第8楼munaiyi882007-01-22 14:00发表的“”:
我试试
不过感觉这样治标不治本啊
如果有其他的程序也已经打开块设备,如fdisk,dd等,还是会存在这个问题?



你在kernel中,可以处理用户态的应用问题,用户态是没法影响你的!
munaiyi88
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2009-07-19
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望53点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-01-22 15:08
引用第9楼zhaoyanghong2007-01-22 14:18发表的“”:

你在kernel中,可以处理用户态的应用问题,用户态是没法影响你的!




不是很明白 :(
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-01-23 14:07
当你的代码运行时,用户的进程对内核的访问是挂起的,你完全可以修改相关用户的进程登记的相关参数,然后运行你想运行的代码.
游客

返回顶部