NAME
physio
—
initiate I/O on raw devices
SYNOPSIS
int
physio
((*strategy)(struct buf
*), struct buf *bp, dev_t
dev, int flags,
(*minphys)(struct buf *), struct uio
*uio);
DESCRIPTION
Thephysio
()
is a helper function typically called from character device read and write
routines to start I/O on a user process buffer. It calls back on the provided
strategy routine one or more times to complete the
transfer described by uio. The maximum amount of data to
transfer with each call to strategy is determined by the
minphys routine.
Since uio normally describes
user space addresses,
physio
()
needs to lock the appropriate data area into memory before each transaction
with strategy (see
uvm_vslock(9) and
uvm_vsunlock(9)). The physio
()
function always awaits the completion of the entire requested transfer
before returning, unless an error condition is detected earlier. In all
cases, the buffer passed in bp is locked (marked as
“busy”) for the duration of the entire transfer.
A break-down of the arguments follows:
- strategy
- The device strategy routine to call for each chunk of data to initiate device I/O.
- bp
- The buffer to use with the strategy routine. The buffer flags will have
B_BUSY
,B_PHYS
, andB_RAW
set when passed to the strategy routine. IfNULL
, a buffer is allocated from a system pool. - dev
- The device number identifying the device to interact with.
- flags
- Direction of transfer; the only valid settings are
B_READ
orB_WRITE
. - minphys
- A device specific routine called to determine the maximum transfer size that the device's strategy routine can handle.
- uio
- The description of the entire transfer as requested by the user process.
Currently, the results of passing a uio structure
with the ‘uio_segflg’ set to anything other than
UIO_USERSPACE
, are undefined.
RETURN VALUES
If successful physio
() returns 0.
EFAULT
is returned if the address range described by
uio is not accessible by the requesting process.
physio
() will return any error resulting from calls
to the device strategy routine, by examining the
B_ERROR
buffer flag and the ‘b_error’
field. Note that the actual transfer size may be less than requested by
uio if the device signals an “end of
file” condition.