The message structures passed to the io_read, io_write,
and io_openfd handlers
contain a member called xtype.
From struct _io_read:
struct _io_read {
...
uint32_t xtype;
...
}
Basically, the xtype contains extended type information
that can be used to adjust the behavior of a standard I/O function.
Most resource managers care about only a few values:
- _IO_XTYPE_NONE
- No extended type information is being provided.
- _IO_XTYPE_OFFSET
- If clients are calling
pread(), pread64(),
pwrite(), or pwrite64(),
then they don't want you to use the offset in the OCB.
Instead, they're providing a one-shot offset.
That offset follows the struct _io_read or
struct _io_write headers
that reside at the beginning of the message buffers.
For example:
struct myread_offset {
struct _io_read read;
struct _xtype_offset offset;
}
Some resource managers can be sure that their clients
will never call pread*() or pwrite*().
(For example, a resource manager that's controlling a robot arm probably wouldn't care.)
In this case, you can treat this type of message as an error.
- _IO_XTYPE_READCOND
- If a client is calling
readcond(),
they want to impose timing and return buffer size constraints on the read.
Those constraints follow the struct _io_read or struct _io_write headers
at the beginning of the message buffers.
For example:
struct myreadcond {
struct _io_read read;
struct _xtype_readcond cond;
}
As with _IO_XTYPE_OFFSET,
if your resource manager isn't prepared to handle readcond(),
you can treat this type of message as an error.
- _IO_XFLAG_DIR_EXTRA_HINT
- This flag is valid only when reading from a directory.
The filesystem should normally return extra directory information when
it's easy to get.
If this flag is set, it is a hint to the filesystem to try harder
(possibly causing media lookups) to return the extra information.
The most common use is to return _DTYPE_LSTAT
information.