|
|
#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_blkno
and
bp->b_blkoff
members of the
buf(D4)
structure and is guaranteed to be non-negative.
The number of bytes to transfer is given by the
bp->b_bcount
member.
If the driver informs the core kernel of its device's size
with the
size(D2)
routine,
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
bioerror(D3)
function to fail the transfer
with the ENXIO error number,
unless the B_READ flag is set in the
bp->b_flags
member
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.
Before calling
biodone( ),
the driver must reflect the status of the transfer
into the buffer header.
It must set the bp->b_resid
member
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
the bp->b_bcount
member;
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
errnos(D5)
must be stored in the buffer header with
bioerror(D3).
See the description of the
b_addrtype
member of the
buf(D4)
structure for a description of
how to access the actual transfer data in the buffer.
In DDI versions 1, 2, and 4,
the
bioerror(D3)
function is not supported, so errors must be reported
by setting the B_ERROR flag
in the b_error
member of the
buf(D4)
structure and setting
the bp_b_resid
member
equal to the number of bytes not transferred
(or to 0 if all the bytes were transferred).