int gfs_read_nested(int fork_id, char *buf, ulong_t offset, ulong_t size, struct gfs_stride *list, int levels);
int gfs_nb_read_nested(gfs_handle handle, int fork_id, char *buf, ulong_t offset, ulong_t size, struct gfs_stride *list, int levels);
int gfs_write_nested(int fork_id, char *buf, ulong_t offset, ulong_t size, struct gfs_stride *list, int levels);
int gfs_nb_write_nested(gfs_handle handle, int fork_id, char *buf, ulong_t offset, ulong_t size, struct gfs_stride *list, int levels);
The innermost level of nesting is identical to a simplestrided request, as supported by Galley's stridedcalls. When that inner pattern is completed, the file offset is increased by list[1].f_off, the offset into memory is increased by list[1].m_off, and the inner strided pattern is repeated, beginning at the new file and memory offsets. The inner pattern causes list[0].quant chunks of data to be transferred, and the second-level pattern causes the first pattern to be repeated list[1].quant times. levels indicates how many levels of nesting are contained in list.
gfs_read_nested and gfs_write_nested are blocking calls, so they will not return until all the data has been transferred.
gfs_nb_read_nested and gfs_nb_write_nested are non-blocking calls, so they will return immediately. The application can call gfs_test(handle) to determine whether or not all the data has been transferred. The application must call gfs_wait(handle) before handle may be used in another nonblocking call.