
다음 문제에 직면했습니다. btrfs가 장치의 섹터 128에 대한 쓰기 오류를 보고합니다 /dev/sdd
.
sd 6:0:0:0: [sdd] Invalid command failure
sd 6:0:0:0: [sdd] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
sd 6:0:0:0: [sdd] Sense Key : Illegal Request [current]
sd 6:0:0:0: [sdd] Add. Sense: Invalid field in cdb
sd 6:0:0:0: [sdd] CDB: Write(10): 2a 08 00 00 00 80 00 00 08 00
end_request: critical target error, dev sdd, sector 128
BTRFS: lost page write due to I/O error on /dev/sdd
BTRFS: bdev /dev/sdd errs: wr 913238, rd 1, flush 150, corrupt 0, gen 0
나는 이것을 실행했고 badblocks /dev/sdd
불량 블록을 반환하지 않았습니다. 어쨌든, 나는 (어느 정도) 안전을 유지하기로 결정하고 섹터 2048(기본값)에서 시작하는 파티션을 만들었습니다.
# fdisk -l /dev/sdd
Device Boot Start End Sectors Size Id Type
/dev/sdd1 2048 234441647 234439600 111.8G 83 Linux
드라이브를 btrfs 볼륨에 다시 추가하십시오. 즉시 동일한 쓰기 오류가 다시 발생합니다(참고, 2176 = 2048 + 128).
sd 13:0:0:0: [sdd] Invalid command failure
sd 13:0:0:0: [sdd] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
sd 13:0:0:0: [sdd] Sense Key : Illegal Request [current]
sd 13:0:0:0: [sdd] Add. Sense: Invalid field in cdb
sd 13:0:0:0: [sdd] CDB: Write(10): 2a 08 00 00 08 80 00 00 08 00
end_request: critical target error, dev sdd, sector 2176
BTRFS: lost page write due to I/O error on /dev/sdd1
BTRFS: bdev /dev/sdd1 errs: wr 12253, rd 0, flush 0, corrupt 0, gen 0
섹터 128과 2176이 모두 불량입니까? 좋아, 다시 실행하고 badblocks /dev/sdd
(다시 말해 불량 블록이 보고되지 않음) 파티션을 더 푸시했습니다.
# fdisk -l /dev/sdd
Device Boot Start End Sectors Size Id Type
/dev/sdd1 4096 234441647 234437552 111.8G 83 Linux
btrfs 볼륨을 다시 만듭니다. "불량 블록"이 동일한 마법의 위치(4224 = 4096 + 128)에 다시 나타납니다.
sd 6:0:0:0: [sdd] Invalid command failure
sd 6:0:0:0: [sdd] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
sd 6:0:0:0: [sdd] Sense Key : Illegal Request [current]
sd 6:0:0:0: [sdd] Add. Sense: Invalid field in cdb
sd 6:0:0:0: [sdd] CDB: Write(10): 2a 08 00 00 10 80 00 00 08 00
end_request: critical target error, dev sdd, sector 4224
BTRFS: lost page write due to I/O error on /dev/sdd1
BTRFS: bdev /dev/sdd1 errs: wr 124433, rd 0, flush 0, corrupt 0, gen 0
나는 우연의 일치를 믿지 않습니다. 즉, 매직 128 이전과 128 이후에는 다른 섹터가 실패하지 않았지만 해당 특정 섹터에 문제가 있었습니다.
무엇이 괜찮습니까? 나에게 커널의 버그처럼 들립니다.
추가 정보:
- 리눅스 커널 v3.16.0
/dev/sdd
SATA - USB 어댑터 JMicron을 통해(ID 152d:0567,어떻게 생겼는지 보세요):
정보:
sd 4:0:0:0: [sdb] Attached SCSI disk
scsi 6:0:0:0: Direct-Access JMicron Generic 0116 PQ: 0 ANSI: 6
sd 6:0:0:0: Attached scsi generic sg5 type 0
sd 6:0:0:0: [sdd] 234441648 512-byte logical blocks: (120 GB/111 GiB)
sd 6:0:0:0: [sdd] Write Protect is off
sd 6:0:0:0: [sdd] Mode Sense: 47 00 10 08
sd 6:0:0:0: [sdd] Write cache: enabled, read cache: enabled, supports DPO and FUA
sd 6:0:0:0: [sdd] Attached SCSI disk
답변1
문제의 원인을 찾은 것 같습니다. JMicron SATA 브리지에 연결됩니다."Cdb의 잘못된 필드"로 인해 외부 USB3 디스크가 실패함.수리하다그리고제출 bf5c4136fa5ce471bdbf4cf59a813e32755fd014포함 된커널 v3.18.6, 2015년 2월 6일에 게시됨. 나는 다음 커널을 시도했습니다.
- 3.18.6-1~exp1- 쓸모 없는
- 3.19.3-1~exp1- 쓸모 없는
- 4.2.3-2~bpo8+1- 쓸모 없는.
실제 수정 사항은 다음과 같이 제출되었습니다.9fa62b1a31c96715aef34f25000e882ed4ac4876커널 4.4.x에서 사용할 수 있습니다.
작업 커널 v4.4.x의 dmesg는 다음과 같습니다.
scsi host7: uas
scsi 7:0:0:0: Direct-Access JMicron Generic 0116 PQ: 0 ANSI: 6
sd 7:0:0:0: [sdc] 234441648 512-byte logical blocks: (120 GB/111 GiB)
sd 7:0:0:0: [sdc] 4096-byte physical blocks
sd 7:0:0:0: [sdc] Write Protect is off
sd 7:0:0:0: [sdc] Mode Sense: 53 00 10 08
sd 7:0:0:0: [sdc] Disabling FUA
sd 7:0:0:0: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA