Module Name: src
Committed By: riastradh
Date: Mon Mar 30 13:10:04 UTC 2015
Modified Files:
src/share/man/man9: bufferio.9
Log Message:
Correct documentation of asynchronous/callback buffer I/O.
Asynchronous is not the same as callback: asynchronous means there is
no completion notification, and can be used only with buffer-cached
buffers.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/share/man/man9/bufferio.9
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/share/man/man9/bufferio.9
diff -u src/share/man/man9/bufferio.9:1.5 src/share/man/man9/bufferio.9:1.6
--- src/share/man/man9/bufferio.9:1.5 Sun Mar 29 21:08:36 2015
+++ src/share/man/man9/bufferio.9 Mon Mar 30 13:10:04 2015
@@ -1,4 +1,4 @@
-.\" $NetBSD: bufferio.9,v 1.5 2015/03/29 21:08:36 riastradh Exp $
+.\" $NetBSD: bufferio.9,v 1.6 2015/03/30 13:10:04 riastradh Exp $
.\"
.\" Copyright (c) 2015 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -91,7 +91,7 @@ Transfer is read from device.
If not set, transfer is write to device.
.It Dv B_ASYNC
Asynchronous I/O.
-Caller must provide
+Caller must not provide
.Fa bp Ns Li "->b_iodone"
and must not call
.Fn biowait bp .
@@ -107,11 +107,10 @@ Nonnegative number of bytes requested fo
.It Fa bp Ns Li "->b_blkno"
Block number at which to do transfer.
.It Fa bp Ns Li "->b_iodone"
-If
+I/O completion callback.
.Dv B_ASYNC
-is set in
-.Fa bp Ns Li "->b_flags" ,
-an I/O completion callback.
+must not be set in
+.Fa bp Ns Li "->b_flags" .
.El
.Pp
Additionally, if the I/O transfer is a write associated with a
@@ -129,30 +128,42 @@ and submitting
to a block device -- doing so will likely cause deadlock with the
syncer.
.Pp
-Block I/O transfers may be synchronous or asynchronous:
+Block I/O transfer completion may be notified by the
+.Fa bp Ns Li "->b_iodone"
+callback, by signalling
+.Fn biowait
+waiters, or not at all in the
+.Dv B_ASYNC
+case.
.Bl -dash
.It
-If synchronous, after submitting the transfer to a block device, the
-user must call
+If the user sets the
+.Fa bp Ns Li "->b_iodone"
+callback to a nonnull function pointer, it will be called in soft
+interrupt context when the I/O transfer is complete.
+The user
+.Em may not
+call
.Fn biowait bp
-in order to wait until the transfer has completed.
+in this case.
.It
-If asynchronous, the user must set
+If
.Dv B_ASYNC
-in
-.Fa bp Ns Li "->b_flags"
-and provide
-.Fa bp Ns Li "->b_iodone" .
-After submitting the transfer to a block device,
-.Fa bp Ns Li "->b_iodone"
-will eventually be called with
-.Fa bp
-as its argument when the transfer has completed.
+is set, then the I/O transfer is asynchronous and the user will not be
+notified when it is completed.
The user
.Em may not
call
.Fn biowait bp
in this case.
+.It
+Otherwise, if
+.Fa bp Ns Li "->b_iodone"
+is null and
+.Dv B_ASYNC
+is not specified, the user may wait for the I/O transfer to complete
+with
+.Fn biowait bp .
.El
.Sh NESTED I/O TRANSFERS
Sometimes an I/O transfer from a single buffer in memory cannot go to a
@@ -329,7 +340,9 @@ To be called by a user requesting the I/
.Pp
May not be called if
.Fa bp
-represents an asynchronous transfer, i.e. if
+has a callback or is asynchronous -- that is, if
+.Fa bp Ns Li "->b_iodone"
+is set, or if
.Dv B_ASYNC
is set in
.Fa bp Ns Li "->b_flags" .
@@ -355,6 +368,13 @@ Do
use
.Xr brelse 9 .
.Pp
+The buffer may not be used for an asynchronous I/O transfer, because
+there is no way to know when it is completed and may be safely passed
+to
+.Fn putiobuf .
+Asynchronous I/O transfers are allowed only for buffers in the
+.Xr buffercache 9 .
+.Pp
May sleep if
.Fa waitok
is true.