SCSI子系统编程求助
现在在将一个Linux 2.4内核下的SCSI命令截获内核模块移植到Linux 2.6环境中,发现一个比较棘手的问题。
在原有的Linux 2.4子系统中,有一个全局变量scsi_hostlist,它是一个Scsi_Host类型的头指针,所有的scsi_host都挂在该指针上,并通过成员指针next互相链接起来。原来的内核模块通过遍历该指针链比较host_no变量,来查找具体的某个是否要截获命令的scsi_host。但Linux 2.6中没有对应的数据接口,也没有了next指针成员。于是不知道该如何进行类似的操作。请大家帮忙看看,谢谢!
我想可能的入手点可能是sysfs或者procfs,或者是Linux 2.6内核提供了专门遍历scsi_host的接口函数?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
2.6下你是哪个一版本, 2.6.12还有Struct Scsi_Host in scsi_host.h
谢谢你的回复。我目前用的是Linux 2.6.15的内核。目前的内核版本中都有Struct Scsi_Host in scsi_host.h这个数据结构,但是没有像2.4内核中有一个该数据结构类型的头指针Struct Scsi_Host *scsi_hostlist,用来挂接所有系统中发现的 Scsi_Host类型的实例。所以我现在在Linux 2.6无法遍历Scsi_Host类型的实例从而找到我想找的scsi_host。
这个是LZ自己开发的模块吗, 关注中
看了一下, Scsi_Host中已经没有next项. 应该不再用next把各Host串起来.
不过你还是可以借鉴Kernel中其它Driver的实现. 2.4中有很多module利用scsi_hostlist, 你研究2.6下是怎么实现的.
谢谢你的回复。
我在网上搜索了一下,发现有人曾经在2002年的时候提过类似的问题。但是Linux内核的大牛们都不建议这样操作scsi_host的链表结构,这样直接操作链表的方法,需要人为控制好ref count,当有的内核模块退出时容易产生问题。所以,我猜测在新的2.6内核中scsi_hostlist和next指针都没有了的原因,相信正是出于这样保证系统内核安全的目的。同时,他们也给出建议看看SCSI Generic的代码,它里面有操作scsi设备的方法。
这个模块不是我开发的,我是下载的一个代码,准备做实验用途的。如果短期解决不了该问题。最坏的结果是安装一个Red Hat 9.0, 满足当时代码的运行环境,呵呵,投机取巧的办法。