IO errors when writing large amounts of data to USB storage in eoan on RPI2/3 (armhf kernel)
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
linux-raspi2 (Ubuntu) |
Fix Released
|
Critical
|
Unassigned | ||
Eoan |
Fix Released
|
Critical
|
Hui Wang |
Bug Description
[Impact]
On the RPI2/3 boards with eoan armhf kernel, if we copy large size
files to usb stick, the usb host driver dwc_otg will fail and print
lots of IO errors in the dmesg.
[Fix]
To support rpi4, we enabled the LPAE/HIGHMEM/
kernel, the dwc_otg has some problem with highmem enabled. If the
urb's buffer is in the highmem region, the enqueue function will return
the -EINVALID unconditionally, as a result, it can't handle the urb
which contains the highmem buffer. But the driver itself can handle the
highmem buffer, we just need to do a little change.
[Test Case]
With the patch applied, I tested armhf and arm64 kernel on rpi2/3/4,
all worked well, no regression and the usb driver works well.
[Regression Risk]
Low, the upstream already looked at my patch and agreed with my
change, and I tested the patch on rpi2/3/4 with armhf and arm64
kernels, all worked well.
Kernel tested:
Linux ubuntu 5.3.0-1012-raspi2 #14-Ubuntu SMP Mon Nov 11 10:08:39 UTC 2019 armv7l armv7l armv7l GNU/Linux
I've only been able to reproduce this with the armhf kernel and on the following devices:
RPI3B+
RPI3B
RPI2
At the moment, it does not appear that arm64 is affected, nor are RPI3A+ and RPI4 (at least not the 2GB version)
Steps to reproduce:
- Insert and mount a USB storage device
- cp a large file to it (300-600MB recommended - smaller files will sometimes not trigger it)
- sync
After running the sync, a lot of IO errors will show up in dmesg like:
[ 176.129299] sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=
[ 176.129326] sd 0:0:0:0: [sda] tag#0 CDB: Write(10) 2a 00 00 2e 24 b0 00 00 f0 00
[ 176.129349] blk_update_request: I/O error, dev sda, sector 3024048 op 0x1:(WRITE) flags 0x4000 phys_seg 15 prio class 0
[ 176.883968] usb 1-1.1.2: reset high-speed USB device number 8 using dwc_otg
[ 177.079960] usb 1-1.1.2: reset high-speed USB device number 8 using dwc_otg
It eventually finishes, and if you unmount/remount the device, the checksum will be different from the original file.
CVE References
Changed in linux-raspi2 (Ubuntu): | |
importance: | Undecided → Critical |
Changed in linux-raspi2 (Ubuntu Eoan): | |
importance: | Undecided → Critical |
Changed in linux-raspi2 (Ubuntu Eoan): | |
assignee: | nobody → Hui Wang (hui.wang) |
Changed in linux-raspi2 (Ubuntu Eoan): | |
status: | New → In Progress |
summary: |
IO errors when writing large amounts of data to USB storage in eoan on - RPI + RPI2/3 (armhf kernel) |
description: | updated |
Changed in linux-raspi2 (Ubuntu Eoan): | |
status: | In Progress → Fix Committed |
Changed in linux-raspi2 (Ubuntu): | |
status: | New → Fix Released |
Note that according to Dave this issue doesn't appear using the Disco kernel