Library
Module
Module type
Parameter
Class
Class type
Safe block devices
Construct a safe wrapper around B
where necessary buffer preconditions are checked on read
and write
, and useful error messages generated. Some concrete implementations generate confusing errors (e.g. Unix might say "EINVAL") which are harder to debug.
Parameters
Signature
The type for errors.
The type for write errors.
include S
with type t = B.t
and type error := error
and type write_error := write_error
type page_aligned_buffer = Cstruct.t
The type for page-aligned memory buffers.
val pp_write_error : write_error Fmt.t
pp_write_error
is the pretty-printer for write errors.
val get_info : t -> Mirage_block.info io
Query the characteristics of a specific block device
val read :
t ->
int64 ->
page_aligned_buffer list ->
(unit, error) Pervasives.result io
read device sector_start buffers
reads data starting at sector_start
from the block device into buffers
. Ok ()
means the buffers have been filled. Error _
indicates an I/O error has happened and some of the buffers may not be filled. Each of elements in the list buffers
must be a whole number of sectors in length. The list of buffers can be of any length.
val write :
t ->
int64 ->
page_aligned_buffer list ->
(unit, write_error) Pervasives.result io
write device sector_start buffers
writes data from buffers
onto the block device starting at sector_start
. Ok ()
means the contents of the buffers have been written. Error _
indicates a partial failure in which some of the writes may not have happened.
Once submitted, it is not possible to cancel a request and there is no timeout.
The operation may fail with:
`Unimplemented
: the operation has not been implemented, no data has been written.`Is_read_only
: the device is read-only, no data has been written.`Disconnected
: the device has been disconnected at application request, an unknown amount of data has been written.
Each of buffers
must be a whole number of sectors in length. The list of buffers can be of any length.
The data will not be copied, so the supplied buffers must not be re-used until the IO operation completes.
val unsafe_read :
t ->
int64 ->
page_aligned_buffer list ->
(unit, B.error) Pervasives.result Lwt.t
unsafe_read
is like read
except it bypasses the necessary buffer precondition checks. Only use this if you want maximum performance and if you can prove the preconditions are respected.
val unsafe_write :
t ->
int64 ->
page_aligned_buffer list ->
(unit, B.write_error) Pervasives.result Lwt.t
unsafe_write
is like write
except it bypasses the necessary buffer precondition checks. Only use this if you want maximum performance and if you can prove the buffer preconditions are respected.