[RFC] Separating out libata out of SCSI (finally)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello, all.

This item was on TODO list for years now.  People all agree that it's
necessary but it always had relatively low priority probably because
it's a bit difficult and isn't really necessary to make disks and
optical drives work.

Anyways, I think it's about time to take some action as SAS-ATA
integration (Brian, sorry about staying so silent about this for long
time, I was following the threads but couldn't really think of a quick
solution) and other ATA specific things including link power
management and bunch of other deferred ones due to lack of proper
sysfs interface or high level driver (parallel probing, parallel
resume).

Currently, my plan is...

* Move high level driver handling to request_queue.
* Implement queue quiescing and other state management on request_queue.
* Implement block_queue_group which...
	- Handles command scheduling.
	- Handles grouped queue quiescing and EH handling
* Move SCSI high level drivers to new infrastructure
* Convert libata to use new command scheduling and EH infrastructure
* Apply driver model to libata.
* Implement ata_disk ATA high level driver.

In the process, I'm planning to remove ata_host requirement and break
down libata EH into actions and sequencers so that SAS can use them
easily.

The biggest problem is how to keep userland happy.  hdX -> sdX
transition was painful enough and I have a strong feeling that
everyone will come after and hunt down us if we try something like sdX
-> bdX now.  :-)

It would be ideal if those ATA specific sysfs stuff just shows up
without disturbing the original SCSI things which are now widely used
for enumeration and manipulation.  I think we can get pretty close by
modifying SCSI high level drivers a bit such that they don't register
block devices for SCSI devices created to keep backward compatibility.
This is an extra burden on SCSI but it's gonna be the last one.

*** Currently, sysfs nodes for a libata disk is like the following.

 /devices/DEV/hostH/targetH:C:I/H:C:I:L/
	 driver			-> /bus/scsi/drivers/sd
	 generic			-> /class/scsi_generic/sgN
	 block/sdX/
		 device		-> ../../
		 partitions...
 /bus/scsi/devices/H:C:I:L	-> /devices/DEV/hostH/targetH:C:I/H:C:I:L
 /bus/scsi/drivers/sd/H:C:I:L	-> /devices/DEV/hostH/targetH:C:I/H:C:I:L
 /class/scsi_host/hostH/device	-> /devices/DEV/hostH
 /class/scsi_device/H:C:I:L/device -> /devices/DEV/hostH/targetH:C:I/H:C:I:L
 /class/scsi_disk/H:C:I:L/device -> /devices/DEV/hostH/targetH:C:I/H:C:I:L
 /class/scsi_generic/sgN/device	-> /devices/DEV/hostH/targetH:C:I/H:C:I:L
 /block/sda			-> /devices/DEV/hostH/targetH:C:I/H:C:I:L/block/sdX

*** After conversion, it will look something like the following.

 /devices/DEV/ata_port/P/ata_link/P:L/ata_device/P:D
	 driver			-> /bus/ata/drivers/ata_disk
	 block/sdX/
		 device		-> ../../
		 partitions...
 C	scsi_device		-> /devices/DEV/scsi_compat/hostH/targetH:C:I/H:C:I:L
 /bus/ata/devices/P:D		-> /devices/DEV/ata_port/P/ata_link/P:L/ata_device/P:D
 /bus/ata/drivers/ata_disk/P:D	-> /devices/DEV/ata_port/P/ata_link/P:L/ata_device/P:D
 /block/sda			-> /devices/DEV/ata_port/P/ata_link/P:L/ata_device/P:D/block/sdX

 /devices/DEV/scsi_compat/hostH/targetH:C:I/H:C:I:L/
	 driver			-> /bus/scsi/drivers/sd
	 generic			-> /class/scsi_generic/sgN
 C	block			-> ata_port/P/ata_link/P:L/ata_device/P:D/block
 C	ata_device		-> /devices/DEV/ata_port/P/ata_link/P:L/ata_device/P:D

 /bus/scsi/devices/H:C:I:L	-> /devices/DEV/scsi_compat/hostH/targetH:C:I/H:C:I:L
 /bus/scsi/drivers/sd/H:C:I:L	-> /devices/DEV/scsi_compat/hostH/targetH:C:I/H:C:I:L
 /class/scsi_host/hostH/device	-> /devices/DEV/scsi_compat/hostH
 /class/scsi_device/H:C:I:L/device -> /devices/DEV/scsi_compat/hostH/targetH:C:I/H:C:I:L
 /class/scsi_disk/H:C:I:L/device	-> /devices/DEV/scsi_compat/hostH/targetH:C:I/H:C:I:L
 /class/scsi_generic/sgN/device	-> /devices/DEV/scsi_compat/hostH/targetH:C:I/H:C:I:L

The SCSI side of interface will remain as functional as now as it will
go through the same libata SAT layer.  The only surprise userspace
will see aside from the extra ata nodes is that /sys/block/sdX/device
will lead to an ATA device node instead of SCSI device node.  Well,
that's the whole point of the converion but I think the surprise can
be minimized by reusing names used in SCSI device node and possibly
making symlinks for nodes which only makes sense for SCSI device.

So, what do you guys think?

Thanks.

PS. Brian, can you please point me to the latest version of libata EH
integration patch?

-- 
tejun
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystems]     [Linux SCSI]     [Linux RAID]     [Git]     [Kernel Newbies]     [Linux Newbie]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Samba]     [Device Mapper]

  Powered by Linux