Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Copyright (C) 2003 Sistina Software | |
3 | * | |
4 | * This file is released under the GPL. | |
5 | */ | |
6 | ||
7 | #ifndef _DM_IO_H | |
8 | #define _DM_IO_H | |
9 | ||
10 | #include "dm.h" | |
11 | ||
1da177e4 LT |
12 | struct io_region { |
13 | struct block_device *bdev; | |
14 | sector_t sector; | |
15 | sector_t count; | |
16 | }; | |
17 | ||
18 | struct page_list { | |
19 | struct page_list *next; | |
20 | struct page *page; | |
21 | }; | |
22 | ||
1da177e4 LT |
23 | /* |
24 | * 'error' is a bitset, with each bit indicating whether an error | |
25 | * occurred doing io to the corresponding region. | |
26 | */ | |
27 | typedef void (*io_notify_fn)(unsigned long error, void *context); | |
28 | ||
c8b03afe HM |
29 | enum dm_io_mem_type { |
30 | DM_IO_PAGE_LIST,/* Page list */ | |
31 | DM_IO_BVEC, /* Bio vector */ | |
32 | DM_IO_VMA, /* Virtual memory area */ | |
33 | DM_IO_KMEM, /* Kernel memory */ | |
34 | }; | |
35 | ||
36 | struct dm_io_memory { | |
37 | enum dm_io_mem_type type; | |
38 | ||
39 | union { | |
40 | struct page_list *pl; | |
41 | struct bio_vec *bvec; | |
42 | void *vma; | |
43 | void *addr; | |
44 | } ptr; | |
45 | ||
46 | unsigned offset; | |
47 | }; | |
48 | ||
49 | struct dm_io_notify { | |
50 | io_notify_fn fn; /* Callback for asynchronous requests */ | |
51 | void *context; /* Passed to callback */ | |
52 | }; | |
53 | ||
54 | /* | |
55 | * IO request structure | |
56 | */ | |
57 | struct dm_io_client; | |
58 | struct dm_io_request { | |
59 | int bi_rw; /* READ|WRITE - not READA */ | |
60 | struct dm_io_memory mem; /* Memory to use for io */ | |
61 | struct dm_io_notify notify; /* Synchronous if notify.fn is NULL */ | |
62 | struct dm_io_client *client; /* Client memory handler */ | |
63 | }; | |
1da177e4 LT |
64 | |
65 | /* | |
66 | * Before anyone uses the IO interface they should call | |
67 | * dm_io_get(), specifying roughly how many pages they are | |
68 | * expecting to perform io on concurrently. | |
69 | * | |
70 | * This function may block. | |
71 | */ | |
72 | int dm_io_get(unsigned int num_pages); | |
73 | void dm_io_put(unsigned int num_pages); | |
74 | ||
c8b03afe HM |
75 | /* |
76 | * For async io calls, users can alternatively use the dm_io() function below | |
77 | * and dm_io_client_create() to create private mempools for the client. | |
78 | * | |
79 | * Create/destroy may block. | |
80 | */ | |
81 | struct dm_io_client *dm_io_client_create(unsigned num_pages); | |
82 | int dm_io_client_resize(unsigned num_pages, struct dm_io_client *client); | |
83 | void dm_io_client_destroy(struct dm_io_client *client); | |
84 | ||
1da177e4 LT |
85 | /* |
86 | * Synchronous IO. | |
87 | * | |
88 | * Please ensure that the rw flag in the next two functions is | |
89 | * either READ or WRITE, ie. we don't take READA. Any | |
90 | * regions with a zero count field will be ignored. | |
91 | */ | |
92 | int dm_io_sync(unsigned int num_regions, struct io_region *where, int rw, | |
93 | struct page_list *pl, unsigned int offset, | |
94 | unsigned long *error_bits); | |
95 | ||
96 | int dm_io_sync_bvec(unsigned int num_regions, struct io_region *where, int rw, | |
97 | struct bio_vec *bvec, unsigned long *error_bits); | |
98 | ||
99 | int dm_io_sync_vm(unsigned int num_regions, struct io_region *where, int rw, | |
100 | void *data, unsigned long *error_bits); | |
101 | ||
102 | /* | |
103 | * Aynchronous IO. | |
104 | * | |
105 | * The 'where' array may be safely allocated on the stack since | |
106 | * the function takes a copy. | |
107 | */ | |
108 | int dm_io_async(unsigned int num_regions, struct io_region *where, int rw, | |
109 | struct page_list *pl, unsigned int offset, | |
110 | io_notify_fn fn, void *context); | |
111 | ||
112 | int dm_io_async_bvec(unsigned int num_regions, struct io_region *where, int rw, | |
113 | struct bio_vec *bvec, io_notify_fn fn, void *context); | |
114 | ||
115 | int dm_io_async_vm(unsigned int num_regions, struct io_region *where, int rw, | |
116 | void *data, io_notify_fn fn, void *context); | |
117 | ||
c8b03afe HM |
118 | /* |
119 | * IO interface using private per-client pools. | |
120 | */ | |
121 | int dm_io(struct dm_io_request *io_req, unsigned num_regions, | |
122 | struct io_region *region, unsigned long *sync_error_bits); | |
123 | ||
1da177e4 | 124 | #endif |