Dr Andrew Scott G7VAV

My photo
 
June 2025
Mo Tu We Th Fr Sa Su
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6


dm-ioctl.h
001: /*
002:  * Copyright (C) 2001 - 2003 Sistina Software (UK) Limited.
003:  * Copyright (C) 2004 - 2009 Red Hat, Inc. All rights reserved.
004:  *
005:  * This file is released under the LGPL.
006:  */
007: 
008: #ifndef _LINUX_DM_IOCTL_V4_H
009: #define _LINUX_DM_IOCTL_V4_H
010: 
011: #include <linux/types.h>
012: 
013: #define DM_DIR "mapper"         /* Slashes not supported */
014: #define DM_CONTROL_NODE "control"
015: #define DM_MAX_TYPE_NAME 16
016: #define DM_NAME_LEN 128
017: #define DM_UUID_LEN 129
018: 
019: /*
020:  * A traditional ioctl interface for the device mapper.
021:  *
022:  * Each device can have two tables associated with it, an
023:  * 'active' table which is the one currently used by io passing
024:  * through the device, and an 'inactive' one which is a table
025:  * that is being prepared as a replacement for the 'active' one.
026:  *
027:  * DM_VERSION:
028:  * Just get the version information for the ioctl interface.
029:  *
030:  * DM_REMOVE_ALL:
031:  * Remove all dm devices, destroy all tables.  Only really used
032:  * for debug.
033:  *
034:  * DM_LIST_DEVICES:
035:  * Get a list of all the dm device names.
036:  *
037:  * DM_DEV_CREATE:
038:  * Create a new device, neither the 'active' or 'inactive' table
039:  * slots will be filled.  The device will be in suspended state
040:  * after creation, however any io to the device will get errored
041:  * since it will be out-of-bounds.
042:  *
043:  * DM_DEV_REMOVE:
044:  * Remove a device, destroy any tables.
045:  *
046:  * DM_DEV_RENAME:
047:  * Rename a device or set its uuid if none was previously supplied.
048:  *
049:  * DM_SUSPEND:
050:  * This performs both suspend and resume, depending which flag is
051:  * passed in.
052:  * Suspend: This command will not return until all pending io to
053:  * the device has completed.  Further io will be deferred until
054:  * the device is resumed.
055:  * Resume: It is no longer an error to issue this command on an
056:  * unsuspended device.  If a table is present in the 'inactive'
057:  * slot, it will be moved to the active slot, then the old table
058:  * from the active slot will be _destroyed_.  Finally the device
059:  * is resumed.
060:  *
061:  * DM_DEV_STATUS:
062:  * Retrieves the status for the table in the 'active' slot.
063:  *
064:  * DM_DEV_WAIT:
065:  * Wait for a significant event to occur to the device.  This
066:  * could either be caused by an event triggered by one of the
067:  * targets of the table in the 'active' slot, or a table change.
068:  *
069:  * DM_TABLE_LOAD:
070:  * Load a table into the 'inactive' slot for the device.  The
071:  * device does _not_ need to be suspended prior to this command.
072:  *
073:  * DM_TABLE_CLEAR:
074:  * Destroy any table in the 'inactive' slot (ie. abort).
075:  *
076:  * DM_TABLE_DEPS:
077:  * Return a set of device dependencies for the 'active' table.
078:  *
079:  * DM_TABLE_STATUS:
080:  * Return the targets status for the 'active' table.
081:  *
082:  * DM_TARGET_MSG:
083:  * Pass a message string to the target at a specific offset of a device.
084:  *
085:  * DM_DEV_SET_GEOMETRY:
086:  * Set the geometry of a device by passing in a string in this format:
087:  *
088:  * "cylinders heads sectors_per_track start_sector"
089:  *
090:  * Beware that CHS geometry is nearly obsolete and only provided
091:  * for compatibility with dm devices that can be booted by a PC
092:  * BIOS.  See struct hd_geometry for range limits.  Also note that
093:  * the geometry is erased if the device size changes.
094:  */
095: 
096: /*
097:  * All ioctl arguments consist of a single chunk of memory, with
098:  * this structure at the start.  If a uuid is specified any
099:  * lookup (eg. for a DM_INFO) will be done on that, *not* the
100:  * name.
101:  */
102: struct dm_ioctl {
103:         /*
104:          * The version number is made up of three parts:
105:          * major - no backward or forward compatibility,
106:          * minor - only backwards compatible,
107:          * patch - both backwards and forwards compatible.
108:          *
109:          * All clients of the ioctl interface should fill in the
110:          * version number of the interface that they were
111:          * compiled with.
112:          *
113:          * All recognised ioctl commands (ie. those that don't
114:          * return -ENOTTY) fill out this field, even if the
115:          * command failed.
116:          */
117:         __u32 version[3];       /* in/out */
118:         __u32 data_size;        /* total size of data passed in
119:                                  * including this struct */
120: 
121:         __u32 data_start;       /* offset to start of data
122:                                  * relative to start of this struct */
123: 
124:         __u32 target_count;     /* in/out */
125:         __s32 open_count;       /* out */
126:         __u32 flags;            /* in/out */
127: 
128:         /*
129:          * event_nr holds either the event number (input and output) or the
130:          * udev cookie value (input only).
131:          * The DM_DEV_WAIT ioctl takes an event number as input.
132:          * The DM_SUSPEND, DM_DEV_REMOVE and DM_DEV_RENAME ioctls
133:          * use the field as a cookie to return in the DM_COOKIE
134:          * variable with the uevents they issue.
135:          * For output, the ioctls return the event number, not the cookie.
136:          */
137:         __u32 event_nr;         /* in/out */
138:         __u32 padding;
139: 
140:         __u64 dev;              /* in/out */
141: 
142:         char name[DM_NAME_LEN]; /* device name */
143:         char uuid[DM_UUID_LEN]; /* unique identifier for
144:                                  * the block device */
145:         char data[7];           /* padding or data */
146: };
147: 
148: /*
149:  * Used to specify tables.  These structures appear after the
150:  * dm_ioctl.
151:  */
152: struct dm_target_spec {
153:         __u64 sector_start;
154:         __u64 length;
155:         __s32 status;           /* used when reading from kernel only */
156: 
157:         /*
158:          * Location of the next dm_target_spec.
159:          * - When specifying targets on a DM_TABLE_LOAD command, this value is
160:          *   the number of bytes from the start of the "current" dm_target_spec
161:          *   to the start of the "next" dm_target_spec.
162:          * - When retrieving targets on a DM_TABLE_STATUS command, this value
163:          *   is the number of bytes from the start of the first dm_target_spec
164:          *   (that follows the dm_ioctl struct) to the start of the "next"
165:          *   dm_target_spec.
166:          */
167:         __u32 next;
168: 
169:         char target_type[DM_MAX_TYPE_NAME];
170: 
171:         /*
172:          * Parameter string starts immediately after this object.
173:          * Be careful to add padding after string to ensure correct
174:          * alignment of subsequent dm_target_spec.
175:          */
176: };
177: 
178: /*
179:  * Used to retrieve the target dependencies.
180:  */
181: struct dm_target_deps {
182:         __u32 count;    /* Array size */
183:         __u32 padding;  /* unused */
184:         __u64 dev[0];   /* out */
185: };
186: 
187: /*
188:  * Used to get a list of all dm devices.
189:  */
190: struct dm_name_list {
191:         __u64 dev;
192:         __u32 next;             /* offset to the next record from
193:                                    the _start_ of this */
194:         char name[0];
195: };
196: 
197: /*
198:  * Used to retrieve the target versions
199:  */
200: struct dm_target_versions {
201:         __u32 next;
202:         __u32 version[3];
203: 
204:         char name[0];
205: };
206: 
207: /*
208:  * Used to pass message to a target
209:  */
210: struct dm_target_msg {
211:         __u64 sector;   /* Device sector */
212: 
213:         char message[0];
214: };
215: 
216: /*
217:  * If you change this make sure you make the corresponding change
218:  * to dm-ioctl.c:lookup_ioctl()
219:  */
220: enum {
221:         /* Top level cmds */
222:         DM_VERSION_CMD = 0,
223:         DM_REMOVE_ALL_CMD,
224:         DM_LIST_DEVICES_CMD,
225: 
226:         /* device level cmds */
227:         DM_DEV_CREATE_CMD,
228:         DM_DEV_REMOVE_CMD,
229:         DM_DEV_RENAME_CMD,
230:         DM_DEV_SUSPEND_CMD,
231:         DM_DEV_STATUS_CMD,
232:         DM_DEV_WAIT_CMD,
233: 
234:         /* Table level cmds */
235:         DM_TABLE_LOAD_CMD,
236:         DM_TABLE_CLEAR_CMD,
237:         DM_TABLE_DEPS_CMD,
238:         DM_TABLE_STATUS_CMD,
239: 
240:         /* Added later */
241:         DM_LIST_VERSIONS_CMD,
242:         DM_TARGET_MSG_CMD,
243:         DM_DEV_SET_GEOMETRY_CMD
244: };
245: 
246: #define DM_IOCTL 0xfd
247: 
248: #define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
249: #define DM_REMOVE_ALL    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl)
250: #define DM_LIST_DEVICES  _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl)
251: 
252: #define DM_DEV_CREATE    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl)
253: #define DM_DEV_REMOVE    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl)
254: #define DM_DEV_RENAME    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl)
255: #define DM_DEV_SUSPEND   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl)
256: #define DM_DEV_STATUS    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl)
257: #define DM_DEV_WAIT      _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl)
258: 
259: #define DM_TABLE_LOAD    _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl)
260: #define DM_TABLE_CLEAR   _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl)
261: #define DM_TABLE_DEPS    _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl)
262: #define DM_TABLE_STATUS  _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl)
263: 
264: #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl)
265: 
266: #define DM_TARGET_MSG    _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl)
267: #define DM_DEV_SET_GEOMETRY     _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
268: 
269: #define DM_VERSION_MAJOR        4
270: #define DM_VERSION_MINOR        22
271: #define DM_VERSION_PATCHLEVEL   0
272: #define DM_VERSION_EXTRA        "-ioctl (2011-10-19)"
273: 
274: /* Status bits */
275: #define DM_READONLY_FLAG        (1 << 0) /* In/Out */
276: #define DM_SUSPEND_FLAG         (1 << 1) /* In/Out */
277: #define DM_PERSISTENT_DEV_FLAG  (1 << 3) /* In */
278: 
279: /*
280:  * Flag passed into ioctl STATUS command to get table information
281:  * rather than current status.
282:  */
283: #define DM_STATUS_TABLE_FLAG    (1 << 4) /* In */
284: 
285: /*
286:  * Flags that indicate whether a table is present in either of
287:  * the two table slots that a device has.
288:  */
289: #define DM_ACTIVE_PRESENT_FLAG   (1 << 5) /* Out */
290: #define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */
291: 
292: /*
293:  * Indicates that the buffer passed in wasn't big enough for the
294:  * results.
295:  */
296: #define DM_BUFFER_FULL_FLAG     (1 << 8) /* Out */
297: 
298: /*
299:  * This flag is now ignored.
300:  */
301: #define DM_SKIP_BDGET_FLAG      (1 << 9) /* In */
302: 
303: /*
304:  * Set this to avoid attempting to freeze any filesystem when suspending.
305:  */
306: #define DM_SKIP_LOCKFS_FLAG     (1 << 10) /* In */
307: 
308: /*
309:  * Set this to suspend without flushing queued ios.
310:  */
311: #define DM_NOFLUSH_FLAG         (1 << 11) /* In */
312: 
313: /*
314:  * If set, any table information returned will relate to the inactive
315:  * table instead of the live one.  Always check DM_INACTIVE_PRESENT_FLAG
316:  * is set before using the data returned.
317:  */
318: #define DM_QUERY_INACTIVE_TABLE_FLAG    (1 << 12) /* In */
319: 
320: /*
321:  * If set, a uevent was generated for which the caller may need to wait.
322:  */
323: #define DM_UEVENT_GENERATED_FLAG        (1 << 13) /* Out */
324: 
325: /*
326:  * If set, rename changes the uuid not the name.  Only permitted
327:  * if no uuid was previously supplied: an existing uuid cannot be changed.
328:  */
329: #define DM_UUID_FLAG                    (1 << 14) /* In */
330: 
331: /*
332:  * If set, all buffers are wiped after use. Use when sending
333:  * or requesting sensitive data such as an encryption key.
334:  */
335: #define DM_SECURE_DATA_FLAG             (1 << 15) /* In */
336: 
337: #endif                          /* _LINUX_DM_IOCTL_H */
338: 


for client (none)
© Andrew Scott 2006 - 2025,
All Rights Reserved
http://www.andrew-scott.uk/
Andrew Scott
http://www.andrew-scott.co.uk/