[systemd-devel] [usb-storage] Re: Amazon Kindle disconnect after Synchronize Cache
Matthias Schwarzott
zzam at gentoo.org
Tue Mar 16 21:43:42 UTC 2021
Am 16.03.21 um 17:26 schrieb Alan Stern:
> On Tue, Mar 16, 2021 at 06:26:30AM +0100, Matthias Schwarzott wrote:
>> I implemented solution 3b. This is the pullrequest for udev (systemd
>> repository):
>>
>> https://github.com/systemd/systemd/pull/19002
>>
>> Now Lennart asks if udev is the best place for such hacks/work-arounds?
>>
>> Well, I implemented it as suggested by Alan (see above). This was the
>> simplest of the considered alternatives. Different quirks in kernel has been
>> considered, but are more effort to be implemented.
>
> Lennart probably isn't aware how the usb-storage driver works. It does
> not create commands on its own; it merely sends the commands that it
> gets from higher SCSI layers.
>
> It may be possible to modify the SCSI core, to make it send a TEST UNIT
> READY command immediately following any SYNCHRONIZE CACHE to a Kindle.
>
> However, there may be an easier solution. usb-storage does indeed send
> a command of its own, REQUEST SENSE, to get error data when a command
> fails. The patch below will make it do the same thing whenever it sends
> a SYNCHRONIZE CACHE to a Kindle, failure or not.
>
> The only question is whether the Kindle will regard REQUEST SENSE as a
> sufficient indication that it shouldn't do an eject. The only way to
> find out is by testing the patch.
>
The patch is a lot shorter than I expected it to be.
I tried it. The new udev-rule is commented, so polling interval is back
at 2000 ms.
Testing it:
# cat /sys/block/sde/events_poll_msecs
-1
# cat /sys/module/block/parameters/events_dfl_poll_msecs
2000
# python -c "import time; import os; f = open('/dev/sde1', 'r+b');
os.fsync(f); time.sleep(4)"
This is wireshark output of the test:
85 4.701949 host 3.8.1 USBMS 95 SCSI: Test Unit Ready LUN: 0x00
86 4.701972 3.8.1 host USB 64 URB_BULK out
87 4.701975 host 3.8.1 USB 64 URB_BULK in
88 4.702030 3.8.1 host USBMS 77 SCSI: Response LUN: 0x00 (Test Unit
Ready) (Good)
89 4.702043 host 3.8.1 USBMS 95 SCSI: Prevent/Allow Medium Removal LUN:
0x00 PREVENT
90 4.702069 3.8.1 host USB 64 URB_BULK out
91 4.702072 host 3.8.1 USB 64 URB_BULK in
92 4.703006 3.8.1 host USBMS 77 SCSI: Response LUN: 0x00 (Prevent/Allow
Medium Removal) (Good)
93 4.703052 host 3.8.1 USBMS 95 SCSI: Synchronize Cache(10) LUN: 0x00
(LBA: 0x00000000, Len: 0)
94 4.703066 3.8.1 host USB 64 URB_BULK out
95 4.703067 host 3.8.1 USB 64 URB_BULK in
96 4.704146 3.8.1 host USBMS 77 SCSI: Response LUN: 0x00 (Synchronize
Cache(10)) (Good)
97 4.704149 host 3.8.1 USBMS 95 SCSI: Request Sense LUN: 0x00
98 4.704177 3.8.1 host USB 64 URB_BULK out
99 4.704179 host 3.8.1 USB 64 URB_BULK in
100 4.705032 3.8.1 host USBMS 82 SCSI: Data In LUN: 0x00 (Request Sense
Response Data)
101 4.705035 host 3.8.1 USB 64 URB_BULK in
102 4.705053 3.8.1 host USBMS 77 SCSI: Response LUN: 0x00 (Request
Sense) (Good)
105 6.740272 host 3.8.1 USBMS 95 SCSI: Test Unit Ready LUN: 0x00
106 6.740323 3.8.1 host USB 64 URB_BULK out
107 6.740326 host 3.8.1 USB 64 URB_BULK in
108 6.740410 3.8.1 host USBMS 77 SCSI: Response LUN: 0x00 (Test Unit
Ready) (Good)
195 8.709417 host 3.8.1 USBMS 95 SCSI: Prevent/Allow Medium Removal LUN:
0x00 ALLOW
196 8.709441 3.8.1 host USB 64 URB_BULK out
197 8.709445 host 3.8.1 USB 64 URB_BULK in
198 8.709645 3.8.1 host USBMS 77 SCSI: Response LUN: 0x00 (Prevent/Allow
Medium Removal) (Good)
The patch indeed works. The kindle does not disconnect.
I also tried with a sync on a mounted filesystem. The effect is the
same: No disconnect.
Calling "eject /dev/sde" still works as it should.
Tested-by: Matthias Schwarzott <zzam at gentoo.org>
Regards
Matthias
More information about the systemd-devel
mailing list