当HCB的超时期满时,请求就应当被中止,就像处理XPT_ABORT请求 一样。唯一区别在于被中止的请求的返回状态应当为CAM_CMD_TIMEOUT 而不是CAM_REQ_ABORTED(这就是为什么中止的实现最好由函数来完成)。 但还有一个可能的问题:如果中止请求自己出了麻烦怎么办?这种情况下 应当复位SCSI总线,就像处理XPT_RESET_BUS请求一样(并且将其实现为 函数,从两个地方调用的想法也适用于这儿)。而且如果设备复位请求出了 问题,我们应当复位整个SCSI总线。因此最终超时函数看起来像下面样子:
static void xxx_timeout(void *arg) { struct xxx_hcb *hcb = (struct xxx_hcb *)arg; struct xxx_softc *softc; struct ccb_hdr *ccb_h; softc = hcb->softc; ccb_h = &hcb->ccb->ccb_h; if(hcb->flags & HCB_BEING_ABORTED || ccb_h->func_code == XPT_RESET_DEV) { xxx_reset_bus(softc); } else { xxx_abort_ccb(hcb->ccb, CAM_CMD_TIMEOUT); } }
当我们中止一个请求时,同一目标/LUN的所有其他断开连接的请求 也会被中止。因此出现了一个问题,我们应当返回它们的状态 CAM_REQ_ABORTED还是CAM_CMD_TIMEOUT?当前的驱动程序使用 CAM_CMD_TIMEOUT。这看起来符合逻辑,因为如果一个请求超时,则可能 设备出现了某些的确很糟的事情,因此如果它们没有被扰乱则它们自己 应当超时。
本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.