Libata错误信息解析
原文(Libata error messages)来源:
https://ata.wiki.kernel.org/index.php/Libata_error_messages
概述
内核产生所有的libata错误信息都使用以下标准格式:
ata3.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x2 frozen
ata3.00: cmd ea/00:00:00:00:00/00:00:00:00:00/a0 tag 0
res 40/00:00:01:4f:c2/00:00:00:00:00/00 Emask 0x4 (timeout)
ata3.00: status: { DRDY }
前缀
错误每一行都有前缀,前缀ata3.00解释为:
- ata:该前缀指明这是条libata端口或设备信息
- 3:端口号,从1开始记
- 00:设备号,一般从0记,除非端口多路复用或是使用PATA主从设备
例子ata3.00指的是ata的第3个端口第一个设备
异常描述行 ###
异常描述行(第一行)给出异常处理状态(EH)概述
exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x2 frozen
- Emask:错误分类掩码(代码中的 AC_ERR_xxx )
- SAct:SATA SActive 寄存器
- SErr:SATA SError 寄存器
- action: ATA_EH_xxx操作,如revalidate,softreset,hardreset(参见include / linux / libata.h)
- frozen:如果存在,表示端口被冻结为EH
- t3:这项也是可选的,表重试次数,t3表示3次
输入任务文件
cmd行(第二行)给出了发送到设备的ATA命令(taskfile)
cmd ea / 00:00:00:00:00/00:00:00:00:00 / a0 tag 0
上述命令按’/’及空格分割分5段解释:
- ea:命令号
- 00:00:00:00:00:(第一个)Feature : NSect : LBA L : LBA M : LBA H
- 00:00:00:00:00:(第二个)HOB Feature : HOB NSect : HOB LBA L : HOB LBA M : HOBLBA H
- a0:设备/头
- tag : NCQ tag 号, NCQ如果没有激活或不适用,则为0。
输出任务文件与错误摘要 ###
这一行(第三行)包含当前ATA设备寄存器的dump信息及错误摘要:
res 40/00:00:01:4f:c2 / 00:00:00:00:00/00 Emask 0x4(time out)
与输入差不多,按6段解析:
- 40:状态
- 00:00:01:4f:c2 :依次为Error : NSect : LBA L : LBA M : LBA H
- 00:00:00:00:00:依次为HOB Error : HOB NSect : HOB LBA L : HOB LBA M : HOBLBA H
- 00:设备/头
- Emask:ATA命令的内部错误掩码(对应源代码中的AC_ERR_xxx)
- time out:错误摘要,这只是其中一种错误
所有的错误可能的分类列举如下:
- host bus erro :主机总线错误,主机< - >芯片总线错误(如PCI,如果是在PCI总线上)
- ATA bus error:ATA总线错误, 芯片< - >设备总线错误
- timeout:超时, 控制器无法响应激活的ATA命令。这可能是任何原因。大多数情况下,这是由于一个不相关的中断子系统错误(尝试使用’pci = nomsi’或’acpi = off’或’noapic’启动),当我们期望硬件发中断时,它却无法发送中断。
- HSM violation:HSM违规, 硬件无法以预期的方式响应。“HSM”代表Host State Machine,它是ATA所需的基于软件的有限状态机,它根据当前的ATA命令和其他硬件状态编程细节来预期某些硬件行为。
- internal error:内部错误 ,硬件标记了一个不可能的情况,很可能是由于软件编程的错误导致。
- media error:媒体错误,软件检测到媒体错误
- invalid argument:无效参数, 由于某种原因,软件将ATA命令标记为无效
- device error:设备错误,硬件表示上一个命令出错。此错误直接从ATA设备传送。如果你看到很多这些,那通常表明存在硬件问题。
- unknown error:未知错误(不应该发生这种情况)
ATA状态与错误扩展
最后一行显示状态信息,这一行可以为status,也可以为ERR,关键看寄存器中的位怎么置的。
ATA状态扩展
status: { DRDY }
将输出任务文件中返回的ATA状态寄存器扩展为其组件位:
- Busy:设备忙(所有其他位无效)
- DRDY:设备就绪,正常的情况下一般为1。
- DRQ:数据准备好通过PIO发送/接收
- DF: 设备故障
- ERR: 错误(有关详细信息,请参阅错误寄存器)
ATA错误扩展
如果错误寄存器中的任何位置1,则错误寄存器内容将扩展为其组件位,例如:
error: { ICRC ABRT }
- ICRC:Ultra DMA传输时接口CRC错误 - 通常是线或电源问题,驱动程序设置错误的Ultra DMA模式也会导致该问题
- UNC : 无法纠正的错误 - 通常是由于磁盘上的坏扇区造成的
- IDNF :未找到请求的地址
- ABRT : 命令已中止 - 或者命令不支持,无法完成或接口CRC存在问题(如上例,与ICRC一起出)
SATA SError扩展
如果SATA SError寄存器中的任何位置1,则SError寄存器内容将扩展为其组件位,例如:
SError:{PHYRdyChg CommWake}
这些寄存器的位通常是由SATA host接口设置的,以响应SATA链路上的错误。除非设备热插拔或拔出操作,否则这些位不会被设置。如果这些位被置上了,则强烈怀疑是硬件问题(通常是SATA线不行或电源不良或供电不足)。
- RecovData:出现数据完整性错误,但接口已恢复
- RecovComm:设备和主机之间的通信暂时丢失,但已重连上了
- UnrecovData:发生数据完整性错误,但接口没有恢复
- Persist:持久通信或数据完整性错误
- Proto:检测到SATA协议不符合规范
- HostInt:主设备总线适配器内部错误
- PHYRdyChg:PhyRdy信号状态改变
- PHYInt:PHY内部错误
- CommWake:PHY检测到COMWAKE(PHY唤醒)
- 10B8B:10b到8b的解码错误
- Dispar:检测到不正确的差异
- BadCRC:链路层CRC错误
- Handshk: 帧传输返回接收到了R_ERR握手响应
- LinkSeq:链路状态机错误
- TrStaTrns :传输层状态转换错误
- UnrecFIS:收到无法识别的FIS(帧信息结构)
- DevExch:设备存在状态改变
其他
相关资源
上面文章提到了几个头文件,如下链接有相关信息:
https://code.woboq.org/linux/linux/include/linux/libata.h.html
也可以在linux源码里找到,如:
/usr/src/linux-source-3.13.0/include/linux/libata.h
enum
{
/* reset / recovery action types */
ATA_EH_REVALIDATE = (1 << 0),
ATA_EH_SOFTRESET = (1 << 1), /* meaningful only in ->prereset */
ATA_EH_HARDRESET = (1 << 2), /* meaningful only in ->prereset */
ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET,
ATA_EH_ENABLE_LINK = (1 << 3),
ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */
ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK,
ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET | ATA_EH_ENABLE_LINK,
};
enum ata_completion_errors
{
AC_ERR_DEV = (1 << 0), /* device reported error */
AC_ERR_HSM = (1 << 1), /* host state machine violation */
AC_ERR_TIMEOUT = (1 << 2), /* timeout */
AC_ERR_MEDIA = (1 << 3), /* media error */
AC_ERR_ATA_BUS = (1 << 4), /* ATA bus error */
AC_ERR_HOST_BUS = (1 << 5), /* host bus error */
AC_ERR_SYSTEM = (1 << 6), /* system error */
AC_ERR_INVALID = (1 << 7), /* invalid argument */
AC_ERR_OTHER = (1 << 8), /* unknown */
AC_ERR_NODEV_HINT = (1 << 9), /* polling device detection hint */
AC_ERR_NCQ = (1 << 10), /* marker for offending NCQ qc */
};
收集的报错信息
上面文章提到的磁盘报错格式,与实际的可能不一致,文章里的字段说明也比较粗略,深入了解的话,需进一步弄懂每个字段含义,或者是了解ata协议才行,这个得慢慢来,下面是平时收集的一些信息,先贴出来,方便后续分析。
ata2.01: exception Emask 0x10 SAct 0x0 SErr 0x4050000 action 0xf
ata2.01: SError: { PHYRdyChg CommWake DevExch }
ata4.01: exception Emask 0x10 SAct 0x0 SErr 0x10002 action 0xf
ata4.01: SError: { RecovComm PHYRdyChg }
ata7.00: exception Emask 0x10 SAct 0x0 SErr 0x4050000 action 0xf
ata7.00: SError: { PHYRdyChg CommWake DevExch }
libata: notify userspace Error info msg, serror 0x4050000, error_class 0x0, ata_status 0x0, ata_error 0x0
ata7.00: hard resetting link
ata4.04: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x6
ata4.04: waking up from sleep
ata4.04: hard resetting link
ata4.04: SATA link up 6.0 Gbps (SStatus 133 SControl 330)
ata5: exception Emask 0x10 SAct 0x0 SErr 0x10000 action 0xe frozen
ata5: irq_stat 0x00400000, PHY RDY changed
ata5: SError: { PHYRdyChg }
ata5: hard resetting link
ata5: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata5.00: configured for UDMA/133ata6.01: exception Emask 0x0 SAct 0xc SErr 0x0 action 0x0
ata6.01: failed command: READ FPDMA QUEUED
ata6.01: cmd 60/01:10:a2:86:d4/00:00:01:00:00/40 tag 2 ncq 512 in
ata6.01: status: { DRDY ERR }
ata6.01: error: { UNC }
ata6.01: configured for UDMA/133
ata6.01: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ata6.01: failed command: FLUSH CACHE EXT
ata6.01: cmd ea/00:00:00:00:00/00:00:00:00:00/a0 tag 8
ata6.01: status: { DRDY DF ERR }
ata6.01: error: { ABRT }
ata6.01: both IDENTIFYs aborted, assuming NODEV
ata6.01: revalidation failed (errno=-2)
ata6.01: hard resetting linkata3.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ata3.00: irq_stat 0x40000000
ata3.00: cmd 25/00:00:b1:39:70/00:02:74:00:00/e0 tag 0 dma 262144 in
res 51/40:00:34:3a:70/00:00:74:00:00/00 Emask 0x9 (media error)
ata3.00: status: { DRDY ERR }
ata3.00: error: { UNC }
ata5.02: failed to read SCR 1 (Emask=0x40)
ata5.15: exception Emask 0x10 SAct 0x0 SErr 0x4410000 action 0xe frozen
ata5.15: irq_stat 0x00400000, PHY RDY changed
ata5.15: SError: { PHYRdyChg Handshk DevExch }
ata5.02: exception Emask 0x100 SAct 0x8000 SErr 0x0 action 0x6 frozen
ata5.02: failed command: READ FPDMA QUEUED
ata5.02: cmd 60/00:78:a0:53:11/01:00:00:00:00/40 tag 15 ncq 131072 in
res 40/00:78:a0:53:11/00:00:00:00:00/40 Emask 0x100 (unknown error)
ata5.02: status: { DRDY }
ata1.03: exception Emask 0x10 SAct 0x0 SErr 0x280100 action 0x2 frozen
ata1.03: irq_stat 0x08000000, interface fatal error
ata1: SError: { UnrecovData 10B8B BadCRC }
ata1.03:cmd 25/00:00:c7:d4:56/00:02:05:00:00/e0 tag 0 dma 262144 in
res 50/00:00:c6:d4:56/00:00:05:00:00/e0 Emask 0x10 (ATA bus error)
ata1.03: status: { DRDY }
ata1: hard resetting link