Libata错误信息解析

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/133

ata6.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 link

ata3.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

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值