diff options
Diffstat (limited to 'drivers/md/dm.h')
-rw-r--r-- | drivers/md/dm.h | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/drivers/md/dm.h b/drivers/md/dm.h new file mode 100644 index 000000000000..e38c3fc1a1db --- /dev/null +++ b/drivers/md/dm.h | |||
@@ -0,0 +1,195 @@ | |||
1 | /* | ||
2 | * Internal header file for device mapper | ||
3 | * | ||
4 | * Copyright (C) 2001, 2002 Sistina Software | ||
5 | * Copyright (C) 2004 Red Hat, Inc. All rights reserved. | ||
6 | * | ||
7 | * This file is released under the LGPL. | ||
8 | */ | ||
9 | |||
10 | #ifndef DM_INTERNAL_H | ||
11 | #define DM_INTERNAL_H | ||
12 | |||
13 | #include <linux/fs.h> | ||
14 | #include <linux/device-mapper.h> | ||
15 | #include <linux/list.h> | ||
16 | #include <linux/blkdev.h> | ||
17 | |||
18 | #define DM_NAME "device-mapper" | ||
19 | #define DMWARN(f, x...) printk(KERN_WARNING DM_NAME ": " f "\n" , ## x) | ||
20 | #define DMERR(f, x...) printk(KERN_ERR DM_NAME ": " f "\n" , ## x) | ||
21 | #define DMINFO(f, x...) printk(KERN_INFO DM_NAME ": " f "\n" , ## x) | ||
22 | |||
23 | #define DMEMIT(x...) sz += ((sz >= maxlen) ? \ | ||
24 | 0 : scnprintf(result + sz, maxlen - sz, x)) | ||
25 | |||
26 | /* | ||
27 | * FIXME: I think this should be with the definition of sector_t | ||
28 | * in types.h. | ||
29 | */ | ||
30 | #ifdef CONFIG_LBD | ||
31 | #define SECTOR_FORMAT "%Lu" | ||
32 | #else | ||
33 | #define SECTOR_FORMAT "%lu" | ||
34 | #endif | ||
35 | |||
36 | #define SECTOR_SHIFT 9 | ||
37 | |||
38 | /* | ||
39 | * List of devices that a metadevice uses and should open/close. | ||
40 | */ | ||
41 | struct dm_dev { | ||
42 | struct list_head list; | ||
43 | |||
44 | atomic_t count; | ||
45 | int mode; | ||
46 | struct block_device *bdev; | ||
47 | char name[16]; | ||
48 | }; | ||
49 | |||
50 | struct dm_table; | ||
51 | struct mapped_device; | ||
52 | |||
53 | /*----------------------------------------------------------------- | ||
54 | * Functions for manipulating a struct mapped_device. | ||
55 | * Drop the reference with dm_put when you finish with the object. | ||
56 | *---------------------------------------------------------------*/ | ||
57 | int dm_create(struct mapped_device **md); | ||
58 | int dm_create_with_minor(unsigned int minor, struct mapped_device **md); | ||
59 | void dm_set_mdptr(struct mapped_device *md, void *ptr); | ||
60 | void *dm_get_mdptr(dev_t dev); | ||
61 | |||
62 | /* | ||
63 | * Reference counting for md. | ||
64 | */ | ||
65 | void dm_get(struct mapped_device *md); | ||
66 | void dm_put(struct mapped_device *md); | ||
67 | |||
68 | /* | ||
69 | * A device can still be used while suspended, but I/O is deferred. | ||
70 | */ | ||
71 | int dm_suspend(struct mapped_device *md); | ||
72 | int dm_resume(struct mapped_device *md); | ||
73 | |||
74 | /* | ||
75 | * The device must be suspended before calling this method. | ||
76 | */ | ||
77 | int dm_swap_table(struct mapped_device *md, struct dm_table *t); | ||
78 | |||
79 | /* | ||
80 | * Drop a reference on the table when you've finished with the | ||
81 | * result. | ||
82 | */ | ||
83 | struct dm_table *dm_get_table(struct mapped_device *md); | ||
84 | |||
85 | /* | ||
86 | * Event functions. | ||
87 | */ | ||
88 | uint32_t dm_get_event_nr(struct mapped_device *md); | ||
89 | int dm_wait_event(struct mapped_device *md, int event_nr); | ||
90 | |||
91 | /* | ||
92 | * Info functions. | ||
93 | */ | ||
94 | struct gendisk *dm_disk(struct mapped_device *md); | ||
95 | int dm_suspended(struct mapped_device *md); | ||
96 | |||
97 | /*----------------------------------------------------------------- | ||
98 | * Functions for manipulating a table. Tables are also reference | ||
99 | * counted. | ||
100 | *---------------------------------------------------------------*/ | ||
101 | int dm_table_create(struct dm_table **result, int mode, unsigned num_targets); | ||
102 | |||
103 | void dm_table_get(struct dm_table *t); | ||
104 | void dm_table_put(struct dm_table *t); | ||
105 | |||
106 | int dm_table_add_target(struct dm_table *t, const char *type, | ||
107 | sector_t start, sector_t len, char *params); | ||
108 | int dm_table_complete(struct dm_table *t); | ||
109 | void dm_table_event_callback(struct dm_table *t, | ||
110 | void (*fn)(void *), void *context); | ||
111 | void dm_table_event(struct dm_table *t); | ||
112 | sector_t dm_table_get_size(struct dm_table *t); | ||
113 | struct dm_target *dm_table_get_target(struct dm_table *t, unsigned int index); | ||
114 | struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector); | ||
115 | void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q); | ||
116 | unsigned int dm_table_get_num_targets(struct dm_table *t); | ||
117 | struct list_head *dm_table_get_devices(struct dm_table *t); | ||
118 | int dm_table_get_mode(struct dm_table *t); | ||
119 | void dm_table_presuspend_targets(struct dm_table *t); | ||
120 | void dm_table_postsuspend_targets(struct dm_table *t); | ||
121 | void dm_table_resume_targets(struct dm_table *t); | ||
122 | int dm_table_any_congested(struct dm_table *t, int bdi_bits); | ||
123 | void dm_table_unplug_all(struct dm_table *t); | ||
124 | int dm_table_flush_all(struct dm_table *t); | ||
125 | |||
126 | /*----------------------------------------------------------------- | ||
127 | * A registry of target types. | ||
128 | *---------------------------------------------------------------*/ | ||
129 | int dm_target_init(void); | ||
130 | void dm_target_exit(void); | ||
131 | struct target_type *dm_get_target_type(const char *name); | ||
132 | void dm_put_target_type(struct target_type *t); | ||
133 | int dm_target_iterate(void (*iter_func)(struct target_type *tt, | ||
134 | void *param), void *param); | ||
135 | |||
136 | |||
137 | /*----------------------------------------------------------------- | ||
138 | * Useful inlines. | ||
139 | *---------------------------------------------------------------*/ | ||
140 | static inline int array_too_big(unsigned long fixed, unsigned long obj, | ||
141 | unsigned long num) | ||
142 | { | ||
143 | return (num > (ULONG_MAX - fixed) / obj); | ||
144 | } | ||
145 | |||
146 | /* | ||
147 | * Ceiling(n / sz) | ||
148 | */ | ||
149 | #define dm_div_up(n, sz) (((n) + (sz) - 1) / (sz)) | ||
150 | |||
151 | #define dm_sector_div_up(n, sz) ( \ | ||
152 | { \ | ||
153 | sector_t _r = ((n) + (sz) - 1); \ | ||
154 | sector_div(_r, (sz)); \ | ||
155 | _r; \ | ||
156 | } \ | ||
157 | ) | ||
158 | |||
159 | /* | ||
160 | * ceiling(n / size) * size | ||
161 | */ | ||
162 | #define dm_round_up(n, sz) (dm_div_up((n), (sz)) * (sz)) | ||
163 | |||
164 | static inline sector_t to_sector(unsigned long n) | ||
165 | { | ||
166 | return (n >> 9); | ||
167 | } | ||
168 | |||
169 | static inline unsigned long to_bytes(sector_t n) | ||
170 | { | ||
171 | return (n << 9); | ||
172 | } | ||
173 | |||
174 | int dm_split_args(int *argc, char ***argvp, char *input); | ||
175 | |||
176 | /* | ||
177 | * The device-mapper can be driven through one of two interfaces; | ||
178 | * ioctl or filesystem, depending which patch you have applied. | ||
179 | */ | ||
180 | int dm_interface_init(void); | ||
181 | void dm_interface_exit(void); | ||
182 | |||
183 | /* | ||
184 | * Targets for linear and striped mappings | ||
185 | */ | ||
186 | int dm_linear_init(void); | ||
187 | void dm_linear_exit(void); | ||
188 | |||
189 | int dm_stripe_init(void); | ||
190 | void dm_stripe_exit(void); | ||
191 | |||
192 | void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size); | ||
193 | union map_info *dm_get_mapinfo(struct bio *bio); | ||
194 | |||
195 | #endif | ||