|
1 /* |
|
2 * Copyright (C) 2001 - 2003 Sistina Software (UK) Limited. |
|
3 * Copyright (C) 2004 - 2005 Red Hat, Inc. All rights reserved. |
|
4 * |
|
5 * This file is released under the LGPL. |
|
6 */ |
|
7 |
|
8 #ifndef _LINUX_DM_IOCTL_V4_H |
|
9 #define _LINUX_DM_IOCTL_V4_H |
|
10 |
|
11 #include <linux/types.h> |
|
12 |
|
13 #define DM_DIR "mapper" /* Slashes not supported */ |
|
14 #define DM_MAX_TYPE_NAME 16 |
|
15 #define DM_NAME_LEN 128 |
|
16 #define DM_UUID_LEN 129 |
|
17 |
|
18 /* |
|
19 * A traditional ioctl interface for the device mapper. |
|
20 * |
|
21 * Each device can have two tables associated with it, an |
|
22 * 'active' table which is the one currently used by io passing |
|
23 * through the device, and an 'inactive' one which is a table |
|
24 * that is being prepared as a replacement for the 'active' one. |
|
25 * |
|
26 * DM_VERSION: |
|
27 * Just get the version information for the ioctl interface. |
|
28 * |
|
29 * DM_REMOVE_ALL: |
|
30 * Remove all dm devices, destroy all tables. Only really used |
|
31 * for debug. |
|
32 * |
|
33 * DM_LIST_DEVICES: |
|
34 * Get a list of all the dm device names. |
|
35 * |
|
36 * DM_DEV_CREATE: |
|
37 * Create a new device, neither the 'active' or 'inactive' table |
|
38 * slots will be filled. The device will be in suspended state |
|
39 * after creation, however any io to the device will get errored |
|
40 * since it will be out-of-bounds. |
|
41 * |
|
42 * DM_DEV_REMOVE: |
|
43 * Remove a device, destroy any tables. |
|
44 * |
|
45 * DM_DEV_RENAME: |
|
46 * Rename a device. |
|
47 * |
|
48 * DM_SUSPEND: |
|
49 * This performs both suspend and resume, depending which flag is |
|
50 * passed in. |
|
51 * Suspend: This command will not return until all pending io to |
|
52 * the device has completed. Further io will be deferred until |
|
53 * the device is resumed. |
|
54 * Resume: It is no longer an error to issue this command on an |
|
55 * unsuspended device. If a table is present in the 'inactive' |
|
56 * slot, it will be moved to the active slot, then the old table |
|
57 * from the active slot will be _destroyed_. Finally the device |
|
58 * is resumed. |
|
59 * |
|
60 * DM_DEV_STATUS: |
|
61 * Retrieves the status for the table in the 'active' slot. |
|
62 * |
|
63 * DM_DEV_WAIT: |
|
64 * Wait for a significant event to occur to the device. This |
|
65 * could either be caused by an event triggered by one of the |
|
66 * targets of the table in the 'active' slot, or a table change. |
|
67 * |
|
68 * DM_TABLE_LOAD: |
|
69 * Load a table into the 'inactive' slot for the device. The |
|
70 * device does _not_ need to be suspended prior to this command. |
|
71 * |
|
72 * DM_TABLE_CLEAR: |
|
73 * Destroy any table in the 'inactive' slot (ie. abort). |
|
74 * |
|
75 * DM_TABLE_DEPS: |
|
76 * Return a set of device dependencies for the 'active' table. |
|
77 * |
|
78 * DM_TABLE_STATUS: |
|
79 * Return the targets status for the 'active' table. |
|
80 * |
|
81 * DM_TARGET_MSG: |
|
82 * Pass a message string to the target at a specific offset of a device. |
|
83 * |
|
84 * DM_DEV_SET_GEOMETRY: |
|
85 * Set the geometry of a device by passing in a string in this format: |
|
86 * |
|
87 * "cylinders heads sectors_per_track start_sector" |
|
88 * |
|
89 * Beware that CHS geometry is nearly obsolete and only provided |
|
90 * for compatibility with dm devices that can be booted by a PC |
|
91 * BIOS. See struct hd_geometry for range limits. Also note that |
|
92 * the geometry is erased if the device size changes. |
|
93 */ |
|
94 |
|
95 /* |
|
96 * All ioctl arguments consist of a single chunk of memory, with |
|
97 * this structure at the start. If a uuid is specified any |
|
98 * lookup (eg. for a DM_INFO) will be done on that, *not* the |
|
99 * name. |
|
100 */ |
|
101 struct dm_ioctl { |
|
102 /* |
|
103 * The version number is made up of three parts: |
|
104 * major - no backward or forward compatibility, |
|
105 * minor - only backwards compatible, |
|
106 * patch - both backwards and forwards compatible. |
|
107 * |
|
108 * All clients of the ioctl interface should fill in the |
|
109 * version number of the interface that they were |
|
110 * compiled with. |
|
111 * |
|
112 * All recognised ioctl commands (ie. those that don't |
|
113 * return -ENOTTY) fill out this field, even if the |
|
114 * command failed. |
|
115 */ |
|
116 uint32_t version[3]; /* in/out */ |
|
117 uint32_t data_size; /* total size of data passed in |
|
118 * including this struct */ |
|
119 |
|
120 uint32_t data_start; /* offset to start of data |
|
121 * relative to start of this struct */ |
|
122 |
|
123 uint32_t target_count; /* in/out */ |
|
124 int32_t open_count; /* out */ |
|
125 uint32_t flags; /* in/out */ |
|
126 uint32_t event_nr; /* in/out */ |
|
127 uint32_t padding; |
|
128 |
|
129 uint64_t dev; /* in/out */ |
|
130 |
|
131 char name[DM_NAME_LEN]; /* device name */ |
|
132 char uuid[DM_UUID_LEN]; /* unique identifier for |
|
133 * the block device */ |
|
134 char data[7]; /* padding or data */ |
|
135 }; |
|
136 |
|
137 /* |
|
138 * Used to specify tables. These structures appear after the |
|
139 * dm_ioctl. |
|
140 */ |
|
141 struct dm_target_spec { |
|
142 uint64_t sector_start; |
|
143 uint64_t length; |
|
144 int32_t status; /* used when reading from kernel only */ |
|
145 |
|
146 /* |
|
147 * Location of the next dm_target_spec. |
|
148 * - When specifying targets on a DM_TABLE_LOAD command, this value is |
|
149 * the number of bytes from the start of the "current" dm_target_spec |
|
150 * to the start of the "next" dm_target_spec. |
|
151 * - When retrieving targets on a DM_TABLE_STATUS command, this value |
|
152 * is the number of bytes from the start of the first dm_target_spec |
|
153 * (that follows the dm_ioctl struct) to the start of the "next" |
|
154 * dm_target_spec. |
|
155 */ |
|
156 uint32_t next; |
|
157 |
|
158 char target_type[DM_MAX_TYPE_NAME]; |
|
159 |
|
160 /* |
|
161 * Parameter string starts immediately after this object. |
|
162 * Be careful to add padding after string to ensure correct |
|
163 * alignment of subsequent dm_target_spec. |
|
164 */ |
|
165 }; |
|
166 |
|
167 /* |
|
168 * Used to retrieve the target dependencies. |
|
169 */ |
|
170 struct dm_target_deps { |
|
171 uint32_t count; /* Array size */ |
|
172 uint32_t padding; /* unused */ |
|
173 uint64_t dev[0]; /* out */ |
|
174 }; |
|
175 |
|
176 /* |
|
177 * Used to get a list of all dm devices. |
|
178 */ |
|
179 struct dm_name_list { |
|
180 uint64_t dev; |
|
181 uint32_t next; /* offset to the next record from |
|
182 the _start_ of this */ |
|
183 char name[0]; |
|
184 }; |
|
185 |
|
186 /* |
|
187 * Used to retrieve the target versions |
|
188 */ |
|
189 struct dm_target_versions { |
|
190 uint32_t next; |
|
191 uint32_t version[3]; |
|
192 |
|
193 char name[0]; |
|
194 }; |
|
195 |
|
196 /* |
|
197 * Used to pass message to a target |
|
198 */ |
|
199 struct dm_target_msg { |
|
200 uint64_t sector; /* Device sector */ |
|
201 |
|
202 char message[0]; |
|
203 }; |
|
204 |
|
205 /* |
|
206 * If you change this make sure you make the corresponding change |
|
207 * to dm-ioctl.c:lookup_ioctl() |
|
208 */ |
|
209 enum { |
|
210 /* Top level cmds */ |
|
211 DM_VERSION_CMD = 0, |
|
212 DM_REMOVE_ALL_CMD, |
|
213 DM_LIST_DEVICES_CMD, |
|
214 |
|
215 /* device level cmds */ |
|
216 DM_DEV_CREATE_CMD, |
|
217 DM_DEV_REMOVE_CMD, |
|
218 DM_DEV_RENAME_CMD, |
|
219 DM_DEV_SUSPEND_CMD, |
|
220 DM_DEV_STATUS_CMD, |
|
221 DM_DEV_WAIT_CMD, |
|
222 |
|
223 /* Table level cmds */ |
|
224 DM_TABLE_LOAD_CMD, |
|
225 DM_TABLE_CLEAR_CMD, |
|
226 DM_TABLE_DEPS_CMD, |
|
227 DM_TABLE_STATUS_CMD, |
|
228 |
|
229 /* Added later */ |
|
230 DM_LIST_VERSIONS_CMD, |
|
231 DM_TARGET_MSG_CMD, |
|
232 DM_DEV_SET_GEOMETRY_CMD |
|
233 }; |
|
234 |
|
235 #define DM_IOCTL 0xfd |
|
236 |
|
237 #define DM_VERSION _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl) |
|
238 #define DM_REMOVE_ALL _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl) |
|
239 #define DM_LIST_DEVICES _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl) |
|
240 |
|
241 #define DM_DEV_CREATE _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl) |
|
242 #define DM_DEV_REMOVE _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl) |
|
243 #define DM_DEV_RENAME _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl) |
|
244 #define DM_DEV_SUSPEND _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl) |
|
245 #define DM_DEV_STATUS _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl) |
|
246 #define DM_DEV_WAIT _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl) |
|
247 |
|
248 #define DM_TABLE_LOAD _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl) |
|
249 #define DM_TABLE_CLEAR _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl) |
|
250 #define DM_TABLE_DEPS _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl) |
|
251 #define DM_TABLE_STATUS _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl) |
|
252 |
|
253 #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl) |
|
254 |
|
255 #define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl) |
|
256 #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) |
|
257 |
|
258 #define DM_VERSION_MAJOR 4 |
|
259 #define DM_VERSION_MINOR 14 |
|
260 #define DM_VERSION_PATCHLEVEL 0 |
|
261 #define DM_VERSION_EXTRA "-ioctl (2008-04-23)" |
|
262 |
|
263 /* Status bits */ |
|
264 #define DM_READONLY_FLAG (1 << 0) /* In/Out */ |
|
265 #define DM_SUSPEND_FLAG (1 << 1) /* In/Out */ |
|
266 #define DM_PERSISTENT_DEV_FLAG (1 << 3) /* In */ |
|
267 |
|
268 /* |
|
269 * Flag passed into ioctl STATUS command to get table information |
|
270 * rather than current status. |
|
271 */ |
|
272 #define DM_STATUS_TABLE_FLAG (1 << 4) /* In */ |
|
273 |
|
274 /* |
|
275 * Flags that indicate whether a table is present in either of |
|
276 * the two table slots that a device has. |
|
277 */ |
|
278 #define DM_ACTIVE_PRESENT_FLAG (1 << 5) /* Out */ |
|
279 #define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */ |
|
280 |
|
281 /* |
|
282 * Indicates that the buffer passed in wasn't big enough for the |
|
283 * results. |
|
284 */ |
|
285 #define DM_BUFFER_FULL_FLAG (1 << 8) /* Out */ |
|
286 |
|
287 /* |
|
288 * This flag is now ignored. |
|
289 */ |
|
290 #define DM_SKIP_BDGET_FLAG (1 << 9) /* In */ |
|
291 |
|
292 /* |
|
293 * Set this to avoid attempting to freeze any filesystem when suspending. |
|
294 */ |
|
295 #define DM_SKIP_LOCKFS_FLAG (1 << 10) /* In */ |
|
296 |
|
297 /* |
|
298 * Set this to suspend without flushing queued ios. |
|
299 */ |
|
300 #define DM_NOFLUSH_FLAG (1 << 11) /* In */ |
|
301 |
|
302 #endif /* _LINUX_DM_IOCTL_H */ |