linux 内核 scsi底层驱动程序,Linux 内核 SCSI IO 子系统分析[图]

Linux 内核 SCSI IO 子系统分析[图]

2009-10-15 10:31:22   出处:https://www.yqdown.com

}

}

第二次回调:

不同的 SCSI 上层模块会定义自己不同的第二次回调函数,如 SD 模块,会在sd_init_command函数中,定义自己的第二次回调函数sd_rw_intr,这个回调函数会根据 SD 模块的须要

,对 SCSI 命令执行的结果做进一步的处理。清单 4 显示了 SD 模块注册第二次回调的代码。虽然各个 SCSI 上层模块可以定义自己的第二次回调函数,但是这些回调函数最终都会结束 SCSI 子系统对这个块访问请求的处理。

清单 4. SD 模块注册第二次回调的代码

static int sd_init_command(struct scsi_cmnd * SCpnt)

{

……

SCpnt->done = sd_rw_intr;

return 1;

}

SCSI子系统的不正确

处理

由于 SCSI 底层驱动是由厂商自己实现的,在此就不予讨论。除此之外,SCSI 子系统的出错处理,主要是由 SCSI 中间层完成。在第一次回调流程

中,SCSI 底层驱动将 SCSI 命令的处理结果以及获取的 SCSI 状态信息返回给 SCSI 中间层,SCSI 中间层先对 SCSI 底层驱动返回的 SCSI 命令执行的结果执行

判断,若不能

得到明确的结论,则对 SCSI 底层驱动返回的 SCSI 状态、感测数据等执行

判断。对于判断结论为处理成功的 SCSI 命令,SCSI 中间层会直接执行

第二次回调;对于判断结论为须要

重试的命令,则会被加入块设备请求对列,重新被处理。这个流程

可称为 SCSI 中间层对 SCSI 命令执行结果的基本判断要领

一切看起来似乎是这么基本

,但是实际上并非如此,有些不正确

是没有明确的判断依据的,如感测数据不正确

或 TIMEOUT 不正确

。为了处理

这个疑问

,LINUX 内核中 SCSI 子系统引入了一个专门执行

不正确

处理的线程,对于不能

判断不正确

原由

的 SCSI 命令,都会交由该线程执行

处理。线程处理流程

和两个队列密切有关

,一个是不正确

处理队列(eh_work_q),一个是不正确

处理完成队列 (done_q) 。不正确

处理队列记录了须要

执行

不正确

处理的 SCSI 命令,不正确

处理完成队列记录了在不正确

处理流程

中被处理完成的 SCSI 命令。清单 5 显示了线程对不正确

处理队列上记录的命令执行

不正确

处理的流程

分享到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值