Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
PHYSIO(9)	       FreeBSD Kernel Developer's Manual	     PHYSIO(9)

     physio -- initiate	I/O on raw devices

     #include <sys/param.h>
     #include <sys/systm.h>
     #include <sys/buf.h>

     physio(dev_t dev, struct uio *uio,	int ioflag);

     The 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
     process into memory.  This	is done	by setting the P_PHYSIO	flag on	the
     process.  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:

	     The device	strategy routine to call for each chunk	of data	to
	     initiate device I/O.

     bp	     The buffer	to use with the	strategy routine.  The buffer flags
	     will have B_BUSY, and B_PHYS set when passed to the strategy rou-
	     tine.  If NULL, a buffer is allocated from	a system pool.

     dev     The device	number identifying the device to interact with.

     flags   Direction of transfer; the	only valid settings are	B_READ or

	     A device specific routine called to determine the maximum trans-
	     fer size that the device's	strategy routine can handle.

     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

     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 strat-
     egy 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.

     read(2), write(2)

FreeBSD	11.1			 June 15, 1996			  FreeBSD 11.1


Want to link to this manual page? Use this URL:

home | help