#1038636 blkdiscard: it is too naive about larges discard unit

Package:
util-linux
Source:
util-linux
Description:
miscellaneous system utilities
Submitter:
Michael Tokarev
Date:
2023-06-19 11:39:05 UTC
Severity:
normal
Tags:
#1038636#5
Date:
2023-06-19 10:58:22 UTC
From:
To:
Many devices has maximum discard size, DISC-MAX in `lsblk --discard` output.
However, blkdiscard by default is doing full-device discard, which is also
specified in its manual page.  This results in errors and some drivers turning
discard support off.  For example:

# cat /sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/usb2/2-4/2-4:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0/provisioning_mode
unmap
# lsblk --discard
NAME        DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda                0      512B       4G         0

# blkdiscard -f -l 4G /dev/sda
blkdiscard: Operation forced, data will be lost!
#### this works

# blkdiscard -f -l 5G /dev/sda
blkdiscard: /dev/sda: BLKDISCARD ioctl failed: Remote I/O error

# cat /sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/usb2/2-4/2-4:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0/provisioning_mode
disabled

Kernel log:

[217264.437619] sd 6:0:0:0: [sda] tag#8 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_OK cmd_age=0s
[217264.437632] sd 6:0:0:0: [sda] tag#8 Sense Key : Illegal Request [current]
[217264.437638] sd 6:0:0:0: [sda] tag#8 Add. Sense: Invalid field in cdb
[217264.437645] sd 6:0:0:0: [sda] tag#8 CDB: Unmap/Read sub-channel 42 00 00 00 00 00 00 00 18 00
[217264.437648] critical target error, dev sda, sector 134217728 op 0x3:(DISCARD) flags 0x4000 phys_seg 1 prio class 2

Having said this, I'm not really sure who's in charge here.
Maybe it is the kernel driver who should split the large request into smaller parts.

But the end result is that whole thing stops working (and some devices even fall
off the usb bus and needs to be re-set).  And for quite some times I was sure
discard/trim is not supported on USB-connected devices at all, just because this
quick blkdiscard test always fails like this, - and I thought it is the command
which is illegal, not its parameter.

#1038636#10
Date:
2023-06-19 11:14:30 UTC
From:
To:
Hi Michael,

* Michael Tokarev <mjt@tls.msk.ru> [230619 13:00]:

I'm not sure what you're asking. Is this a bug? A feature request?

blkdiscard is a "low level tool" and I think it works according to
its documentation. A less low-level tool is fstrim, that might do
what you want?

If you want blkdiscard to be smarter - if the smartness shouldn't be
in the kernel in the first place - can you suggest this to upstream?
Doesn't seem like this is a Debian-specific thing?

Thanks,
Chris

#1038636#15
Date:
2023-06-19 11:37:50 UTC
From:
To:
19.06.2023 14:14, Chris Hofstaedtler wrote:
to begin with.

Note that `lsblk' utility also belongs to the same util-linux package,
and this utility knows how to find the max unmap size, so it's just a
missing call to already existing functionality.

Yes, blkdiscard works according to the docs, but since it is used in
particular scenarios, I'd say it is a bug on its part.

Why I'm filing it with debian: because it needs to be documented at
the very least.  Usually when someone bug one of the software I
maintain in debian, I can know better how to contact upstream on
behalf of this reporter, or when a problem is complex or too
specific to particular user's setup so I can't reproduce it, I
suggest them to ask upstream directly.  It is about knowing packages
you maintain. In recent years I had to register in just too many
places and subscribe to too many mailing lists just to be able to
report issues/bugs. I tend to avoid doing so unless really
necessary.  If you don't have util-linux upstream contacts, I
can register/subscribe there for sure...

Thanks,

/mjt