]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Copyright (C) 2001 Sistina Software (UK) Limited. | |
3 | * Copyright (C) 2004 Red Hat, Inc. All rights reserved. | |
4 | * | |
5 | * This file is released under the LGPL. | |
6 | */ | |
7 | ||
8 | #ifndef _LINUX_DEVICE_MAPPER_H | |
9 | #define _LINUX_DEVICE_MAPPER_H | |
10 | ||
11 | struct dm_target; | |
12 | struct dm_table; | |
13 | struct dm_dev; | |
14 | ||
15 | typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t; | |
16 | ||
17 | union map_info { | |
18 | void *ptr; | |
19 | unsigned long long ll; | |
20 | }; | |
21 | ||
22 | /* | |
23 | * In the constructor the target parameter will already have the | |
24 | * table, type, begin and len fields filled in. | |
25 | */ | |
26 | typedef int (*dm_ctr_fn) (struct dm_target *target, | |
27 | unsigned int argc, char **argv); | |
28 | ||
29 | /* | |
30 | * The destructor doesn't need to free the dm_target, just | |
31 | * anything hidden ti->private. | |
32 | */ | |
33 | typedef void (*dm_dtr_fn) (struct dm_target *ti); | |
34 | ||
35 | /* | |
36 | * The map function must return: | |
37 | * < 0: error | |
38 | * = 0: The target will handle the io by resubmitting it later | |
39 | * > 0: simple remap complete | |
40 | */ | |
41 | typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio, | |
42 | union map_info *map_context); | |
43 | ||
44 | /* | |
45 | * Returns: | |
46 | * < 0 : error (currently ignored) | |
47 | * 0 : ended successfully | |
48 | * 1 : for some reason the io has still not completed (eg, | |
49 | * multipath target might want to requeue a failed io). | |
50 | */ | |
51 | typedef int (*dm_endio_fn) (struct dm_target *ti, | |
52 | struct bio *bio, int error, | |
53 | union map_info *map_context); | |
54 | ||
55 | typedef void (*dm_presuspend_fn) (struct dm_target *ti); | |
56 | typedef void (*dm_postsuspend_fn) (struct dm_target *ti); | |
57 | typedef void (*dm_resume_fn) (struct dm_target *ti); | |
58 | ||
59 | typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type, | |
60 | char *result, unsigned int maxlen); | |
61 | ||
62 | typedef int (*dm_message_fn) (struct dm_target *ti, unsigned argc, char **argv); | |
63 | ||
64 | void dm_error(const char *message); | |
65 | ||
66 | /* | |
67 | * Constructors should call these functions to ensure destination devices | |
68 | * are opened/closed correctly. | |
69 | * FIXME: too many arguments. | |
70 | */ | |
71 | int dm_get_device(struct dm_target *ti, const char *path, sector_t start, | |
72 | sector_t len, int mode, struct dm_dev **result); | |
73 | void dm_put_device(struct dm_target *ti, struct dm_dev *d); | |
74 | ||
75 | /* | |
76 | * Information about a target type | |
77 | */ | |
78 | struct target_type { | |
79 | const char *name; | |
80 | struct module *module; | |
81 | unsigned version[3]; | |
82 | dm_ctr_fn ctr; | |
83 | dm_dtr_fn dtr; | |
84 | dm_map_fn map; | |
85 | dm_endio_fn end_io; | |
86 | dm_presuspend_fn presuspend; | |
87 | dm_postsuspend_fn postsuspend; | |
88 | dm_resume_fn resume; | |
89 | dm_status_fn status; | |
90 | dm_message_fn message; | |
91 | }; | |
92 | ||
93 | struct io_restrictions { | |
94 | unsigned short max_sectors; | |
95 | unsigned short max_phys_segments; | |
96 | unsigned short max_hw_segments; | |
97 | unsigned short hardsect_size; | |
98 | unsigned int max_segment_size; | |
99 | unsigned long seg_boundary_mask; | |
100 | }; | |
101 | ||
102 | struct dm_target { | |
103 | struct dm_table *table; | |
104 | struct target_type *type; | |
105 | ||
106 | /* target limits */ | |
107 | sector_t begin; | |
108 | sector_t len; | |
109 | ||
110 | /* FIXME: turn this into a mask, and merge with io_restrictions */ | |
111 | /* Always a power of 2 */ | |
112 | sector_t split_io; | |
113 | ||
114 | /* | |
115 | * These are automatically filled in by | |
116 | * dm_table_get_device. | |
117 | */ | |
118 | struct io_restrictions limits; | |
119 | ||
120 | /* target specific data */ | |
121 | void *private; | |
122 | ||
123 | /* Used to provide an error string from the ctr */ | |
124 | char *error; | |
125 | }; | |
126 | ||
127 | int dm_register_target(struct target_type *t); | |
128 | int dm_unregister_target(struct target_type *t); | |
129 | ||
130 | #endif /* _LINUX_DEVICE_MAPPER_H */ |