physio(9)
NAME
physio - initiate I/O on raw devices
SYNOPSIS
#include <sys/param.h> #include <sys/systm.h> #include <sys/bio.h> #include <sys/buf.h> int physio(dev_t dev, struct uio *uio, int ioflag);
DESCRIPTION
- The physio() is a helper function typically called from
- character device
read() and write() routines to start I/O on a user process - buffer. The
maximum amount of data to transfer with each call is deter - mined by
dev->si_iosize_max. The physio() call converts the I/O re - quest into a
strategy() request and passes the new request to the driv - er's strategy()
routine for processing. - Since uio normally describes user space addresses, physio()
- needs to lock
those pages into memory. This is done by calling vmapbuf() - for the
appropriate pages. physio() always awaits the completion of - the entire
requested transfer before returning, unless an error condi - tion is
detected earlier. - A break-down of the arguments follows:
- dev The device number identifying the device to interact
- with.
- 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.
- ioflag The ioflag argument from the read() or write() func
- tion calling
- physio().
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 request - ed by uio if
the device signals an ``end of file'' condition.
SEE ALSO
HISTORY
- The physio manual page is originally from NetBSD with minor
- changes for
applicability with FreeBSD. - The physio call has been completely re-written for providing
- higher I/O
and paging performance. - BSD July 8, 2004