#include <sys/types.h> #include <sys/buf.h> #include <sys/errno.h> #include <sys/ddi.h>
int prefixstrategy(buf_t bp);
The strategy( ) routine is a named entry point and must be defined as a global symbol.
The starting device offset for the I/O transfer
is given by the
bp->b_blkoff members of the
structure and is guaranteed to be non-negative.
The number of bytes to transfer is given by the
If the driver informs the core kernel of its device's size
the special device offset range is guaranteed
not to extend beyond the end of the device.
If the driver does not report its device's size,
the driver itself must check for end-of-media itself.
It does this by setting
the bp->b_resid member
to the number of bytes beyond the end of the device.
It must also call the
function to fail the transfer
with the ENXIO error number,
unless the B_READ flag is set in the
and the starting device offset is exactly at
the end of the device.
Typically, the driver calls the buf_breakup(D3) function from its strategy routine to ensure that the transfer data buffer meets the requirements of the driver and its device.
If there is any valid data to transfer, the driver may either start the device I/O immediately or queue it for later processing. The driver then returns from this entry point routine. At a later time, when the I/O has completed or failed, the driver must call the biodone(D3) function to inform the caller of the completion. If the request does not actually require any I/O, the driver may call biodone( ) before returning.
the driver must reflect the status of the transfer
into the buffer header.
It must set the
to the number of bytes not transferred for any rason.
If no bytes were transferred,
bp->b_resid must be set to the initial value of
if all of the data bytes were transferred,
bp->b_resid must be set to 0.
If some portion of the data failed to be transferred
because of some error condition,
the appropriate error number from
must be stored in the buffer header with
See the description of the
b_addrtype member of the
structure for a description of
how to access the actual transfer data in the buffer.
In DDI versions 1, 2, and 4,
function is not supported, so errors must be reported
by setting the B_ERROR flag
b_error member of the
structure and setting
equal to the number of bytes not transferred
(or to 0 if all the bytes were transferred).