Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a676f8d0 authored by Peter Osterlund's avatar Peter Osterlund Committed by Linus Torvalds
Browse files

[PATCH] pktcdvd: documentation update



Update the "theory of operation" description.

Signed-off-by: default avatarPeter Osterlund <petero2@telia.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d0272e78
Loading
Loading
Loading
Loading
+30 −18
Original line number Diff line number Diff line
@@ -5,29 +5,41 @@
 * May be copied or modified under the terms of the GNU General Public
 * License.  See linux/COPYING for more information.
 *
 * Packet writing layer for ATAPI and SCSI CD-R, CD-RW, DVD-R, and
 * DVD-RW devices (aka an exercise in block layer masturbation)
 * Packet writing layer for ATAPI and SCSI CD-RW, DVD+RW, DVD-RW and
 * DVD-RAM devices.
 *
 * Theory of operation:
 *
 * TODO: (circa order of when I will fix it)
 * - Only able to write on CD-RW media right now.
 * - check host application code on media and set it in write page
 * - interface for UDF <-> packet to negotiate a new location when a write
 *   fails.
 * - handle OPC, especially for -RW media
 * At the lowest level, there is the standard driver for the CD/DVD device,
 * typically ide-cd.c or sr.c. This driver can handle read and write requests,
 * but it doesn't know anything about the special restrictions that apply to
 * packet writing. One restriction is that write requests must be aligned to
 * packet boundaries on the physical media, and the size of a write request
 * must be equal to the packet size. Another restriction is that a
 * GPCMD_FLUSH_CACHE command has to be issued to the drive before a read
 * command, if the previous command was a write.
 *
 * Theory of operation:
 * The purpose of the packet writing driver is to hide these restrictions from
 * higher layers, such as file systems, and present a block device that can be
 * randomly read and written using 2kB-sized blocks.
 *
 * The lowest layer in the packet writing driver is the packet I/O scheduler.
 * Its data is defined by the struct packet_iosched and includes two bio
 * queues with pending read and write requests. These queues are processed
 * by the pkt_iosched_process_queue() function. The write requests in this
 * queue are already properly aligned and sized. This layer is responsible for
 * issuing the flush cache commands and scheduling the I/O in a good order.
 *
 * We use a custom make_request_fn function that forwards reads directly to
 * the underlying CD device. Write requests are either attached directly to
 * a live packet_data object, or simply stored sequentially in a list for
 * later processing by the kcdrwd kernel thread. This driver doesn't use
 * any elevator functionally as defined by the elevator_s struct, but the
 * underlying CD device uses a standard elevator.
 * The next layer transforms unaligned write requests to aligned writes. This
 * transformation requires reading missing pieces of data from the underlying
 * block device, assembling the pieces to full packets and queuing them to the
 * packet I/O scheduler.
 *
 * This strategy makes it possible to do very late merging of IO requests.
 * A new bio sent to pkt_make_request can be merged with a live packet_data
 * object even if the object is in the data gathering state.
 * At the top layer there is a custom make_request_fn function that forwards
 * read requests directly to the iosched queue and puts write requests in the
 * unaligned write queue. A kernel thread performs the necessary read
 * gathering to convert the unaligned writes to aligned writes and then feeds
 * them to the packet I/O scheduler.
 *
 *************************************************************************/