Provided by: freebsd-manpages_12.2-2_all bug

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(struct cdev *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  determined
       by  dev->si_iosize_max.   The physio() call converts the I/O request into a strategy() request and passes
       the new request to the driver'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 condition 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() function 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 requested by uio if the device signals an “end of file” condition.

SEE ALSO

       read(2), write(2)

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.

Debian                                          January 19, 2012                                       PHYSIO(9)