症状

当外接磁盘使用的是 USB 3.0 时, 磁盘会随缘 freezes。

错误日志如下 (这个问题是几天前出现的,懒的去翻日志, 所以直接复制的网上和我一样的错误日志)

[ +10.195770] sd 7:0:0:0: [sdc] tag#2 data cmplt err -71 uas-tag 3 inflight: CMD
[  +0.000007] sd 7:0:0:0: [sdc] tag#2 CDB: opcode=0x2a 2a 00 01 d1 83 e0 00 00 28 00
[ +24.981444] sd 7:0:0:0: [sdc] tag#1 uas_eh_abort_handler 0 uas-tag 2 inflight: CMD IN
[  +0.000008] sd 7:0:0:0: [sdc] tag#1 CDB: opcode=0x28 28 00 0a 08 85 90 00 01 00 00
[  +0.000103] sd 7:0:0:0: [sdc] tag#8 uas_eh_abort_handler 0 uas-tag 9 inflight: CMD IN
[  +0.000006] sd 7:0:0:0: [sdc] tag#8 CDB: opcode=0x28 28 00 09 f3 fe 00 00 01 00 00
[  +0.000061] sd 7:0:0:0: [sdc] tag#0 uas_eh_abort_handler 0 uas-tag 1 inflight: CMD IN
[  +0.000005] sd 7:0:0:0: [sdc] tag#0 CDB: opcode=0x28 28 00 09 f3 f5 d8 00 01 00 00
[  +0.000049] sd 7:0:0:0: [sdc] tag#7 uas_eh_abort_handler 0 uas-tag 8 inflight: CMD OUT
[  +0.000005] sd 7:0:0:0: [sdc] tag#7 CDB: opcode=0x2a 2a 00 01 d1 84 c8 00 00 08 00
[  +0.000047] sd 7:0:0:0: [sdc] tag#6 uas_eh_abort_handler 0 uas-tag 7 inflight: CMD OUT
[  +0.000004] sd 7:0:0:0: [sdc] tag#6 CDB: opcode=0x2a 2a 00 01 d1 84 b8 00 00 08 00
[  +0.003514] sd 7:0:0:0: [sdc] tag#5 uas_eh_abort_handler 0 uas-tag 6 inflight: CMD OUT
[  +0.000008] sd 7:0:0:0: [sdc] tag#5 CDB: opcode=0x2a 2a 00 01 d1 84 78 00 00 08 00
[  +0.003470] sd 7:0:0:0: [sdc] tag#4 uas_eh_abort_handler 0 uas-tag 5 inflight: CMD OUT
[  +0.000005] sd 7:0:0:0: [sdc] tag#4 CDB: opcode=0x2a 2a 00 01 d1 84 30 00 00 08 00
[  +0.003454] sd 7:0:0:0: [sdc] tag#3 uas_eh_abort_handler 0 uas-tag 4 inflight: CMD OUT
[  +0.000006] sd 7:0:0:0: [sdc] tag#3 CDB: opcode=0x2a 2a 00 01 d1 84 20 00 00 08 00
[  +0.003478] sd 7:0:0:0: [sdc] tag#2 uas_eh_abort_handler 0 uas-tag 3 inflight: CMD
[  +0.000004] sd 7:0:0:0: [sdc] tag#2 CDB: opcode=0x2a 2a 00 01 d1 83 e0 00 00 28 00
[  +0.055769] scsi host7: uas_eh_device_reset_handler start
[  +0.150438] usb 4-3: reset SuperSpeed USB device number 3 using xhci_hcd
[  +0.032045] scsi host7: uas_eh_device_reset_handler success

复现

大量的频繁的 读写时可复现。

问题原因

UAS (USB Attached SCSI) 是 USB 3.0 的一种新的传输协议 (支持多线程,命令排队等。我也不知道这是个啥,反正听起来很厉害就是了)。

当然这么厉害的东西也不是轻易就能使用的,得满足以下条件。

  • 设备的硬件本身支持 UAS
  • 设备的固件支持 UAS
  • UAS support inside the driver stack of the USB (不知这个该如何翻译)
  • System controller which is compatible with the UAS (这个也是)

四者缺一不可,否则就会出现上述的问题。

解决

通过添加一个内核参数禁用掉 UAS 来解决此问题。

使用内核命令行

usb-storage.quirks=Vendor_ID:Product_ID:u

使用 modprobe

options usb-storage quirks=Vendor_ID:Product_ID:u

方法来源:

uas problem in linux 3.15.1, need advice on the problem [SOLVED]

Connection problem with USB3 external storage on Linux (UAS driver problem)

题外

我需要用到的外接磁盘很多 (有时候还会使用他人的磁盘), 所以最开始是排斥这个方法的。

结果在网上搜索了一圈又一圈, 发现并没有更好的解决方法。

为防止又随缘 freezes, 还是选择把所有会用到的外接磁盘都 block 了 (宁可错杀一千,也不放过一个), 不然又得陷入无休止的 fsck 中。