int
physio(
(*strategy)(struct buf *)
struct buf *bp
dev_t dev
int flags
(*minphys)(struct buf *)
struct uio *uio
)
)
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)).
physio()
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:
strategybpB_BUSY,
B_PHYS,
and
B_RAW
set when passed to the strategy routine.
If
NULL,
a buffer is allocated from a system pool.
devflagsB_READ
or
B_WRITE.
minphysuiouio
structure with the
`uio_segflg'
set to anything other than
UIO_USERSPACE,
are undefined.
)
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.