1 /* SPDX-License-Identifier: LGPL-2.0+ WITH Linux-syscall-note */ 2 /* 3 * Copyright (C) 2001 - 2003 Sistina Software (UK) Limited. 4 * Copyright (C) 2004 - 2009 Red Hat, Inc. All rights reserved. 5 * 6 * This file is released under the LGPL. 7 */ 8 9 #ifndef _LINUX_DM_IOCTL_V4_H 10 #define _LINUX_DM_IOCTL_V4_H 11 12 #include <linux/types.h> 13 14 #define DM_DIR "mapper" /* Slashes not supported */ 15 #define DM_CONTROL_NODE "control" 16 #define DM_MAX_TYPE_NAME 16 17 #define DM_NAME_LEN 128 18 #define DM_UUID_LEN 129 19 20 /* 21 * A traditional ioctl interface for the device mapper. 22 * 23 * Each device can have two tables associated with it, an 24 * 'active' table which is the one currently used by io passing 25 * through the device, and an 'inactive' one which is a table 26 * that is being prepared as a replacement for the 'active' one. 27 * 28 * DM_VERSION: 29 * Just get the version information for the ioctl interface. 30 * 31 * DM_REMOVE_ALL: 32 * Remove all dm devices, destroy all tables. Only really used 33 * for debug. 34 * 35 * DM_LIST_DEVICES: 36 * Get a list of all the dm device names. 37 * 38 * DM_DEV_CREATE: 39 * Create a new device, neither the 'active' or 'inactive' table 40 * slots will be filled. The device will be in suspended state 41 * after creation, however any io to the device will get errored 42 * since it will be out-of-bounds. 43 * 44 * DM_DEV_REMOVE: 45 * Remove a device, destroy any tables. 46 * 47 * DM_DEV_RENAME: 48 * Rename a device or set its uuid if none was previously supplied. 49 * 50 * DM_SUSPEND: 51 * This performs both suspend and resume, depending which flag is 52 * passed in. 53 * Suspend: This command will not return until all pending io to 54 * the device has completed. Further io will be deferred until 55 * the device is resumed. 56 * Resume: It is no longer an error to issue this command on an 57 * unsuspended device. If a table is present in the 'inactive' 58 * slot, it will be moved to the active slot, then the old table 59 * from the active slot will be _destroyed_. Finally the device 60 * is resumed. 61 * 62 * DM_DEV_STATUS: 63 * Retrieves the status for the table in the 'active' slot. 64 * 65 * DM_DEV_WAIT: 66 * Wait for a significant event to occur to the device. This 67 * could either be caused by an event triggered by one of the 68 * targets of the table in the 'active' slot, or a table change. 69 * 70 * DM_TABLE_LOAD: 71 * Load a table into the 'inactive' slot for the device. The 72 * device does _not_ need to be suspended prior to this command. 73 * 74 * DM_TABLE_CLEAR: 75 * Destroy any table in the 'inactive' slot (ie. abort). 76 * 77 * DM_TABLE_DEPS: 78 * Return a set of device dependencies for the 'active' table. 79 * 80 * DM_TABLE_STATUS: 81 * Return the targets status for the 'active' table. 82 * 83 * DM_TARGET_MSG: 84 * Pass a message string to the target at a specific offset of a device. 85 * 86 * DM_DEV_SET_GEOMETRY: 87 * Set the geometry of a device by passing in a string in this format: 88 * 89 * "cylinders heads sectors_per_track start_sector" 90 * 91 * Beware that CHS geometry is nearly obsolete and only provided 92 * for compatibility with dm devices that can be booted by a PC 93 * BIOS. See struct hd_geometry for range limits. Also note that 94 * the geometry is erased if the device size changes. 95 */ 96 97 /* 98 * All ioctl arguments consist of a single chunk of memory, with 99 * this structure at the start. If a uuid is specified any 100 * lookup (eg. for a DM_INFO) will be done on that, *not* the 101 * name. 102 */ 103 struct dm_ioctl { 104 /* 105 * The version number is made up of three parts: 106 * major - no backward or forward compatibility, 107 * minor - only backwards compatible, 108 * patch - both backwards and forwards compatible. 109 * 110 * All clients of the ioctl interface should fill in the 111 * version number of the interface that they were 112 * compiled with. 113 * 114 * All recognised ioctl commands (ie. those that don't 115 * return -ENOTTY) fill out this field, even if the 116 * command failed. 117 */ 118 __u32 version[3]; /* in/out */ 119 __u32 data_size; /* total size of data passed in 120 * including this struct */ 121 122 __u32 data_start; /* offset to start of data 123 * relative to start of this struct */ 124 125 __u32 target_count; /* in/out */ 126 __s32 open_count; /* out */ 127 __u32 flags; /* in/out */ 128 129 /* 130 * event_nr holds either the event number (input and output) or the 131 * udev cookie value (input only). 132 * The DM_DEV_WAIT ioctl takes an event number as input. 133 * The DM_SUSPEND, DM_DEV_REMOVE and DM_DEV_RENAME ioctls 134 * use the field as a cookie to return in the DM_COOKIE 135 * variable with the uevents they issue. 136 * For output, the ioctls return the event number, not the cookie. 137 */ 138 __u32 event_nr; /* in/out */ 139 __u32 padding; 140 141 __u64 dev; /* in/out */ 142 143 char name[DM_NAME_LEN]; /* device name */ 144 char uuid[DM_UUID_LEN]; /* unique identifier for 145 * the block device */ 146 char data[7]; /* padding or data */ 147 }; 148 149 /* 150 * Used to specify tables. These structures appear after the 151 * dm_ioctl. 152 */ 153 struct dm_target_spec { 154 __u64 sector_start; 155 __u64 length; 156 __s32 status; /* used when reading from kernel only */ 157 158 /* 159 * Location of the next dm_target_spec. 160 * - When specifying targets on a DM_TABLE_LOAD command, this value is 161 * the number of bytes from the start of the "current" dm_target_spec 162 * to the start of the "next" dm_target_spec. 163 * - When retrieving targets on a DM_TABLE_STATUS command, this value 164 * is the number of bytes from the start of the first dm_target_spec 165 * (that follows the dm_ioctl struct) to the start of the "next" 166 * dm_target_spec. 167 */ 168 __u32 next; 169 170 char target_type[DM_MAX_TYPE_NAME]; 171 172 /* 173 * Parameter string starts immediately after this object. 174 * Be careful to add padding after string to ensure correct 175 * alignment of subsequent dm_target_spec. 176 */ 177 }; 178 179 /* 180 * Used to retrieve the target dependencies. 181 */ 182 struct dm_target_deps { 183 __u32 count; /* Array size */ 184 __u32 padding; /* unused */ 185 __u64 dev[0]; /* out */ 186 }; 187 188 /* 189 * Used to get a list of all dm devices. 190 */ 191 struct dm_name_list { 192 __u64 dev; 193 __u32 next; /* offset to the next record from 194 the _start_ of this */ 195 char name[0]; 196 197 /* 198 * The following members can be accessed by taking a pointer that 199 * points immediately after the terminating zero character in "name" 200 * and aligning this pointer to next 8-byte boundary. 201 * Uuid is present if the flag DM_NAME_LIST_FLAG_HAS_UUID is set. 202 * 203 * __u32 event_nr; 204 * __u32 flags; 205 * char uuid[0]; 206 */ 207 }; 208 209 #define DM_NAME_LIST_FLAG_HAS_UUID 1 210 #define DM_NAME_LIST_FLAG_DOESNT_HAVE_UUID 2 211 212 /* 213 * Used to retrieve the target versions 214 */ 215 struct dm_target_versions { 216 __u32 next; 217 __u32 version[3]; 218 219 char name[0]; 220 }; 221 222 /* 223 * Used to pass message to a target 224 */ 225 struct dm_target_msg { 226 __u64 sector; /* Device sector */ 227 228 char message[0]; 229 }; 230 231 /* 232 * If you change this make sure you make the corresponding change 233 * to dm-ioctl.c:lookup_ioctl() 234 */ 235 enum { 236 /* Top level cmds */ 237 DM_VERSION_CMD = 0, 238 DM_REMOVE_ALL_CMD, 239 DM_LIST_DEVICES_CMD, 240 241 /* device level cmds */ 242 DM_DEV_CREATE_CMD, 243 DM_DEV_REMOVE_CMD, 244 DM_DEV_RENAME_CMD, 245 DM_DEV_SUSPEND_CMD, 246 DM_DEV_STATUS_CMD, 247 DM_DEV_WAIT_CMD, 248 249 /* Table level cmds */ 250 DM_TABLE_LOAD_CMD, 251 DM_TABLE_CLEAR_CMD, 252 DM_TABLE_DEPS_CMD, 253 DM_TABLE_STATUS_CMD, 254 255 /* Added later */ 256 DM_LIST_VERSIONS_CMD, 257 DM_TARGET_MSG_CMD, 258 DM_DEV_SET_GEOMETRY_CMD, 259 DM_DEV_ARM_POLL_CMD, 260 DM_GET_TARGET_VERSION_CMD, 261 }; 262 263 #define DM_IOCTL 0xfd 264 265 #define DM_VERSION _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl) 266 #define DM_REMOVE_ALL _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl) 267 #define DM_LIST_DEVICES _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl) 268 269 #define DM_DEV_CREATE _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl) 270 #define DM_DEV_REMOVE _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl) 271 #define DM_DEV_RENAME _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl) 272 #define DM_DEV_SUSPEND _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl) 273 #define DM_DEV_STATUS _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl) 274 #define DM_DEV_WAIT _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl) 275 #define DM_DEV_ARM_POLL _IOWR(DM_IOCTL, DM_DEV_ARM_POLL_CMD, struct dm_ioctl) 276 277 #define DM_TABLE_LOAD _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl) 278 #define DM_TABLE_CLEAR _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl) 279 #define DM_TABLE_DEPS _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl) 280 #define DM_TABLE_STATUS _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl) 281 282 #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl) 283 #define DM_GET_TARGET_VERSION _IOWR(DM_IOCTL, DM_GET_TARGET_VERSION_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 27 290 #define DM_VERSION_PATCHLEVEL 0 291 #define DM_VERSION_EXTRA "-ioctl (2021-03-22)" 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 * Also disables flushing uncommitted changes in the thin target before 330 * generating statistics for DM_TABLE_STATUS and DM_DEV_WAIT. 331 */ 332 #define DM_NOFLUSH_FLAG (1 << 11) /* In */ 333 334 /* 335 * If set, any table information returned will relate to the inactive 336 * table instead of the live one. Always check DM_INACTIVE_PRESENT_FLAG 337 * is set before using the data returned. 338 */ 339 #define DM_QUERY_INACTIVE_TABLE_FLAG (1 << 12) /* In */ 340 341 /* 342 * If set, a uevent was generated for which the caller may need to wait. 343 */ 344 #define DM_UEVENT_GENERATED_FLAG (1 << 13) /* Out */ 345 346 /* 347 * If set, rename changes the uuid not the name. Only permitted 348 * if no uuid was previously supplied: an existing uuid cannot be changed. 349 */ 350 #define DM_UUID_FLAG (1 << 14) /* In */ 351 352 /* 353 * If set, all buffers are wiped after use. Use when sending 354 * or requesting sensitive data such as an encryption key. 355 */ 356 #define DM_SECURE_DATA_FLAG (1 << 15) /* In */ 357 358 /* 359 * If set, a message generated output data. 360 */ 361 #define DM_DATA_OUT_FLAG (1 << 16) /* Out */ 362 363 /* 364 * If set with DM_DEV_REMOVE or DM_REMOVE_ALL this indicates that if 365 * the device cannot be removed immediately because it is still in use 366 * it should instead be scheduled for removal when it gets closed. 367 * 368 * On return from DM_DEV_REMOVE, DM_DEV_STATUS or other ioctls, this 369 * flag indicates that the device is scheduled to be removed when it 370 * gets closed. 371 */ 372 #define DM_DEFERRED_REMOVE (1 << 17) /* In/Out */ 373 374 /* 375 * If set, the device is suspended internally. 376 */ 377 #define DM_INTERNAL_SUSPEND_FLAG (1 << 18) /* Out */ 378 379 /* 380 * If set, returns in the in buffer passed by UM, the raw table information 381 * that would be measured by IMA subsystem on device state change. 382 */ 383 #define DM_IMA_MEASUREMENT_FLAG (1 << 19) /* In */ 384 385 #endif /* _LINUX_DM_IOCTL_H */ 386