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:
strategy
bp
B_BUSY
,
B_PHYS
,
and
B_RAW
set when passed to the strategy routine.
If
NULL
,
a buffer is allocated from a system pool.
dev
flags
B_READ
or
B_WRITE
.
minphys
uio
uio
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.