PHYSIO(9) | Kernel Developer's Manual | PHYSIO(9) |
physio
—
physio
((*strategy)(struct buf *),
struct buf *bp, dev_t dev,
int flags, (*minphys)(struct buf
*), struct uio *uio);
physio
() 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:
B_BUSY
, B_PHYS
, and
B_RAW
set when passed to the strategy routine. If
NULL
, a buffer is allocated from a system
pool.B_READ
or B_WRITE
.UIO_USERSPACE
, are undefined.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.
April 13, 2010 | NetBSD 9.2 |