sctape FC 设备驱动程序
用途
支持顺序存取大容量存储介质设备驱动程序的 SCSI (FCP) 光纤通道协议。
语法
#include <sys/devinfo.h>
#include <sys/scsi.h>
#include <sys/tape.h>
#include <sys/pcm.h>
#include <sys/mpio.h>与设备相关的子例程
大多数磁带操作是使用 开, 读, 写和 关闭 子例程实现的。 但是,如果要以 "诊断" 方式打开设备,那么必须使用 奥佩克斯 子例程。
打开和关闭子例程
奥佩克斯 子例程是供诊断命令和实用程序使用的。 执行需要相应的权限。 在没有适当授权的情况下试图执行该子程序,会导致该子程序返回 -1 值,并将 errno 全局变量设置为 EPERM 。
奥佩克斯 子例程允许设备驱动程序进入 "诊断" 方式并禁用命令重试逻辑。 此操作允许执行 ioctl 操作,这些操作执行与诊断处理相关的特殊功能。 其他 奥佩克斯 功能 (例如,强制打开和保留的预留) 也可用。
open 子例程根据 ODM reserve_policy 属性应用预留策略。
传递给 奥佩克斯 子例程的 扩展 参数将选择要用于目标设备的操作。 ext 参数在 /usr/include/sys/scsi.h 文件中定义。 此参数可以包含以下标志值的任意组合以逻辑方式一起 OR 运算:
| 项 | 描述 |
|---|---|
| SC_DIAGNOSTIC | 将所选设备置于诊断方式。 此方式是单入方式。 当设备处于诊断方式时,会在 开 或 关闭 操作期间执行 SCSI 操作,并且会禁用错误日志记录。 在诊断方式下,仅接受 关闭 和 ioctl 操作。 所有其他设备支持的子程序都返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 仅当目标设备当前未打开时,才能以诊断方式打开该设备。 如果尝试在诊断模式下打开设备,而目标设备已经打开,则子程序返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 |
| SC_FORCED_OPEN | 强制总线设备复位 (BDR) ,而不考虑另一个启动器是否保留了该设备。 在打开序列开始之前, SCSI 总线设备复位将发送至设备。 否则, 开 操作将正常执行。 |
| SC_RETAIN_RESERVATION | 在执行 关闭 操作后,通过不发出发行版来保留设备的保留。 此标志阻止其他发起方使用该设备,除非它们破坏主机的预留。 |
内核扩展和设备支持编程概念 中的 用于 openx 子例程的 FCP 选项 提供了有关 开 操作的更多特定信息。
ioctl 子例程
STIOCMD ioctl 操作提供了将 SCSI 命令直接发送到磁带设备的方法。 这使应用程序能够发出特定 SCSI 命令,这些命令不受磁带设备驱动程序直接支持。
要使用 STIOCMD 操作,必须以 "诊断" 方式打开设备。 如果在设备未处于诊断模式时尝试执行此命令,将返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 STIOCMD 操作用于传递 sc_iocmd 结构的地址。 该结构在 /usr/include/sys/scsi.h 文件中定义。
以下 ioctl 操作仅可用于具有 MPIO 功能的 FC 磁带设备:
| 项 | 描述 |
|---|---|
| STPATHIOCMD | STPATHIOCMD 命令将使用指向单个 sctape_pathiocmd 结构的指针自变量作为输入。 STPATHIOCMD 命令的行为将与 STIOCMD 命令完全相同,只是使用了输入路径而不是 PCM 所执行的正常路径选择。 STPATHIOCMD 路径用于 STIOCMD 命令,而与 STPATHFORCE ioctl 命令指定的任何路径无关。 在强制使用路径时,无法取消配置该路径。 |
| STPATHFORCE | STPATHFORCE 命令将 乌绍尔特 路径标识用作输入。 路径标识应该对应于 CuPath ODM中的某个路径标识。 路径标识指定要用于所有后续 I/O 命令的路径,并覆盖任何先前的 STPATHFORCE 路径。 零 (0) 参数指定强制路径被终止,并且将恢复正常的 MPIO 路径选择。 PCM KE 会跟踪路径上的 I/O 的强制情况。 "设备驱动程序" 不知道此状态。 随 STPATHIOCMD 一起发送的 I/O 命令将覆盖 STPATHFORCE 选项,并沿 st_pathiocmd 结构中指定的路径发送 I/O。 |
| STPATHPASSTHRU | STPATHPASSTHRU 命令将指向单一 sctape_pathiocmd 结构的指针参数作为输入。 除了使用输入路径而不是常规路径选择之外, STPATHPASSTHRU 命令的行为将与 STIOCMD完全相似。 |
| STPCMPASSTHRU | STPCMPASSTHRU命令将 PCM 专用结构作为输入;AIX® 并未定义该结构。PCM 专用结构将直接传递给 PCM。 此结构可用于将信息移动到 PCM 或从 PCM 移动信息。 |
错误条件数
除了列出的那些错误之外,针对此设备的 ioctl, 开, 读和 写 子例程在以下情况下也不成功:
| 项 | 描述 |
|---|---|
| EAGAIN | 指示已尝试打开已经打开的设备。 |
| EBUSY | 指示目标设备已由另一个发起方保留。 |
| EINVAL | 指示提供了 O_APPEND 值作为打开方式。 |
| EINVAL | 指示由 读 或 写 操作提供的 nbyte 参数不是块大小的倍数。 |
| EINVAL | 指示 ioctl 操作的某个参数无效。 |
| EINVAL | 指示所请求的 ioctl 操作在当前设备上不受支持。 |
| EIO | 指示磁带机已复位或磁带已被更改。 如果先前对磁带执行的操作在关闭时使磁带位于超出磁带开头的位置,那么打开时将返回此错误。 |
| EIO | 指示在迂到 EOM (介质结束) 或文件标记之前,设备无法将 St_count 字段指定的记录数向前或反向添加空格。 |
| EMEDIA | 指示对已具有允许的最大打开设备数的适配器尝试了 开 操作。 |
| ENOTREADY | 指示磁带机中没有磁带,或者磁带机未准备就绪。 |
| ENXIO | 指示已尝试写入到 EOM 处的磁带。 |
| EPERM | 指示此子例程需要适当的权限。 |
| ETIMEDOUT | 指示某个命令已超时。 |
| EWRPROTET | 指示在只读磁带上尝试了请求读/写方式的 开 操作。 |
| EWRPROTET | 指示已在只读磁带上尝试执行影响介质的 ioctl 操作。 |
可靠性和可维护性信息
从磁带设备返回的错误如下所示:
| 项 | 描述 |
|---|---|
| 异常中止命令 | 指示设备已结束命令。 |
| 空白检查 | 表示 读 命令迂到了空白磁带。 |
| 数据保护 | 指示在受写保护的磁带上尝试了写操作。 |
| 良好完成 | 指示命令已成功完成。 |
| 硬件错误 | 指示在命令执行期间或自测试期间发生不可恢复的硬件故障。 |
| 非法的请求 | 指示非法命令或命令参数。 |
| 介质错误 | 指示命令以不可恢复的介质错误条件结束。 此情况可能是由磁带缺陷或脏头引起的。 |
| 未就绪 | 指示逻辑单元处于脱机状态。 |
| 已恢复的错误 | 指示在应用某些恢复后命令已成功。 |
| 单元辅助操作请求 | 指示设备已重置或已开启电源。 |
将在每次发生上述列表中的介质,硬件和异常中止命令错误时记录这些错误。 异常中止命令 错误可能是可恢复的,但如果恢复失败,那么会记录该错误。 对于 已恢复错误 和已恢复的 异常中止命令 错误类型,将保留阈值; 超过这些阈值时,将记录错误。 然后将清除阈值。
磁带设备介质错误的错误记录值
在错误记录模板中为磁带设备介质错误定义的字段为:
| 项 | 描述 |
|---|---|
| Comment | 等于磁带介质错误。 |
| Class | 等于 H ,表示发生硬件错误。 |
| Report | 等于值 True ,这指示在生成错误报告时应包含此错误。 |
| Log | 等于值 True ,这指示发生此错误时应创建错误日志条目。 |
| Alert | 等于值 False ,这表示此错误不可警报。 |
| Err_Type | 等于 Perm 的值,这表示永久故障。 |
| Err_Desc | 等于 1332 的值,这表示磁带操作失败。 |
| Prob_Causes | 等于 5003 的值,这表示磁带介质。 |
| User_Causes | 等于值 5100 和 7401 ,分别指示源自磁带和有缺陷的介质的原因。 |
| User_Actions | 等于 1601 和 0000 ,分别表示应更换可移动介质和重试操作,并应执行问题确定过程。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 5003 ,这表示磁带介质。 |
| Fail_Actions | 等于 1601 和 0000 ,分别表示应更换可移动介质并重试操作,并应执行问题确定过程。 |
详细数据 (_D) 字段包含命令类型,设备和适配器状态以及来自发生错误的特定设备的请求检测信息。 详细数据 (_D) 字段包含于 err_rec 结构中。 此结构在 /usr/include/sys/errids.h 文件中定义。 sc_error_log_df 结构 (描述 Detail_Data 字段中包含的信息) 在 /usr/include/sys/scsi.h 文件中定义。
磁带或硬件异常终止命令错误的错误记录值
err_hdr 结构中的字段 (如 /usr/include/sys/erec.h 文件中针对硬件错误和异常中止的命令错误所定义) 为:
| 项 | 描述 |
|---|---|
| Comment | 等于磁带硬件或异常中止命令错误。 |
| Class | 等于 H 的值,这表示硬件错误。 |
| Report | 等于值 True ,这指示在生成错误报告时应包含此错误。 |
| Log | 等于值 True ,这指示发生此错误时应创建错误日志条目。 |
| Alert | 等于值 FALSE ,这表示此错误不可警报。 |
| Err_Type | 等于 Perm 的值,这表示永久故障。 |
| Err_Desc | 等于值 1331 ,这表示磁带机发生故障。 |
| Prob_Causes | 等于 6314 的值,这表示磁带机错误。 |
| User_Causes | 无。 |
| User_Actions | 等于 0000 ,指示应该执行问题确定过程。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 5003 和 6314 ,表明故障原因分别是磁带和磁带机。 |
| Fail_Actions | 等于 0000 以执行问题确定过程。 |
详细数据 (_D) 字段包含命令类型,设备和适配器状态以及来自发生错误的特定设备的请求检测信息。 详细数据 (_D) 字段包含于 err_rec 结构中。 此结构在 /usr/include/sys/errids.h 文件中定义。 sc_error_log_df 结构 (描述 Detail_Data 字段中包含的信息) 在 /usr/include/sys/scsi.h 文件中定义。
磁带的错误记录值-超过已恢复的错误阈值
err_hdr 结构中定义的字段 (如 /usr/include/sys/erec.h 文件中针对已超过阈值计数器的已恢复错误所定义) 为:
| 项 | 描述 |
|---|---|
| Comment | 指示已超过磁带已恢复的错误阈值。 |
| Class | 等于 H 的值,这表示硬件错误。 |
| Report | 等于值 True ,这指示在生成错误报告时应包含此错误。 |
| Log | 等于值 True ,这指示发生此错误时应创建错误日志条目。 |
| Alert | 等于值 FALSE ,这表示此错误不可警报。 |
| Err_Type | 等于 TEMP 的值,它指示临时故障。 |
| Err_Desc | 等于值 1331 ,这表示磁带机发生故障。 |
| Prob_Causes | 等于 6314 ,这指示可能的原因是磁带机。 |
| User_Causes | 等于 5100 和 7401 ,这分别表示介质有缺陷,读/写头脏。 |
| User_Actions | 等于 1601 和 0000 ,这表示应分别更换可移动介质并重试操作和执行问题确定过程。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 5003 和 6314 ,这表示原因分别为磁带机和磁带机。 |
| Fail_Actions | 等于 0000 的值,表示应该执行问题确定过程。 |
详细数据 (_D) 字段包含命令类型,设备和适配器状态以及来自发生错误的特定设备的请求检测信息。 此字段包含在 err_rec 结构中。 err_rec 结构在 /usr/include/sys/errids.h 文件中定义。 详细数据 (_D) 字段还指定超过阈值时的错误类型。 sc_error_log_df 结构 (描述 Detail_Data 字段中包含的信息) 在 /usr/include/sys/scsi.h 文件中定义。
磁带 SCSI 适配器的错误记录值-检测到错误
在 /usr/include/sys/erec.h 文件中为适配器检测到的错误定义的 err_hdr 结构中的字段为:
| 项 | 描述 |
|---|---|
| Comment | 等于磁带 FC 适配器检测到的错误。 |
| Class | 等于 H 的值,这表示硬件错误。 |
| Report | 等于值 True ,这指示在生成错误报告时应包含此错误。 |
| Log | 等于值 True ,这指示发生此错误时应创建错误日志条目。 |
| Alert | 等于值 FALSE ,这表示此错误不可警报。 |
| Err_Type | 等于 PERM 的值,这表示永久故障。 |
| Err_Desc | 等于值 1331 ,这表示磁带机发生故障。 |
| Prob_Causes | 等于 3300 和 6314 的值,分别指示适配器和磁带机发生故障。 |
| User_Causes | 无。 |
| User_Actions | 等于 0000 的值,表示应执行问题确定过程。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 3300 和 6314 的值,分别指示适配器和磁带机发生故障。 |
| Fail_Actions | 等于 0000 的值,表示应该执行问题确定过程。 |
详细数据 (_D) 字段中包含命令类型和适配器状态。 此字段包含在 err_rec 结构中,该结构由 /usr/include/sys/err_rec.h 文件定义。 请求-检测信息不可用,并带有此类错误。 sc_error_log_df 结构描述 Detail_Data 字段中包含的信息,并在 /usr/include/sys/scsi.h 文件中定义。
磁带机清洁错误的错误记录值
某些磁带机在需要清洁时返回错误。 在此类下对需要清洁的驱动器进行分组时发生的错误。
| 项 | 描述 |
|---|---|
| Comment | 指示磁带机需要进行清洁。 |
| Class | 等于 H 的值,这表示硬件错误。 |
| Report | 等于值 True ,这指示在生成错误报告时应包含此错误。 |
| Log | 等于值 True ,这指示发生此错误时应创建错误日志条目。 |
| Alert | 等于值 FALSE ,这表示此错误不可警报。 |
| Err_Type | 等于 TEMP 的值,它指示临时故障。 |
| Err_Desc | 等于 1332 的值,这表示磁带操作错误。 |
| Prob_Causes | 等于 6314 的值,这表示可能原因是磁带机。 |
| User_Causes | 等于 7401 ,这表示脏读/写头。 |
| User_Actions | 等于 0000 的值,表示应执行问题确定过程。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于值 6314 ,这指示原因是磁带机。 |
| Fail_Actions | 等于 0000 的值,表示应该执行问题确定过程。 |
详细数据 (_D) 字段包含命令类型和适配器状态,以及来自发生错误的特定设备的请求检测信息。 此字段包含在 err_rec 结构中,该结构由 /usr/include/sys/errids.h 文件定义。 sc_error_log_df 结构描述 Detail_Data 字段中包含的信息,并在 /usr/include/sys/scsi.h 文件中定义。
未知错误的错误记录值
由于未知原因而发生的错误将在此类中进行分组。 数据保护错误将属于此类。 这些由磁带设备驱动程序检测到的错误从未在磁带机中出现过。
未知错误的 err_hdr 结构描述了以下字段:
| 项 | 描述 |
|---|---|
| Comment | 等于磁带未知的错误。 |
| Class | 等于所有错误类。 |
| Report | 等于值 True ,这指示在生成错误报告时应包含此错误。 |
| Log | 等于值 True ,这指示发生此错误时应创建错误日志条目。 |
| Alert | 等于值 FALSE ,这表示此错误不可警报。 |
| Err_Type | 等于 UNKN 的值,它指示错误类型未知。 |
| Err_Desc | 等于 0xFE00的值,这指示错误描述未知。 |
| Prob_Causes | 等于以下值:
|
| User_Causes | 无。 |
| User_Actions | 无。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 0xFFFF的值,这指示故障原因未知。 |
| Fail_Actions | 等于 0000 ,这表示应该执行问题确定过程。 |
详细数据 (_D) 字段包含命令类型和适配器状态,以及来自发生错误的特定设备的请求检测信息。 详细数据 (_D) 字段包含于 err_rec 结构中。 此字段包含在 /usr/include/sys/errids.h 文件中。 sc_error_log_df 结构描述 Detail_Data 字段中包含的信息,并在 /usr/include/sys/scsi.h 文件中定义。
有关特定请求检测信息的格式,请参阅 光纤通道 (FC) 规范 以获取适用的设备。