免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2312 | 回复: 4
打印 上一主题 下一主题

block-scsi request 复位问题,大牛们请指教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-02 17:15 |只看该作者 |倒序浏览
用户层对scsi磁盘,执行读写(read() , write())操作
会在block驱动 -> scsi驱动 发送requsets
驱动响应请求返回用户层。

现在我想在用户层执行读写操作过程中,驱动长时间未
返回时,删除requsets。使返回用户层读写操作(返回
错误)。

我在scsi驱动里:
while ((req = elv_next_request(q)) != NULL)
        scsi_kill_request(req, q);
好像不行??

请问有什么方法可以达到目的??
或在哪一层做更好??

thanx

论坛徽章:
0
2 [报告]
发表于 2008-12-02 19:33 |只看该作者
scsi_dispatch_cmd()->
    ...
    scsi_add_timer(cmd, cmd->timeout_per_command, scsi_times_out);
    ...
SCSI底层在执行SCSI命令的时候会自动设置超时,这个机制不能满足楼主的要求??

论坛徽章:
0
3 [报告]
发表于 2008-12-10 10:31 |只看该作者

回复 #2 mars007 的帖子

谢谢你的答复,我试验了一下

scsi_add_timer(cmd, cmd->timeout_per_command, scsi_times_out);
SCSI底层设置这个超时,是调用host->hostt->queuecommand(cmd, scsi_done)的时间,
也就是这个函数正常返回就算不超时了。

而我这里的问题是。queuecommand正常返回了。所以scsi判断没有超时。
但是在底层queuecommand只是把当前命令放入一个队列,还未执行。当真正执行时却出现问题,
没有返回,即最后没有调用回调函数。上层就一直没得到响应,就停下来了。

我尝试把底层命令取消返回不管用,不知scsi上层还是block还需做什么,还是其他地方??

论坛徽章:
0
4 [报告]
发表于 2008-12-12 23:47 |只看该作者

回复 #3 linuxnewer112 的帖子

你的理解大部分错误。

在用户层执行读写操作过程中,驱动长时间未返回时, 会启动scsi cmd 出错机制,
具体代码见:scsi_unjam_host

有的命令会requeue,有的就直接done到上一层。

在用户层执行读写操作过程中,驱动长时间未返回时,最长也就30s, 用户层直接返错。

论坛徽章:
0
5 [报告]
发表于 2008-12-23 14:40 |只看该作者

回复 #4 todaygood 的帖子

todaygood  ,谢谢指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP