diff options
Diffstat (limited to 'include/linux/dm-io.h')
| -rw-r--r-- | include/linux/dm-io.h | 85 | 
1 files changed, 85 insertions, 0 deletions
diff --git a/include/linux/dm-io.h b/include/linux/dm-io.h new file mode 100644 index 00000000000..b6bf17ee2f6 --- /dev/null +++ b/include/linux/dm-io.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2003 Sistina Software + * Copyright (C) 2004 - 2008 Red Hat, Inc. All rights reserved. + * + * Device-Mapper low-level I/O. + * + * This file is released under the GPL. + */ + +#ifndef _LINUX_DM_IO_H +#define _LINUX_DM_IO_H + +#ifdef __KERNEL__ + +#include <linux/types.h> + +struct dm_io_region { +	struct block_device *bdev; +	sector_t sector; +	sector_t count;		/* If this is zero the region is ignored. */ +}; + +struct page_list { +	struct page_list *next; +	struct page *page; +}; + +typedef void (*io_notify_fn)(unsigned long error, void *context); + +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 */ +}; + +/* + * 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. + * Each bit in the optional 'sync_error_bits' bitset indicates whether an + * error occurred doing io to the corresponding region. + */ +int dm_io(struct dm_io_request *io_req, unsigned num_regions, +	  struct dm_io_region *region, unsigned long *sync_error_bits); + +#endif	/* __KERNEL__ */ +#endif	/* _LINUX_DM_IO_H */  |