2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2003 Sistina Software
*
* This file is released under the GPL .
*/
# ifndef _DM_IO_H
# define _DM_IO_H
# include "dm.h"
struct io_region {
struct block_device * bdev ;
sector_t sector ;
2007-05-09 13:33:05 +04:00
sector_t count ; /* If this is zero the region is ignored. */
2005-04-17 02:20:36 +04:00
} ;
struct page_list {
struct page_list * next ;
struct page * page ;
} ;
typedef void ( * io_notify_fn ) ( unsigned long error , void * context ) ;
2007-05-09 13:33:01 +04:00
enum dm_io_mem_type {
DM_IO_PAGE_LIST , /* Page list */
DM_IO_BVEC , /* Bio vector */
DM_IO_VMA , /* Virtual memory area */
DM_IO_KMEM , /* Kernel memory */
} ;
struct dm_io_memory {
enum dm_io_mem_type type ;
union {
struct page_list * pl ;
struct bio_vec * bvec ;
void * vma ;
void * addr ;
} ptr ;
unsigned offset ;
} ;
struct dm_io_notify {
io_notify_fn fn ; /* Callback for asynchronous requests */
void * context ; /* Passed to callback */
} ;
/*
* IO request structure
*/
struct dm_io_client ;
struct dm_io_request {
int bi_rw ; /* READ|WRITE - not READA */
struct dm_io_memory mem ; /* Memory to use for io */
struct dm_io_notify notify ; /* Synchronous if notify.fn is NULL */
struct dm_io_client * client ; /* Client memory handler */
} ;
2005-04-17 02:20:36 +04:00
2007-05-09 13:33:01 +04:00
/*
* For async io calls , users can alternatively use the dm_io ( ) function below
* and dm_io_client_create ( ) to create private mempools for the client .
*
* Create / destroy may block .
*/
struct dm_io_client * dm_io_client_create ( unsigned num_pages ) ;
int dm_io_client_resize ( unsigned num_pages , struct dm_io_client * client ) ;
void dm_io_client_destroy ( struct dm_io_client * client ) ;
/*
* IO interface using private per - client pools .
2007-05-09 13:33:05 +04:00
* Each bit in the optional ' sync_error_bits ' bitset indicates whether an
* error occurred doing io to the corresponding region .
2007-05-09 13:33:01 +04:00
*/
int dm_io ( struct dm_io_request * io_req , unsigned num_regions ,
struct io_region * region , unsigned long * sync_error_bits ) ;
2005-04-17 02:20:36 +04:00
# endif