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_LUNSC_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中定义) 的地址,并且结构填充如下:
  1. page_codesubpage_code (对于请求的日志页面)
  2. 和平与发展 设置为值 CUMUL_VAL
  3. 分配长度 -如果此字段设置为零,那么将仅返回由 页代码 和日志页长度组成的日志页头。 如果此字段为非零值,那么它必须等于日志页的长度 (不包括大小为 4 字节的日志页头)。 如果用户指定的分配长度小于实际日志页长度,那么将仅返回所请求的日志数据长度。
  4. log_data 包含已分配的内存地址,用于存储从 ioctl 操作返回的数据。

如果请求的日志页面是 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_datasizeof struct sc_bsr_log_data 和内存的总量等于 分配长度

否则 (对于除 SCSI_BSR_LOG_PAGE之外的日志页) ,它将指向等于 分配长度的内存块。

以下是用于填充 sc_log_sense 结构的示例代码:

struct sc_log_sense log_sense;

melog_sense, '\0', sizeof(struct sc_log_sense));
log_sense.page_code = SCSI_BSR_LOG_PAGE ;
log_sense.subpage_code = 0; 
log_sense.pc = CUMUL_VAL;
log_sense.allocation_length = 16; 
if (log_sense.allocation_length) 
 {  
 if (log_sense.page_code == SCSI_BSR_LOG_PAGE)
  {    
   log_sense.log_data = (struct sc_bsr_log_data *) malloc(sizeof(struct sc_bsr_log_data));  
  }
  else 
  { 
   log_sense.log_data = (char *) malloc(log_sense.allocation_length); 
  }      
  if (log_sense.log_data == NULL)   
  exit(-1); 
  if (log_sense.page_code == SCSI_BSR_LOG_PAGE)
  {
   bms_param_len = log_sense.allocation_length - sizeof(struct sc_scan_status);
   ((struct sc_bsr_log_data *)(log_sense.log_data))-> bms_log_data = (struct sc_bms_log_data *)
	 malloc(bms_param_len); 
  if (((struct sc_bsr_log_data *)(log_sense.log_data))-> bms_log_data == NULL)
  exit(-1);
  }
 }
 rc = ioctl(fd, DKLOGSENSE,&log_sense);
 
DKLOGSENSE ioctl 操作通过使用 struct sc_log_sense (rc=0 指示成功) 返回以下数据:
  1. 返回长度 字段包含所请求字节的长度或零 (如果用户指定分配长度为零)。
  2. 已设置 适配器状态scsi_status森塞基Scsi_ascScsi_ascq ,但具有 日志 SENSE 命令的错误返回状态。
  3. log_data 字段指向包含由 日志 SENSE 命令返回的数据的内存。 驱动程序将解析和填充 struct sc_bsr_log_datastruct bms_log_data 的字段 (对于 后台扫描结果日志页面)。 ioctl 调用者打印结构字段以查看数据。 否则,对于 返回长度的日志数据,此内存是 字符 * 。 该数据排除了日志页标题。
if (log_sense.page_code == SCSI_BSR_LOG_PAGE) 
{
    bms_cnt = (log_sense.returned_length - 16)/24;
    printf("Background Scan Results Log Page:\n");
    printf("Scanning Status Parameter:\n");
    bsr_log_data = (struct sc_bsr_log_data *)log_sense.log_data;
    scan_status  = &(bsr_log_data->scan_status);
    printf("Parameter Code \t:\t %x\n", scan_status->param_code);
    printf("Parameter Control Byte \t:\t %x",scan_status->param_ctrl_bits);
    printf("Parameter Length \t:\t %x\n", scan_status->param_length);
    printf("Power Age \t:\t %x\n", scan_status->power_age);
    printf("Scan Status \t:\t %x\n", scan_status->scan_status);
    printf("Scan Count \t:\t %x\n", scan_status->scan_count);
    printf("Scan Progress \t:\t %x \n", scan_status->scan_progress);
    printf("BMS Count \t:\t %x\n", scan_status->bms_count);
    printf("Background Medium Scan Parameter for %d Elements:\n",bms_cnt);
       
    for (i=0; <ibms_cnt; i++)
    {
        bms_data = bsr_log_data->bms_log_data;
        printf("Parameter Code \t:\t %x\n", bms_data->param_code);
        printf("Parameter Control Byte \t:\t%x",bms_data->param_ctrl_bits);
        printf("Parameter Length \t:\t %x\n", bms_data->param_length);
        printf("Power Age \t:\t %x\n", bms_data->power_age);
        printf("SenseKey & Reassign Status \t:\t %x\n",bms_data->status_snskey);
        printf("ASC \t:\t %x\n", bms_data->asc);
        printf("ASCQ \t:\t %x\n", bms_data->ascq);

        for (j=0; j<5; j++)
            printf("vendor_data[%d] \t:\t%x\n",j,bms_data->vendor_data[j]);

        printf("LBA \t:\t %llx\n", bms_data->lba);
    }

} else {
    Log data received is a char buffer of ‘returned_length' size.
    So print the data byte by byte.
}
DKLOGSELECT

提供了发出 日志 SELECT 命令的方法。

发出 DKLOGSELECT ioctl 操作的任何应用程序都应该传递 DKLOGSELECT (在 /usr/include/sys/scsi.h中定义) 的地址,如下所示:
  1. page_codesubpage_code (对于请求的日志页面)
  2. 和平与发展和平与发展参数长度 (根据 SCSI 主 4 标准版本 4 (SPC4) 需求)。
  3. log_data 会指向包含必须发送到 日志 SELECT 命令的参数的内存。
以下示例是填充 sc_log_select 结构以清除 SCSI_BSR_LOG_PAGE 数据 **的示例。
struct sc_log_select log_select;

memset(&log_select, '\0', sizeof(struct sc_log_select));
log_select.page_code = SCSI_BSR_LOG_PAGE;
log_select.subpage_code = 0;
log_select.pcr = 1;
log_select.sp = 0;
log_select.pc = CUMUL_VAL;
log_select.param_length = 0;
if (log_select.param_length) 
{
 log_select.log_data = (char *)malloc(log_select.param_length);
 if (log_select.log_data == NULL) exit(-1);
} 
rc = ioctl(fd, DKLOGSELECT,&log_select);   
ioctl 操作通过使用报告 日志 SELECT 命令的错误完成状态的 struct sc_log_select (rc=0 指示成功) 适配器状态scsi_status森塞基Scsi_ascScsi_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) 规范 ,以了解特定设备的请求检测数据的格式。

注: 诊断方式仅对于 CDIOCMDDKIOCMD 操作是必需的。

硬盘, 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) 规范 ,以了解特定设备的请求检测数据的格式。

注: 诊断方式仅对于 CDIOCMDDKIOCMD 操作是必需的。
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 数据方式:
CD-ROM 数据方式 1
通过原始 (dev/rcd*) 和块特殊 (/dev/cd*) 文件的 512 字节块大小
CD-ROM 数据方式 2 表单 1
2048 字节的块大小 (通过原始 (dev/rcd*) 和块特殊 (/dev/cd*) 文件)
CD-ROM 数据方式 2 表单 2
仅通过原始 (dev/rcd*) 特殊文件的 2336 字节块大小
光盘 (紧凑光盘数字音频)
仅通过原始 (dev/rcd*) 特殊文件的 2352 字节块大小
DVD-ROM
2048 字节的块大小 (通过原始 (/dev/rcd *) 和块特殊 (/dev/cd *) 文件)
DVD-RAM
2048 字节的块大小 (通过原始 (/dev/rcd *) 和块特殊 (/dev/cd *) 文件)
DVD-RW
2048 字节的块大小 (通过原始 (/dev/rcd *) 和块特殊 (/dev/cd *) 文件)

DK_CD_MODE arg 参数包含 /usr/include/sys/scdisk.h 文件中定义的 mode_form_op 结构的地址。 要让 DK_CD_MODE 操作确定或更改 CD-ROM 数据方式,请将actionchange_mode_form 结构的字段为下列其中一个值:

CD_GET_MODE
返回当前 CD-ROM 数据方式 (在cd_mode_formmode_form_op 结构的字段 (在成功打开设备时)。
CD_CHG_MODE
将 CD-ROM 数据方式更改为指定的方式。cd_mode_formmode_form_op 结构的字段,在互斥存取方式下成功打开设备时。

如果未针对不同数据方式配置 CD-ROM (通过方式-选择密度代码) ,并且尝试更改 CD-ROM 数据方式 (通过设置actionchange_mode_form结构的字段设置为 CD_CHG_MODE),子例程将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 将 CD-ROM 模式更改为任何 DVD 模式的尝试也会导致 -1 返回值和 errno 全局变量设置为 EINVAL

如果在设备不处于独占访问模式时尝试 DK_CD_MODECD_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 全局变量设置为 EINVALEinval_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的值,并且用户可以提供以下字段:
  • 变量 _cdb_ptr 是指向包含 Variable SCSI cdb 的缓冲区的指针。
  • variable_cdb_length 确定 变量 _cdb_ptr 字段所指向的 欧洲委员会 变量的长度。
在完成 DK_PASSTHRU ioctl 请求后, 残值 字段指示设备未完全满足此请求的剩余数据。 在成功完成时, 残值 字段将指示设备不具有所请求的所有数据,或者设备具有的数据量小于所请求的数据量。 在故障完成时,用户必须检查 status_validity 字段以确定是否存在有效的 SCSI 总线问题。 在此情况下, 残值 字段将指示此请求的设备未能完成的字节数。
  开发信息 结构定义了该命令的最大传输大小。 如果尝试传输的大小超过最大传输大小,子程序将返回 -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 状态的解释如下所示:
  • 在成功尝试调用时,将返回 0。
  • 调用失败后,将返回 -1 并设置 errno 全局变量。 有关 errno 值的具体说明,请参阅 /usr/include/erno.h 。 此外,还会设置 SCSI 状态以及 Sense Code , ASC 和 ASCQ ,以提供有关命令失败原因的更多信息。 请参阅 SCSI 规范以了解 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 指示下列其中一种情况:
  • 尝试打开当前以 "诊断" 或 "互斥访问" 方式打开的设备。
  • 已尝试在已打开的设备上打开诊断方式会话。
  • 用户在处于诊断方式时尝试了除 ioctl 关闭 子例程之外的子例程。
  • 在未处于诊断方式的设备上尝试了 DKIOCMDCDIOCMD 操作。
  • 在未处于互斥访问方式的设备上尝试了 DK_CD_MODE ioctl 子例程操作。
  • 在未处于 "互斥访问" 方式的设备上尝试了 DKFORMAT 操作。
EBUSY 指示下列其中一种情况:
  • 已尝试在已打开的设备上以 "互斥访问" 方式打开会话。
  • 目标设备由另一个发起方保留。
EFAULT 指示无效用户地址。
EFORMAT 指示目标设备具有未格式化的介质或格式不兼容的介质。
EINPROGRESS 指示 CD-ROM 驱动器正在进行中的播放音频操作。
EINVAL 指示下列其中一种情况:
  • 对于未配置为使用 SCSI-2 播放音频命令的设备,已尝试执行 DKAudio (play-audio) 操作。
  • 子例程提供了 nbyte 参数,该参数不是块大小的偶数倍。
  • 对于 CDIORDSEDKIOWRSEDKiordse ioctl 子例程操作,大于 255 个字节的检测数据缓冲区长度无效。
  • 对于 CDIORDSECDIOCMDDKiordseDKIOWRSEDKIOCMD ioctl 子例程操作,数据缓冲区长度超过了 开发信息 结构中定义的最大值。
  • 尝试了不受支持的 ioctl 子例程操作。
  • 对于 CDIOCMD ioctl 子例程操作,大于 CD-ROM 驱动器所允许长度的数据缓冲区长度是无效的。
  • 已尝试配置仍处于打开状态的设备。
  • 给出了不正确的配置命令。
  • 已向不支持可移动介质的设备发送 DKPMR (阻止介质除去) , DKAMR (允许介质除去) 或 DKEJECT (弹出介质) 命令。
  • DKEJECT (弹出介质) 命令已发送到当前将其介质锁定在磁带机中的设备。
  • 数据缓冲区长度超过了为 策略 操作定义的最大值。
EIO 指示下列其中一种情况:
  • 找不到目标设备或目标设备未响应。
  • 目标设备指示不可恢复的硬件错误。
EMEDIA 指示下列其中一种情况:
  • 目标设备指示不可恢复的介质错误。
  • 媒体已更改。
电子文件 指示对已具有允许的最大打开设备数的适配器尝试了 操作。
ENODEV 指示下列其中一种情况:
  • 尝试了访问未定义的设备。
  • 已尝试关闭未定义的设备。
ENOTREADY 指示驱动器中不存在任何介质。
ENXIO 指示下列其中一种情况:
  • ioctl 子例程提供了无效参数。
  • 已尝试在硬盘结束之后执行 操作。
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 等于以下值:
  • 0000 ,它指示必须执行问题确定过程
  • 1601 ,它指示必须更换并重试可移动介质
Inst_Causes 无。
Inst_Actions 无。
Fail_Causes 等于以下值:
  • 5000 ,指示介质发生故障
  • 6310 ,表示磁盘驱动器发生故障
Fail_Actions 等于以下值:
  • 0000 ,它指示必须执行问题确定过程
  • 1601 ,它指示必须更换可移动介质并重试
Detail_Data 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注意:
Detail_Dataerr_rec 结构中的字段包含 sc_error_log_df 结构。 err_rec 结构在 /usr/include/sys/errids.h 文件中定义。 sc_error_log_df 结构在 /usr/include/sys/scsi.h 文件中定义。

sc_error_log_df 结构中包含以下字段:

req_sense_data
包含来自发生错误的特定设备的请求检测信息 (如果此信息有效)。
reserved2
包含段计数,它是在发生错误时从设备读取的兆字节数。
reserved3
包含自最近一次增加段计数以来读取的字节数。

请参阅 小型计算机系统接口 (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 等于以下值:
  • 6310 ,表示磁盘驱动器发生故障
  • 6330 ,指示磁盘驱动器电子部件发生故障
Fail_Actions 等于 0000 的值,这指示必须执行问题确定过程。
Detail_Data 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注意:
Detail_Dataerr_rec 结构中的字段包含 sc_error_log_df 结构。 err_rec 结构在 /usr/include/sys/errids.h 文件中定义。 sc_error_log_df 结构在 /usr/include/sys/scsi.h 文件中定义。

sc_error_log_df 结构中包含以下字段:

req_sense_data
包含来自发生错误的特定设备的请求检测信息 (如果此信息有效)。
reserved2
包含段计数,它是在发生错误时从设备读取的兆字节数。
reserved3
包含自最近一次增加段计数以来读取的字节数。

请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。

适配器的错误记录值-检测到硬件故障

在错误记录模板中为硬盘, CD-ROM 和读/写光学介质错误定义的字段 (适配器检测到的硬件错误) 为:

描述
Comment 指示适配器检测到的硬盘, CD-ROM 或读/写光学硬件故障。
Class 等于 H 的值,这表示硬件错误。
Report 等于 True 值,这指示生成错误报告时必须包含此错误。
Log 等于值 True ,这表示发生此错误时必须创建错误日志条目。
Alert 等于值 FALSE ,这表示此错误不可警报。
Err_Type 等于 Perm 的值,这表示永久故障。
Err_Desc 等于 1312 的值,这表示磁盘操作失败。
Prob_Causes 等于以下值:
  • 3452 ,指示设备电缆发生故障
  • 6310 ,表示磁盘驱动器发生故障
User_Causes 无。
User_Actions 无。
Inst_Causes 无。
Inst_Actions 无。
Fail_Causes 等于以下值:
  • 3452 ,指示存储设备电缆发生故障
  • 6310 ,表示磁盘驱动器发生故障
  • 6330 ,指示磁盘驱动器的电子故障
Fail_Actions 等于 0000 的值,这指示必须执行问题确定过程。
Detail_Data 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注意:
Detail_Dataerr_rec 结构中的字段包含 sc_error_log_df 结构。 err_rec 结构在 /usr/include/sys/errids.h 文件中定义。 sc_error_log_df 结构在 /usr/include/sys/scsi.h 文件中定义。

sc_error_log_df 结构中包含以下字段:

req_sense_data
包含来自发生错误的特定设备的请求检测信息 (如果此信息有效)。
reserved2
包含段计数,它是在发生错误时从设备读取的兆字节数。
reserved3
包含自最近一次增加段计数以来读取的字节数。

请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。

已恢复错误的错误记录值

在错误记录模板中为硬盘, CD-ROM 和读/写光学介质错误恢复的错误定义的字段是:

描述
Comment 指示硬盘, CD-ROM 或读/写光盘已恢复错误。
Class 等于 H 的值,这表示硬件错误。
Report 等于 True 值,这指示生成错误报告时必须包含此错误。
Log 等于值 True ,这表示发生此错误时必须创建错误日志条目。
Alert 等于值 FALSE ,这表示此错误不可警报。
Err_Type 等于 Temp 的值,这表示临时故障。
Err_Desc 等于 1312 的值,这表示物理卷操作失败。
Prob_Causes 等于以下值:
  • 5000 ,指示介质发生故障
  • 6310 ,表示磁盘驱动器发生故障
User_Causes 等于 5100 的值,表示介质有缺陷。
User_Actions 等于以下值:
  • 0000 ,它指示必须执行问题确定过程
  • 1601 ,它指示必须更换可移动介质并重试
Inst_Causes 无。
Inst_Actions 无。
Fail_Causes 等于以下值:
  • 5000 ,指示介质发生故障
  • 6310 ,表示磁盘驱动器发生故障
Fail_Actions 等于以下值:
  • 0000 ,它指示必须执行问题确定过程
  • 1601 ,它指示必须更换可移动介质并重试
Detail_Data 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注意:
Detail_Dataerr_rec 结构中的字段包含 sc_error_log_df 结构。 err_rec 结构在 /usr/include/sys/errids.h 文件中定义。 sc_error_log_df 结构在 /usr/include/sys/scsi.h 文件中定义。

sc_error_log_df 结构中包含以下字段:

req_sense_data
包含来自发生错误的特定设备的请求检测信息 (如果此信息有效)。
reserved2
包含段计数,它是在发生错误时从设备读取的兆字节数。
reserved3
包含自最近一次增加段计数以来读取的字节数。

请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。

未知错误的错误记录值

在错误记录模板中为硬盘, CD-ROM 和读/写光学介质错误定义的未知错误的字段是:

描述
Comment 指示硬盘, CD-ROM 或读/写光盘的未知故障。
Class 等于 H 的值,这表示硬件错误。
Report 等于 True 值,这指示生成错误报告时必须包含此错误。
Log 等于值 True ,这表示发生此错误时必须创建错误日志条目。
Alert 等于值 FALSE ,这表示此错误不可警报。
Err_Type 等于值 Unkn ,这指示错误类型未知。
Err_Desc 等于 FE00的值,这表示未确定错误。
Prob_Causes 等于以下值:
  • 3300 (指示适配器故障)
  • 5000 ,指示介质发生故障
  • 6310 ,表示磁盘驱动器发生故障
User_Causes 无。
User_Actions 无。
Inst_Causes 无。
Inst_Actions 无。
Fail_Causes 等于 FFFF 值,这指示故障原因未知。
Fail_Actions 等于以下值:
  • 0000 ,它指示必须执行问题确定过程
  • 1601 ,它指示必须更换可移动介质并重试
Detail_Data 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注意:
Detail_Dataerr_rec 结构中的字段包含 sc_error_log_df 结构。 err_rec 结构在 /usr/include/sys/errids.h 文件中定义。 sc_error_log_df 结构在 /usr/include/sys/scsi.h 文件中定义。

sc_error_log_df 结构中包含以下字段:

req_sense_data
包含来自发生错误的特定设备的请求检测信息 (如果此信息有效)。
reserved2
包含段计数,它是在发生错误时从设备读取的兆字节数。
reserved3
包含自最近一次增加段计数以来读取的字节数。

请参阅 小型计算机系统接口 (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 时,所有数据传输都必须是设备块大小的倍数。 对原始设备驱动程序生成的所有 寻求 子例程都必须生成一个文件指针值,该值是设备块大小的倍数。