Block devices and Linux
• Linux has a generic block device layer with
which all filesystems will interact.
• SCSI is no different in this regard – it
registers itself with the block device layer
so it can receive requests.
• SCSI also handles character device requests
and ioctls that do not originate in the block
What is the “Mid-Layer”?
• Linux SCSI support can be viewed as 3 levels.
• Upper level is device management, such as
tape, cdrom, disk, etc.
• Lower level talks to host adapters.
• Middle layer is essentially a traffic cop,
handing requests from rest of kernel, and
dispatching them to the rest of SCSI.
What was wrong in 2.2?
• The elevator algorithms in 2.2 allowed requests to
grow irregardless of the capabilities of the
• All SCSI disks were handled in a single queue.
• Disk driver had to split requests that had become
• One set of common logic for verifying requests had
not become too large.
What was wrong in 2.2 (cont)
• Character device requests not in queue.
• SMP safety was clumsily handled, leading
to race conditions and poor performance.
• Poor scalability.
• Many drivers continue to use old error
Changes for Linux-2.4
• Block device layer was generalized to
support a “request_queue_t” abstract
datatype that represents a queue.
• Contains function pointers that drivers can
use for managing the size of requests
inserted into queues.
• Requests no longer can grow to be too large
to be handled at one time.
Changes for 2.4 (cont)
• No longer any need for splitting requests.
• No need for ugly logic to scan a queue for a
• SMP locking in mid-layer cleaned up to
provide finer granularity.
Changes for 2.4 (cont)
• A SCSI queuing library was created – a set
of functions for queue management that are
tailored to different sets of requirements.
• SCSI was modified to use a single queue for
each physical device.
• Character device requests and ioctls are
inserted into the same queue at the tail, and
handled the same as other requests.
Upcoming changes for 2.5
• All drivers will be forced to use new error
• Disk driver will be updated to handle larger
number of disks.
• SMP locking will be cleaned up some more
to improve scalability.
SMP Cleanups (cont).
• Low-level drivers don’t need to protect
queue – they don’t have access to it.
• Each low-level driver should have a
separate lock – ideally one per instance of
host, but could be a driver-wide lock
initially. This should be up to the low-level
Large numbers of disks
• Current disk driver allocates 8 majors,
allowing for only 128 disks.
• Plans are in the works to allow disk driver
to dynamically allocate major numbers.
• Would support up to about 4000 disks,
when major numbers are exhausted.
• Possible to go beyond this by using fewer
bits for partitions.
• Implement some SCSI-3 features (larger
commands, sense buffers).
• Improve support for shared busses.
• Support target-mode.
• Check module add/remove code for SMP
safety, implement locks.
• Improvements related to high-availability.
The major goal of a rewrite of SCSI queuing has
been accomplished. A number of architectural
problems were resolved at the same time.
There are still some interesting tasks still to be
addressed for 2.5.
See http://www.andante.org/scsi.html for more
info, and http://www.andante.org/scsi_todo.html for