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 |
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: