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 /* 236 * The dm_ioctl struct passed into the ioctl is just the header 237 * on a larger chunk of memory. On x86-64 and other 238 * architectures the dm-ioctl struct will be padded to an 8 byte 239 * boundary so the size will be different, which would change the 240 * ioctl code - yes I really messed up. This hack forces these 241 * architectures to have the correct ioctl code. 242 */ 243 #ifdef CONFIG_COMPAT 244 typedef char ioctl_struct[308]; 245 #define DM_VERSION_32 _IOWR(DM_IOCTL, DM_VERSION_CMD, ioctl_struct) 246 #define DM_REMOVE_ALL_32 _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, ioctl_struct) 247 #define DM_LIST_DEVICES_32 _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, ioctl_struct) 248 249 #define DM_DEV_CREATE_32 _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, ioctl_struct) 250 #define DM_DEV_REMOVE_32 _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, ioctl_struct) 251 #define DM_DEV_RENAME_32 _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, ioctl_struct) 252 #define DM_DEV_SUSPEND_32 _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, ioctl_struct) 253 #define DM_DEV_STATUS_32 _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, ioctl_struct) 254 #define DM_DEV_WAIT_32 _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, ioctl_struct) 255 256 #define DM_TABLE_LOAD_32 _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, ioctl_struct) 257 #define DM_TABLE_CLEAR_32 _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, ioctl_struct) 258 #define DM_TABLE_DEPS_32 _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, ioctl_struct) 259 #define DM_TABLE_STATUS_32 _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, ioctl_struct) 260 #define DM_LIST_VERSIONS_32 _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, ioctl_struct) 261 #define DM_TARGET_MSG_32 _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, ioctl_struct) 262 #define DM_DEV_SET_GEOMETRY_32 _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, ioctl_struct) 263 #endif 264 265 #define DM_IOCTL 0xfd 266 267 #define DM_VERSION _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl) 268 #define DM_REMOVE_ALL _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl) 269 #define DM_LIST_DEVICES _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl) 270 271 #define DM_DEV_CREATE _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl) 272 #define DM_DEV_REMOVE _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl) 273 #define DM_DEV_RENAME _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl) 274 #define DM_DEV_SUSPEND _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl) 275 #define DM_DEV_STATUS _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl) 276 #define DM_DEV_WAIT _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl) 277 278 #define DM_TABLE_LOAD _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl) 279 #define DM_TABLE_CLEAR _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl) 280 #define DM_TABLE_DEPS _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl) 281 #define DM_TABLE_STATUS _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl) 282 283 #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl) 284 285 #define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl) 286 #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) 287 288 #define DM_VERSION_MAJOR 4 289 #define DM_VERSION_MINOR 12 290 #define DM_VERSION_PATCHLEVEL 0 291 #define DM_VERSION_EXTRA "-ioctl (2007-10-02)" 292 293 /* Status bits */ 294 #define DM_READONLY_FLAG (1 << 0) /* In/Out */ 295 #define DM_SUSPEND_FLAG (1 << 1) /* In/Out */ 296 #define DM_PERSISTENT_DEV_FLAG (1 << 3) /* In */ 297 298 /* 299 * Flag passed into ioctl STATUS command to get table information 300 * rather than current status. 301 */ 302 #define DM_STATUS_TABLE_FLAG (1 << 4) /* In */ 303 304 /* 305 * Flags that indicate whether a table is present in either of 306 * the two table slots that a device has. 307 */ 308 #define DM_ACTIVE_PRESENT_FLAG (1 << 5) /* Out */ 309 #define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */ 310 311 /* 312 * Indicates that the buffer passed in wasn't big enough for the 313 * results. 314 */ 315 #define DM_BUFFER_FULL_FLAG (1 << 8) /* Out */ 316 317 /* 318 * This flag is now ignored. 319 */ 320 #define DM_SKIP_BDGET_FLAG (1 << 9) /* In */ 321 322 /* 323 * Set this to avoid attempting to freeze any filesystem when suspending. 324 */ 325 #define DM_SKIP_LOCKFS_FLAG (1 << 10) /* In */ 326 327 /* 328 * Set this to suspend without flushing queued ios. 329 */ 330 #define DM_NOFLUSH_FLAG (1 << 11) /* In */ 331 332 #endif /* _LINUX_DM_IOCTL_H */ 333