]>
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 | ||
12 | /* FIXME make this configurable */ | |
13 | #define DM_MAX_IO_REGIONS 8 | |
14 | ||
15 | struct io_region { | |
16 | struct block_device *bdev; | |
17 | sector_t sector; | |
18 | sector_t count; | |
19 | }; | |
20 | ||
21 | struct page_list { | |
22 | struct page_list *next; | |
23 | struct page *page; | |
24 | }; | |
25 | ||
26 | ||
27 | /* | |
28 | * 'error' is a bitset, with each bit indicating whether an error | |
29 | * occurred doing io to the corresponding region. | |
30 | */ | |
31 | typedef void (*io_notify_fn)(unsigned long error, void *context); | |
32 | ||
33 | ||
34 | /* | |
35 | * Before anyone uses the IO interface they should call | |
36 | * dm_io_get(), specifying roughly how many pages they are | |
37 | * expecting to perform io on concurrently. | |
38 | * | |
39 | * This function may block. | |
40 | */ | |
41 | int dm_io_get(unsigned int num_pages); | |
42 | void dm_io_put(unsigned int num_pages); | |
43 | ||
44 | /* | |
45 | * Synchronous IO. | |
46 | * | |
47 | * Please ensure that the rw flag in the next two functions is | |
48 | * either READ or WRITE, ie. we don't take READA. Any | |
49 | * regions with a zero count field will be ignored. | |
50 | */ | |
51 | int dm_io_sync(unsigned int num_regions, struct io_region *where, int rw, | |
52 | struct page_list *pl, unsigned int offset, | |
53 | unsigned long *error_bits); | |
54 | ||
55 | int dm_io_sync_bvec(unsigned int num_regions, struct io_region *where, int rw, | |
56 | struct bio_vec *bvec, unsigned long *error_bits); | |
57 | ||
58 | int dm_io_sync_vm(unsigned int num_regions, struct io_region *where, int rw, | |
59 | void *data, unsigned long *error_bits); | |
60 | ||
61 | /* | |
62 | * Aynchronous IO. | |
63 | * | |
64 | * The 'where' array may be safely allocated on the stack since | |
65 | * the function takes a copy. | |
66 | */ | |
67 | int dm_io_async(unsigned int num_regions, struct io_region *where, int rw, | |
68 | struct page_list *pl, unsigned int offset, | |
69 | io_notify_fn fn, void *context); | |
70 | ||
71 | int dm_io_async_bvec(unsigned int num_regions, struct io_region *where, int rw, | |
72 | struct bio_vec *bvec, io_notify_fn fn, void *context); | |
73 | ||
74 | int dm_io_async_vm(unsigned int num_regions, struct io_region *where, int rw, | |
75 | void *data, io_notify_fn fn, void *context); | |
76 | ||
77 | #endif |