Re: [PATCH] drivers/ata: print trim features at device initialization

From: Konstantin Khlebnikov
Date: Mon Jun 10 2019 - 03:53:28 EST


On 10.06.2019 0:37, James Bottomley wrote:
On Sat, 2019-06-08 at 17:13 +0300, Konstantin Khlebnikov wrote:
On 08.06.2019 11:25, Christoph Hellwig wrote:> On Fri, Jun 07, 2019
at 10:34:39AM +0300, Konstantin Khlebnikov wrote:
>
> Do we really need to spam dmesg with even more ATA crap? What
about
> a sysfs file that can be read on demand instead?
>

Makes sense.

Trim state is exposed for ata_device:
/sys/class/ata_device/devX.Y/trim
but there is no link from scsi device to ata device so they hard to
match.

I'll think about it.

Nope. There is no obvious way to link scsi device with ata_device.
ata_device is built on top of "transport_class" and
"attribute_container".
This some extremely over engineered sysfs framework used only in
ata/scsi. I don't want to touch this.

You don't need to know any of that. The problem is actually when the
ata transport classes were first created, the devices weren't properly
parented. What should have happened, like every other transport class,
is that the devices should have descended down to the scsi device as
the leaf in an integrated fashion. Instead, what we seem to have is
three completely separate trees.

So if you look at a SAS device, you see from the pci device:

host2/port-2:0/end_device-2:0/target2:0:0/2:0:0:0/block/sdb/sdb1

But if you look at a SATA device, you see three separate paths:

ata3/host3/target3\:0\:0/3\:0\:0\:0/block/sda/sda1
ata3/link3/dev3.0/ata_device/dev3.0
ata3/ata_port/ata3

Instead of an integrated tree

Unfortunately, this whole thing is unfixable now. If I integrate the
tree properly, the separate port and link directories will get subsumed
and we won't be able to recover them with judicious linking so scripts
relying on them will break. The best we can probably do is add
additional links with what we have.

To follow the way we usually do it, there should be a link from the ata
device to the scsi target, but that wouldn't help you find the "trim"
files, so it sounds like you want a link from the scsi device to the ata device, which would?

Yes, I'm talking about link from scsi device to leaf ata_device node.

In libata scsi_device has one to one relation with ata_device.
So making link like /sys/class/block/sda/device/ata_device should be possible easy.
But I haven't found implicit reference from struct ata_device to ata_device in sysfs.

In simplest ahci case whole path looks like:
/sys/devices/pci0000:00/0000:00:1f.2/ata1/link1/dev1.0/ata_device/dev1.0
|______________________|__ata_host__|port|link_|_tdev_|___ata_device___|


/sys/class/ata_device/dev1.0 points directly to leaf ata_device
While in struct ata_device tdev is different intermediate node.

It would be nice merge tdev and ata_device into one node, or at least embed leaf
struct device into struct ata_device too.

As I see ata registers only "transport" device while scsi transport template
magically matches it and creates actual ata device of ata_dev_class.
I see no reason for this complexity. Why ata host couldn't enumerate and
register all these devices explicitly?