scdisk SCSI 设备驱动程序
用途
支持小型计算机系统接口 (SCSI) 硬盘, CD-ROM (光盘只读存储器) 和读/写光学 (光学存储器) 设备。
语法
#include <sys/devinfo.h>
#include <sys/scsi.h>
#include <sys/scdisk.h>
#include <sys/pcm.h>
#include <sys/mpio.h>与设备相关的子例程
典型的硬盘, CD-ROM 和读/写光盘驱动器操作是通过使用 开, 关闭, 读, 写和 ioctl 子例程来实现的。 scdisk 设备驱动程序添加了对支持 MPIO 的设备的额外支持。
打开和关闭子例程
open 子例程应用基于 ODM reserve_policy 属性的预留策略。 过去, open 子例程始终应用 SCSI2 保留。 如果设备是支持 MPIO 的设备,那么 开 和 关闭 子例程支持使用到设备的多条路径。
奥佩克斯 子例程主要旨在供诊断命令和实用程序使用。 执行需要相应的权限。 如果尝试在没有正确权限的情况下运行 open 子例程,那么子例程将返回值 -1 并将 errno 全局变量设置为值 EPERM。
传递给 奥佩克斯 子例程的 扩展 参数将选择要用于目标设备的操作。 /usr/include/sys/scsi.h 文件定义 ext 参数的可能值。
扩展 参数可以包含以下标志值的任意组合以逻辑方式一起 ORed:
| 项 | 描述 |
|---|---|
| SC_DIAGNOSTIC | 将所选设备置于诊断方式。 此方式是单入方式; 即,一次只能有一个进程将其打开。 当设备处于诊断方式时,会在 开 或 关闭 操作期间执行 SCSI 操作,并且会禁用错误日志记录过程。 在诊断方式下,只接受 关闭 和 ioctl 子例程操作。 所有其他设备支持的子程序都返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 仅当目标设备当前未打开时,才能以诊断方式打开该设备。 如果尝试在诊断模式下打开设备,而目标设备已经打开,则子程序返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 |
| SC_FORCED_OPEN_LUN | 在支持 Lun Level Reset 的设备上,无论在执行打开序列之前由另一个发起方放置的任何保留都将重置该设备。 如果设备不支持 Lun Level Reset ,并且同时设置了 SC_FORCED_OPEN_LUN 和 SC_FORCE_OPEN 标志,那么在执行打开序列之前将进行目标重置。 |
| SC_FORCED_OPEN | 强制总线设备复位,而不管另一个发起方是否保留了该设备。 在 开 序列开始之前,会将 SCSI 总线设备复位发送至该设备。 在其他方面, 开 操作正常运行。 |
| SC_RETAIN_RESERVATION | 在执行 关闭 操作后,通过不发出发行版来保留设备的保留。 此标志阻止其他发起方使用该设备,除非它们破坏主机的预留。 |
| SC_NO_RESERVE | 在对设备进行 奥佩克斯 子例程调用期间,阻止设备的保留。 提供此操作是使设备可以由两个处理器控制,这些处理器通过自己的软件方法来同步其活动。 |
| SC_SINGLE | 将所选设备置于 "互斥访问" 方式。 一次只能有一个进程以 "互斥存取" 方式打开设备。 仅当设备当前未打开时,才能以互斥存取方式打开该设备。 如果尝试在独占访问模式下打开设备,而设备已经打开,则子例程返回 -1 值,并将 errno 全局变量设置为 EBUSY 值。 如果 SC_DIAGNOSTIC 标志与 SC_SINGLE 标志一起指定,那么设备将处于 "诊断" 方式。 |
| SC_PR_SHARED_REGISTER | 在多发起方共享设备环境中,将具有服务操作 Register and Ignore Key 的持久保留作为开放序列的一部分发送到设备。 此功能以集群环境为目标,在此环境中,上层管理软件需要遵循咨询锁定机制来控制发起方何时进行读写操作。 设备是支持持久预留所必需的 (请参阅 SCSI 2 Command version 2 描述 "持久预留")。 |
内核扩展和设备支持编程概念 中的 SCSI 选项到 openx 子例程 提供了有关 开 操作的更多特定信息。
readx 和 writex 子例程
读 和 写 子例程提供了其他影响原始数据传输的参数。 这些子例程传递 扩展 参数,该参数指定请求选项。 这些选项是通过对以下零个或多个值进行逻辑 OR 运算来构造的:
| 项 | 描述 |
|---|---|
| HWRELOC | 指示硬件重定位请求 (仅限安全重定位) |
| UNSAFEREL | 指示不安全硬件重定位请求 |
| writev | 指示写验证的请求 |
ioctl 子例程
用于 Scdisk 设备驱动程序的 ioctl 子例程操作是特定于以下类别的:
- 仅硬盘和读/写光学设备
- 仅限 CD-ROM 设备
- 硬盘, CD-ROM 和读/写光学装置
硬盘和读/写光学设备
对于硬盘和读/写光学设备,提供了以下 ioctl 操作:
| 项 | 描述 |
|---|---|
| DKIOWRSE | 提供一种方法,用于向设备发出 写 命令,并在发生错误时获取目标设备检测数据。 如果 DKIOWRSE 操作返回 -1 值,且 status_validity 字段设置为 sc_valid_sense 值,则将返回有效的感测数据。 否则,将省略目标检测数据。 提供了 DKIOWRSE 操作以供诊断使用。 当目标设备在活动系统环境中运行时,它允许有限使用该设备。 DKIOWRSE 操作中的 阿尔格 参数包含 sc_rdwrt 结构的地址。 此结构在 /usr/include/sys/scsi.h 文件中定义。 开发信息 结构定义了 写 操作的最大传输大小。 如果试图传输的数据超过最大值,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。 |
| DKLOGSENSE | 提供在已成功打开的设备上发出 日志 SENSE 命令的方法。 发出此 ioctl 操作的任何应用程序都必须传递 struct sc_log_sense (在 /usr/include/sys/scsi.h中定义) 的地址,并且结构填充如下:
如果请求的日志页面是 SCSI_BSR_LOG_PAGE (在 /usr/include/sys/scsi.h中定义) ,那么 log_data 指向调用者分配的 struct sc_bsr_log_data 。 调用者还会为 struct sc_bms_log_data 分配内存,以使分配给 struct sc_bms_log_data 的 sizeof struct sc_bsr_log_data 和内存的总量等于 分配长度。 否则 (对于除 SCSI_BSR_LOG_PAGE之外的日志页) ,它将指向等于 分配长度的内存块。 以下是用于填充 sc_log_sense 结构的示例代码: |
DKLOGSENSE ioctl 操作通过使用 struct sc_log_sense (rc=0 指示成功) 返回以下数据:
|
|
| DKLOGSELECT | 提供了发出 日志 SELECT 命令的方法。 发出 DKLOGSELECT ioctl 操作的任何应用程序都应该传递 DKLOGSELECT (在 /usr/include/sys/scsi.h中定义) 的地址,如下所示:
以下示例是填充 sc_log_select 结构以清除 SCSI_BSR_LOG_PAGE 数据 **的示例。
此 ioctl 操作通过使用报告 日志 SELECT 命令的错误完成状态的 struct sc_log_select (rc=0 指示成功) 适配器状态,scsi_status, 森塞基, Scsi_asc和 Scsi_ascq 字段来返回下列数据。 |
仅限 CD-ROM 设备
以下 ioctl 操作仅对 CD-ROM 设备可用:
| 项 | 描述 |
|---|---|
| CDIOCMD | 允许直接向已连接的 CD-ROM 设备发出 SCSI 命令。 CDIOCMD 操作将保留在较早发行版的操作系统上编译的 CD-ROM 应用程序的二进制兼容性。 建议新写的 CD-ROM 应用程序改为使用 DKIOCMD 操作。 对于 CDIOCMD 操作,必须以 "诊断" 方式打开设备。 CDIOCMD 操作参数用于指定 sc_iocmd 结构的地址。 此结构在 /usr/include/sys/scsi.h 文件中定义。 如果在 CD-ROM 以外的设备上尝试此操作,那么会将其解释为 DKiordse 操作。 在此情况下, 阿尔格 参数将被视为 sc_rdwrt 结构。 如果在未处于诊断模式的设备上尝试 CDIOCMD 操作,子例程将返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。 注: 诊断方式仅对于 CDIOCMD 和 DKIOCMD 操作是必需的。
|
硬盘, CD-ROM 和读/写光学装置
对于硬盘, CD-ROM 和读/写光学设备,以下 ioctl 操作可用:
| 项 | 描述 |
|---|---|
| IOCINFO | 返回 /usr/include/sys/devinfo.h 文件中定义的 devinfo 结构。 对于使用 ioctl 子例程的所有设备驱动程序, IOCINFO 操作是唯一定义的操作。 其余操作都特定于硬盘, CD-ROM 和读/写光学设备。 |
| DKiordse | 提供一种方法,用于向设备发出 读 命令,并在发生错误时获取目标设备检测数据。 如果 DKIORDSE 操作返回 -1 值,并且 status_validity 字段设置为 sc_valid_sense 值,则将返回有效的感测数据。 否则,将省略目标检测数据。 提供了 DKiordse 操作以供诊断使用。 当目标设备在活动系统环境中运行时,它允许有限使用该设备。 DKiordse 操作中的 阿尔格 参数包含 sc_rdwrt 结构的地址。 此结构在 /usr/include/sys/scsi.h 文件中定义。 开发信息 结构定义了 读 操作的最大传输大小。 如果试图传输的数据超过最大值,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。 注: 当您向 CD-ROM 设备发出 读 命令并从该设备获取检测数据时, CDIORDSE 操作可能会替换为 DKiordse 操作。 DKiordse 是建议的操作。
|
| DKIOCMD | 在诊断方式下成功打开设备后, DKIOCMD 操作将提供向指定设备发出任何 SCSI 命令的方法。 如果DKIOCMD操作是在设备不处于诊断模式时发出的,则子例程返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 设备驱动程序不会执行任何错误恢复或记录此操作的失败。 SCSI 状态字节和适配器状态字节通过 arg 参数返回,该参数包含 sc_iocmd 结构 (在 /usr/include/sys/scsi.h 文件中定义) 的地址。 如果 DKIOCMD 操作失败,子例程将返回 -1 值,并将 errno 全局变量设置为非零值。 在此情况下,调用者必须对返回的状态字节进行求值,以确定操作失败的原因以及必须执行的恢复操作。 开发信息 结构定义了该命令的最大传输大小。 如果试图传输的数据超过最大值,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。 注: 诊断方式仅对于 CDIOCMD 和 DKIOCMD 操作是必需的。
|
| DKPMR | 在成功打开设备时发出 SCSI 阻止介质移除命令。 此命令会阻止弹出介质,直到设备关闭,断电并重新开启,或者直到发出 DKAMR 操作为止。 用于 DKPMR 操作的 阿尔格 参数为空。 如果 DKPMR 操作成功,那么子例程会返回值 0。 如果设备是 SCSI 硬盘,DKPMR 操作将失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 如果 DKPMR 操作因任何其他原因失败,子例程将返回 -1 值,并将 errno 全局变量设置为 EIO 值。 |
| DKAMR | 在成功打开设备时发出允许除去介质命令。 因此,可通过使用磁带机的弹出按钮或 DKEJECT 操作来弹出介质。 此 ioctl 的 阿尔格 参数为空。 如果 DKAMR 操作成功,那么子例程会返回值 0。 如果设备是 SCSI 硬盘,DKAMR 操作将失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 如果操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EIO 值。 |
| DKEJECT | 当设备成功打开时,向磁带机发出弹出介质命令。 此操作的 阿尔格 参数为空。 如果 DKEJECT 操作成功,那么子例程会返回值 0。 如果设备是 SCSI 硬盘,DKEJECT 操作将失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 如果操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EIO 值。 |
| DKFORMAT | 当设备成功打开时,向指定设备发出格式单元命令。 如果此操作的 阿尔格 参数为空,那么格式单元会将有效 (FOV) 位的格式选项 0 为 0 (即,它使用磁带机的缺省设置)。 如果 DKFORMAT 操作的 阿尔格 参数不为空,那么缺陷列表头的第一个字节将设置为由 阿尔格 参数指定的第一个字节中指定的值。 它允许创建应用程序,以唯一地格式化特定类型的读/写光学介质。 驱动程序最初尝试将 FmtData 和 CmpLst 位设置为 0。 如果此操作失败,那么驱动程序将尝试这些位的其余 3 个排列。 如果所有四个排列都失败,那么此操作将失败,并且子例程会将 errno 全局变量设置为值 EIO。 如果为硬盘指定了 DKFORMAT 操作,则子例程返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 如果在设备未处于独占访问模式时尝试 DKFORMAT 操作,子例程将返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 如果介质受写保护,子程序将返回 -1 值,并将 errno 全局变量设置为 EWRPROTECT 值。 如果格式化单元超过超时值,子例程将返回 -1 值,并将 errno 全局变量设置为 ETIMEDOUT 值。 如果操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EIO 值。 |
| DKAudio | 向指定的设备发出播放音频命令,并控制设备输出端口上的音量。 播放音频命令包括: 播放,暂停,恢复,停止,确定磁道数,并确定当前音频操作的状态。 DKAudio 操作仅通过 CD-ROM 驱动器的输出端口来播放音频。 此操作的 arg 参数是 cd_audio_cmds 结构的地址,该结构在 /usr/include/sys/scdisk.h 文件中定义。 "互斥存取" 方式是必需的。 如果在设备的音频支持属性设置为 "否 "时尝试 DKAUDIO 操作,子例程将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 如果 DKAUDIO 操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为非零值。 在此情况下,调用者必须对返回的状态字节进行求值,以确定操作失败的原因以及必须执行的恢复操作。 |
| DK_CD_MODE | 确定或更改所指定设备的 CD-ROM 数据方式。 CD-ROM 数据方式指定从设备通过 SCSI 总线读取的数据所使用的块大小和特殊文件。 DK_CD_MODE 操作支持以下 CD-ROM 数据方式:
DK_CD_MODE arg 参数包含 /usr/include/sys/scdisk.h 文件中定义的 mode_form_op 结构的地址。 要让 DK_CD_MODE 操作确定或更改 CD-ROM 数据方式,请将actionchange_mode_form 结构的字段为下列其中一个值:
如果未针对不同数据方式配置 CD-ROM (通过方式-选择密度代码) ,并且尝试更改 CD-ROM 数据方式 (通过设置actionchange_mode_form结构的字段设置为 CD_CHG_MODE),子例程将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 将 CD-ROM 模式更改为任何 DVD 模式的尝试也会导致 -1 返回值和 errno 全局变量设置为 EINVAL 。 如果在设备不处于独占访问模式时尝试 DK_CD_MODE 的 CD_CHG_MODE 操作,子例程将返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 如果操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EIO 值。 |
| DK_PASSTHRU | 当设备成功打开时, DK_PASSTHRU 操作将提供向指定设备发出任何 SCSI 命令的方法。 如果此操作失败,那么设备驱动程序将执行有限的错误恢复。 DK_PASSTHRU 操作与 DKIOCMD 操作不同,因为它不需要具有 扩展 自变量 SC_DIAGNOSTIC的 奥佩克斯 命令。 因此,可以对正在由其他操作使用的设备发出 DK_PASSTHRU 操作。 SCSI 状态字节和适配器状态字节通过 arg 参数返回,该参数包含 sc_passthru 结构 (在 /usr/include/sys/scsi.h 文件中定义) 的地址。 如果 DK_PASSTHRU 操作失败,子例程将返回 -1 值,并将 errno 全局变量设置为非零值。 如果发生这种情况,那么调用者必须对返回的状态字节进行求值,以确定操作不成功的原因以及必须执行的恢复操作。 |
| 如果 DK_PASSTHRU 操作因 sc_passthru 结构中的字段值无效而失败,子例程将返回 -1 值,并将 errno 全局变量设置为 EINVAL 。 Einval_arg 字段设置为具有无效值的字段的字段号 (对于版本 1 ,以 1 开头)。 Einval_arg 字段的值为 0 表示没有关于故障的其他信息可用。 DK_PASSTHRU 操作将进一步细分为在发出请求之前停顿其他 I/O 请求的请求以及不停顿 I/O 请求的请求。 这些子部分基于 sc_passthru 结构的 devflags 字段。 当 sc_passthru 结构的 devflags 字段的值为 SC_MIX_IO时, DK_PASSTHRU 操作将与其他 I/O 请求混合执行。 禁止将数据写入设备的 SC_MIX_IO 请求,并且这些请求将失败。 当出现这种情况时,将返回 -1 并将 errno 全局变量设置为 EINVAL 。 如果 sc_passthru 结构的 devflags 字段的值为 SC_QUIESCE_IO,那么在向设备发出 DK_PASSTHRU 请求之前,所有其他 I/O 请求都将停顿。 如果 SC_QUIESCE_IO 请求的 timeout_value 字段设置为 0,DK_PASSTHRU 请求将以 -1 返回代码失败,errno 全局变量将设置为 EINVAL ,参数 字段将设置为 SC_PASSTHRU_INV_TO 值(在 /usr/include/sys/scsi.h 文件中定义)。 如果SC_QUIESCE_IO请求的非零超时值对设备来说过大,DK_PASSTHRU请求将失败,返回代码为-1、errno 全局变量将被设置为 EINVAL, einval_arg 字段将被设置为 SC_PASSTHRU_INV_TO 值(定义在 /usr/include/sys/scsi.h文件中定义),timeout_value 将被设置为允许的最大值。 |
|
可以将 sc_passthru 结构的版本字段设置为 SC_VERSION_2的值,并且用户可以提供以下字段:
|
|
| 开发信息 结构定义了该命令的最大传输大小。 如果尝试传输的大小超过最大传输大小,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值、并将 einval_arg 字段设置为 SC_PASSTHRU_INV_D_LEN 值(定义在 /usr/include/sys/scsi.h文件中定义)。 请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。 |
|
| DKPRES_READKEYS | 成功打开设备后, DKPRES_READKEYS 操作将提供一种方法来读取设备上的持久性预留注册密钥。 DKPRES_READKEYS 的 阿尔格 参数将包含 dk_pres_in 结构的地址。 此结构在 /usr/include/sys/scdisk.h中定义。 用户必须提供要返回的已注册密钥的缓冲区和大小。 返回长度 变量用于设置返回的字节数。 在共享访问或集群环境中,此操作标识特定 LUN 的所有已注册密钥。 注: 对于 DKPRES_READKEYS 操作和以下与持久保留相关的操作,对返回值和 scsi 状态的解释如下所示:
|
| DKPRES_READRES | 成功打开设备后, DKPRES_READRES 操作将提供一种方法来读取设备上的持久预留保留密钥。 DKPRES_READKEYS 的 阿尔格 参数将包含 dk_pres_in 结构的地址。 此结构在 /usr/include/sys/scdisk.h中定义。 用户必须提供要返回的预留信息的缓冲区和大小。 返回长度 变量用于设置返回的字节数。 在共享访问权或集群环境中,此操作将标识持有保留的主发起方。 |
| DKPRES_CLEAR | 在成功打开设备后, DKPRES_CLEAR 操作将提供一种方法来清除设备上的所有持久性预留密钥和注册密钥。 DKPRES_CLEAR 的 阿尔格 参数将包含 dk_pres_clear 结构的地址。 此结构在 /usr/include/sys/scdisk.h中定义。 注意: 注意: 发出 DKPRES_CLEAR 操作时请谨慎操作。 此操作将设备保留为非保留状态,这可能允许外部发起方访问该设备。
|
| DKPRES_PREEMPT | 成功打开设备后, DKPRES_PREEMPT 操作将提供一种方法来抢占设备上的 "持久预留密钥" 或 "注册密钥"。 DKPRES_PREEMPT 的 阿尔格 参数将包含 dk_pres_prepete 结构的地址。 此结构在 /usr/include/sys/scdisk.h中定义。 用户必须在要抢占的设备上提供第二个参与方发起方密钥。 如果第二方发起方持有对设备的保留,那么发出抢占的发起方将成为该保留的所有者。 否则,将撤销第二方发起方访问权。 要使此操作成功,必须先向设备注册启动器,然后才能执行任何抢占。 在共享访问或集群环境中,此操作用于抢占任何可操作或不可操作的发起方,或者任何未被识别为共享组的一部分的发起方。 |
| DKPRES_PREEMPT_ABORT | 此操作与 DKPRES_PREEMPT相同,但设备在异常终止属于被抢占的发起方的任务时遵循 SCSI 主命令规范。 |
| DKPRES_REGISTER | 当设备成功打开时, DKPRES_REGISTER 操作将提供向设备注册密钥的方法。 密钥从 ODM 定制属性中抽取,并在配置期间传递到设备驱动程序。 DKPRES_REGISTER 的 阿尔格 参数将包含 dk_pres_register 结构的地址。 此结构在 /usr/include/sys/scdisk.h中定义。 在共享访问或集群环境中,此操作将尝试向设备注册,然后进行读保留以确定设备是否已保留。 如果未保留该设备,那么会随该设备一起放置预留。 |
| DK_RWBUFFER | 成功打开设备后, DK_RWBUFFER 操作将提供向指定设备发出一个或多个 SCSI Write Buffer 命令的方法。 设备驱动程序在此操作失败时执行完全错误恢复。 DK_RWBUFFER 操作与 DKIOCMD 操作不同,因为它不需要对设备进行互斥打开 (例如, 奥佩克斯 , 扩展 参数为 SC_DIAGNOSTIC)。 因此,可以将 DK_RWBUFFER 操作发出到其他用户正在使用的设备。 它可以与 DK_PASSTHRU ioctl 操作配合使用,而该操作 (例如 DK_RWBUFFER) 不需要对设备进行独占打开。 arg 参数包含 sc_rwbuffer 结构的地址 (在 /usr/include/sys/scsi.h 文件中定义)。 在调用 DK_RWBUFFER ioctl 之前,必须根据必需的行为来设置此结构的字段。 模式 字段对应于 SCSI 主命令 (SPC) 规范中所定义的 SCSI 命令描述符块 (CDB) 的 模式 字段。 受支持的方式列示在头文件 /usr/include/sys/scsi.h中。 设备驱动程序会停顿来自发出写缓冲区 ioctl 的发起方的所有其他 I/O 请求,直到整个操作完成为止。 一旦写缓冲区 ioctl 完成,所有已停顿的 I/O 请求都将恢复。 |
SCSI 状态字节和适配器状态字节通过 arg 参数返回,该参数包含 sc_rwbuffer 结构 (在 /usr/include/sys/scsi.h 文件中定义) 的地址。 如果 DK_RWBUFFER 操作失败,子例程将返回 -1 值,并将 errno 全局变量设置为非零值。 在此情况下,调用者必须对返回的状态字节进行求值,以确定操作失败的原因以及必须执行的恢复操作。 如果 DK_RWBUFFER 操作因 sc_rwbuffer 结构中的字段值无效而失败,子例程将返回 -1 值,并将 errno 全局变量设置为 EINVAL 。 |
|
DK_RWBUFFER ioctl 允许用户通过一次 ioctl 调用向设备发出多条 SCSI 写缓冲区命令 (CDB)。 对于用户提供指向整个微码映像的指针的应用程序 (例如微码下载) ,它很有用,但是由于设备缓冲区的大小限制,希望在整个下载完成之前将映像发送到片段中。 如果在 sc_rwbuffer struct 的 fragment_size 成员等于 数据长度的情况下调用 DK_RWBUFFER ioctl ,那么将向设备发出单个 "写缓冲区" 命令,并且将 SCSI CDB 的 缓冲区偏移量 和 缓冲区标识 设置为 sc_rwbuffer struct 中提供的值。 |
|
如果 数据长度 大于 fragment_size ,并且 fragment_size 为非零值,那么将向设备发出多个写缓冲区。 通过将 数据长度 除以必需的 fragment_size来计算发出的写缓冲区命令 (SCSI CDB) 的数量。 如果 数据长度 不是 fragment_size的偶数倍,那么此值将递增 1 ,并且最终数据传输的大小是此残差值的大小。 对于发出的每个 "写入缓冲区" 命令, 缓冲区偏移量 将设置为 sc_rwbuffer struct 中提供的值 (SCSD 设备的微码下载要求将此值设置为 0)。 |
|
| 对于发出的第一个命令, 缓冲区标识 将设置为 sc_rwbuffer struct 中提供的值。 对于每个后续发出的 "写缓冲区" 命令, 缓冲区标识 将递增 1 ,直到发送所有片段为止。 不支持通过单个 DK_RWBUFFER ioctl 来写入非连续 缓冲区标识。 如果需要此功能,那么必须针对每个调用发出多个 DK_RWBUFFER ioctls ,并相应地设置 缓冲区标识 。 注: 在 ioctl 调用之间未停顿任何 I/O 请求。
|
|
如果 fragment_size 设置为零,那么将返回 EINVAL 的 错误号 。 如果希望使用一个 SCSI 写缓冲区命令来发送整个缓冲区,那么必须将此字段设置为等于 数据长度。 如果 fragment_size 大于 数据长度,那么也会返回 EINVAL 错误。 |
|
"参数列表长度" (fragment_size) 加上 "缓冲区偏移量" 不能超过设备的指定缓冲区的容量。 "写入缓冲区" ioctl 的调用者负责确保 fragment_size 设置满足此需求。 大于设备的 fragment_size 会导致设备发生 SCSI 错误,并且 "写缓冲区" ioctl 会报告此错误,但不执行任何操作以进行恢复。 |
|
开发信息 结构定义了该命令的最大传输大小。 如果尝试传输的大小超过最大传输大小,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。 |
|
| DKPATHIOCMD | 此命令仅可用于支持 MPIO 的设备。 DKPATHIOCMD 命令接受一个指向单个 scdisk_pathiocmd 结构的指针自变量作为输入。 DKPATHIOCMD 命令的行为与 DKIOCMD 命令完全相同,只不过使用的是输入路径而不是正常路径选择。 DKPATHIOCMD 路径用于 DKIOCMD 命令,而与 DKPATHforce ioctl 命令指定的任何路径无关。 在强制使用路径时,无法取消配置该路径。 |
| DKPATHforce | 此命令仅可用于支持 MPIO 的设备。 DKPATHforce 命令采用一个用户群路径标识作为输入。 路径标识必须对应于 CuPath ODM中的某个路径标识。 路径标识指定要用于所有后续 I/O 命令的路径,并覆盖任何先前的 DKPATHforce 路径。 零参数指定将终止路径强制,并且将恢复正常 MPIO 路径选择。 使用 DKPATHIOCMD 命令发送的 I/O 命令将覆盖 DKPATHforce 选项,并将 I/O 命令沿着 scdisk_pathiocmd 结构中指定的路径发送。 |
| DKPATHREWBUFFER | 此命令仅可用于支持 MPIO 的设备。 DKPATHREWBUFFER 命令接受一个指向单个 scdisk_pathiocmd 结构的指针自变量作为输入。 DKPATHREWBUFFER 命令的行为与 DKRWBUFFER 命令完全相同,只不过使用的是输入路径而不是正常路径选择。 无论 DKPATHforce ioctl 命令指定的任何路径如何,都将 DKPATHREWBUFFER 路径用于 DKRWBUFFER 命令。 |
| DKPATHPASSTHRU | 此命令仅可用于支持 MPIO 的设备。 DKPATHPASSTHRU 命令接受一个指向单个 scdisk_pathiocmd 结构的指针自变量作为输入。 DKPATHPASSTHRU 命令的行为与 DKPASSTHRU 命令完全相同,只不过使用的是输入路径而不是正常路径选择。 无论 DKPATHforce ioctl 命令指定的任何路径如何,都将 DKPATHPASSTHRU 路径用于 DKPASSTHRU 命令。 |
| DKPCMPASSTHRU | 此命令仅可用于支持 MPIO 的设备。 DKPCMPASSTHRU命令将 PCM 专用结构作为输入,AIX® 并未定义该结构。PCM 专用结构将直接传递给 PCM。 此结构可用于将信息移动到 PCM 或从 PCM 移动信息。 |
设备需求
SCSI 硬盘, CD-ROM 以及读/写光盘驱动器具有以下硬件需求:
- SCSI 硬盘和读/写光盘驱动器必须支持每个块 512 个字节的块大小。
- 如果方式检测受支持,那么 SCSI 硬盘和读/写光盘驱动器也必须支持写保护 (WP) 位。
- SCSI 硬盘和读/写光盘驱动器必须报告已恢复错误的请求检测数据的硬件重试计数 (以字节 16 和 17 为单位)。 如果硬盘或读/写光盘驱动器不支持它,那么系统错误日志可能指示驱动器过早发生故障。
- SCSI CD-ROM 和读/写光盘驱动器必须支持 10 个字节的 SCSI 读命令。
- SCSI 硬盘和读/写光盘驱动器必须支持 SCSI 写和验证命令以及 6 个字节的 SCSI 写命令。
- 要在读/写光学介质上使用 格式 命令操作,磁带机必须支持将 SCSI 格式单元命令的缺陷列表头的有效格式选项 (FOV) 位设置为 0。 如果磁带机不支持此操作,那么用户可以为磁带机编写一个应用程序,以便它使用 DKFORMAT 操作来格式化介质。
- 如果 SCSI CD-ROM 驱动器使用 CD_ROM 数据方式 1,那么它必须支持每个块 512 字节的块大小。
- 如果 SCSI CD-ROM 驱动器使用 CD_ROM 数据方式 2 表单 1,那么它必须支持每个块 2048 字节的块大小。
- 如果 SCSI CD-ROM 驱动器使用 CD_ROM 数据方式 2 表单 2,那么它必须支持每个块 2336 字节的块大小。
- 如果 SCSI CD-ROM 驱动器使用 CD_DA 方式,那么它必须支持每个块 2352 字节的块大小。
- 要通过使用 DKAudio (播放音频) 操作来控制音量,设备必须支持 SCSI-2 方式数据页面 0xE。
- 要使用 DKAudio (播放音频) 操作,设备必须支持以下 SCSI-2 (可选) 命令:
- 读取子通道
- 暂停恢复
- 播放音频 MSF
- 播放音频跟踪索引
- 读取 TOC
错误条件数
当您使用 Scdisk 设备驱动程序时, ioctl, 开, 读和 写 子例程的可能 错误号 值包括:
| 项 | 描述 |
|---|---|
| EACCES | 指示下列其中一种情况:
|
| EBUSY | 指示下列其中一种情况:
|
| EFAULT | 指示无效用户地址。 |
| EFORMAT | 指示目标设备具有未格式化的介质或格式不兼容的介质。 |
| EINPROGRESS | 指示 CD-ROM 驱动器正在进行中的播放音频操作。 |
| EINVAL | 指示下列其中一种情况:
|
| EIO | 指示下列其中一种情况:
|
| EMEDIA | 指示下列其中一种情况:
|
| 电子文件 | 指示对已具有允许的最大打开设备数的适配器尝试了 开 操作。 |
| ENODEV | 指示下列其中一种情况:
|
| ENOTREADY | 指示驱动器中不存在任何介质。 |
| ENXIO | 指示下列其中一种情况:
|
| EPERM | 指示尝试的子例程需要适当的权限。 |
| ESTALE | 指示已弹出只读光盘 (未由用户先关闭) ,然后重新插入或替换为第二个光盘。 |
| ETIMEDOUT | 指示 I/O 操作超过指定的计时器值。 |
| EWRPROTET | 指示下列其中一种情况:
|
可靠性和可维护性信息
SCSI 硬盘设备, CD-ROM 驱动器和读/写光盘驱动器会返回以下错误:
| 项 | 描述 |
|---|---|
| 异常中止命令 | 指示设备已结束该命令 |
| Adapter 错误 | 指示适配器返回了一个错误 |
| 良好完成 | 指示命令已成功完成 |
| 硬件错误 | 指示在命令执行期间或自测试期间发生不可恢复的硬件故障 |
| 非法的请求 | 指示 incorect 命令或命令参数 |
| 介质错误 | 指示该命令以不可恢复的介质错误条件结束 |
| 未就绪 | 指示逻辑单元处于脱机状态或缺少介质 |
| 已恢复的错误 | 指示在应用某些恢复后命令已成功 |
| 单元辅助操作请求 | 指示设备已重置或电源已开启 |
介质错误的错误记录值
在硬盘, CD-ROM 和读/写光学介质错误的错误记录模板中定义的字段是:
| 项 | 描述 |
|---|---|
| Comment | 指示硬盘错误, CD-ROM 错误或读/写光学介质错误。 |
| Class | 等于 H 的值,这表示硬件错误。 |
| Report | 等于 True 值,这指示生成错误报告时必须包含此错误。 |
| Log | 等于值 True ,这表示发生此错误时必须创建错误日志条目。 |
| Alert | 等于值 False ,这表示此错误不可警报。 |
| Err_Type | 等于 Perm 的值,这表示永久故障。 |
| Err_Desc | 等于 1312 的值,这表示磁盘操作失败。 |
| Prob_Causes | 等于 5000 的值,这表示介质。 |
| User_Causes | 等于值 5100 ,这指示介质有缺陷。 |
| User_Actions | 等于以下值:
|
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于以下值:
|
| Fail_Actions | 等于以下值:
|
| Detail_Data | 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
|
请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。
硬件错误的错误记录值
在错误记录模板中针对硬盘, CD-ROM 和读/写光学硬件错误以及硬异常终止命令错误定义的字段为:
| 项 | 描述 |
|---|---|
| Comment | 指示硬盘错误, CD-ROM 错误或读/写光学硬件错误。 |
| Class | 等于 H 的值,这表示硬件错误。 |
| Report | 等于 True 值,这指示生成错误报告时必须包含此错误。 |
| Log | 等于值 True ,这表示发生此错误时必须创建错误日志条目。 |
| Alert | 等于值 FALSE ,这表示此错误不可警报。 |
| Err_Type | 等于 Perm 的值,这表示永久故障。 |
| Err_Desc | 等于 1312 的值,这表示磁盘操作失败。 |
| Prob_Causes | 等于 6310 的值,这表示磁盘驱动器。 |
| User_Causes | 无。 |
| User_Actions | 无。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于以下值:
|
| Fail_Actions | 等于 0000 的值,这指示必须执行问题确定过程。 |
| Detail_Data | 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
|
请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。
适配器的错误记录值-检测到硬件故障
在错误记录模板中为硬盘, CD-ROM 和读/写光学介质错误定义的字段 (适配器检测到的硬件错误) 为:
| 项 | 描述 |
|---|---|
| Comment | 指示适配器检测到的硬盘, CD-ROM 或读/写光学硬件故障。 |
| Class | 等于 H 的值,这表示硬件错误。 |
| Report | 等于 True 值,这指示生成错误报告时必须包含此错误。 |
| Log | 等于值 True ,这表示发生此错误时必须创建错误日志条目。 |
| Alert | 等于值 FALSE ,这表示此错误不可警报。 |
| Err_Type | 等于 Perm 的值,这表示永久故障。 |
| Err_Desc | 等于 1312 的值,这表示磁盘操作失败。 |
| Prob_Causes | 等于以下值:
|
| User_Causes | 无。 |
| User_Actions | 无。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于以下值:
|
| Fail_Actions | 等于 0000 的值,这指示必须执行问题确定过程。 |
| Detail_Data | 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
|
请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。
已恢复错误的错误记录值
在错误记录模板中为硬盘, CD-ROM 和读/写光学介质错误恢复的错误定义的字段是:
| 项 | 描述 |
|---|---|
| Comment | 指示硬盘, CD-ROM 或读/写光盘已恢复错误。 |
| Class | 等于 H 的值,这表示硬件错误。 |
| Report | 等于 True 值,这指示生成错误报告时必须包含此错误。 |
| Log | 等于值 True ,这表示发生此错误时必须创建错误日志条目。 |
| Alert | 等于值 FALSE ,这表示此错误不可警报。 |
| Err_Type | 等于 Temp 的值,这表示临时故障。 |
| Err_Desc | 等于 1312 的值,这表示物理卷操作失败。 |
| Prob_Causes | 等于以下值:
|
| User_Causes | 等于 5100 的值,表示介质有缺陷。 |
| User_Actions | 等于以下值:
|
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于以下值:
|
| Fail_Actions | 等于以下值:
|
| Detail_Data | 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
|
请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。
未知错误的错误记录值
在错误记录模板中为硬盘, CD-ROM 和读/写光学介质错误定义的未知错误的字段是:
| 项 | 描述 |
|---|---|
| Comment | 指示硬盘, CD-ROM 或读/写光盘的未知故障。 |
| Class | 等于 H 的值,这表示硬件错误。 |
| Report | 等于 True 值,这指示生成错误报告时必须包含此错误。 |
| Log | 等于值 True ,这表示发生此错误时必须创建错误日志条目。 |
| Alert | 等于值 FALSE ,这表示此错误不可警报。 |
| Err_Type | 等于值 Unkn ,这指示错误类型未知。 |
| Err_Desc | 等于 FE00的值,这表示未确定错误。 |
| Prob_Causes | 等于以下值:
|
| User_Causes | 无。 |
| User_Actions | 无。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 FFFF 值,这指示故障原因未知。 |
| Fail_Actions | 等于以下值:
|
| Detail_Data | 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
|
请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。
特殊文件
Scdisk SCSI 设备驱动程序在执行其功能时使用原始文件和块特殊文件。
Scdisk 设备驱动程序所使用的特殊文件包括以下内容 (按设备类型列出):
- 硬盘设备:
项 描述 /dev/rhdisk0, /dev/rhdisk1,..., /dev/rhdiskn 提供一个接口以允许 SCSI 设备驱动程序字符访问 (原始 I/O 访问和控制功能) 到 SCSI 硬盘。 /dev/hdisk0, /dev/hdisk1,..., /dev/hdiskn 提供一个接口以允许 SCSI 设备驱动程序阻止对 SCSI 硬盘的 I/O 访问。 - CD-ROM 设备:
项 描述 /dev/rcd0, /dev/rcd1,..., /dev/rcdn 提供一个接口以允许 SCSI 设备驱动程序字符访问 (原始 I/O 访问和控制功能) 到 SCSI CD-ROM 磁盘。 /dev/cd0, /dev/cd1,..., /dev/cdn 提供一个接口以允许 SCSI 设备驱动程序阻止对 SCSI CD-ROM 磁盘的 I/O 访问。 - 读/写光学设备:
项 描述 /dev/romd0, /dev/romd1,..., /dev/romdn 提供一个接口以允许 SCSI 设备驱动程序字符访问 (原始 I/O 访问和控制功能) 到 SCSI 读/写光学设备。 /dev/omd0, /dev/omd1,..., /dev/omdn 提供一个接口以允许 SCSI 设备驱动程序阻止对 SCSI 读/写光学设备的 I/O 访问。 特殊文件名上的 注: 前缀 R 指示驱动器是作为原始设备而不是作为块设备访问的。 使用硬盘, CD-ROM 或读/写光盘驱动器执行原始 I/O 时,所有数据传输都必须是设备块大小的倍数。 对原始设备驱动程序生成的所有 寻求 子例程都必须生成一个文件指针值,该值是设备块大小的倍数。