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 /* 199 * Used to retrieve the target versions 200 */ 201 struct dm_target_versions { 202 __u32 next; 203 __u32 version[3]; 204 205 char name[0]; 206 }; 207 208 /* 209 * Used to pass message to a target 210 */ 211 struct dm_target_msg { 212 __u64 sector; /* Device sector */ 213 214 char message[0]; 215 }; 216 217 /* 218 * If you change this make sure you make the corresponding change 219 * to dm-ioctl.c:lookup_ioctl() 220 */ 221 enum { 222 /* Top level cmds */ 223 DM_VERSION_CMD = 0, 224 DM_REMOVE_ALL_CMD, 225 DM_LIST_DEVICES_CMD, 226 227 /* device level cmds */ 228 DM_DEV_CREATE_CMD, 229 DM_DEV_REMOVE_CMD, 230 DM_DEV_RENAME_CMD, 231 DM_DEV_SUSPEND_CMD, 232 DM_DEV_STATUS_CMD, 233 DM_DEV_WAIT_CMD, 234 235 /* Table level cmds */ 236 DM_TABLE_LOAD_CMD, 237 DM_TABLE_CLEAR_CMD, 238 DM_TABLE_DEPS_CMD, 239 DM_TABLE_STATUS_CMD, 240 241 /* Added later */ 242 DM_LIST_VERSIONS_CMD, 243 DM_TARGET_MSG_CMD, 244 DM_DEV_SET_GEOMETRY_CMD, 245 DM_DEV_ARM_POLL_CMD, 246 DM_GET_TARGET_VERSION_CMD, 247 }; 248 249 #define DM_IOCTL 0xfd 250 251 #define DM_VERSION _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl) 252 #define DM_REMOVE_ALL _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl) 253 #define DM_LIST_DEVICES _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl) 254 255 #define DM_DEV_CREATE _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl) 256 #define DM_DEV_REMOVE _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl) 257 #define DM_DEV_RENAME _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl) 258 #define DM_DEV_SUSPEND _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl) 259 #define DM_DEV_STATUS _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl) 260 #define DM_DEV_WAIT _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl) 261 #define DM_DEV_ARM_POLL _IOWR(DM_IOCTL, DM_DEV_ARM_POLL_CMD, struct dm_ioctl) 262 263 #define DM_TABLE_LOAD _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl) 264 #define DM_TABLE_CLEAR _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl) 265 #define DM_TABLE_DEPS _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl) 266 #define DM_TABLE_STATUS _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl) 267 268 #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl) 269 #define DM_GET_TARGET_VERSION _IOWR(DM_IOCTL, DM_GET_TARGET_VERSION_CMD, struct dm_ioctl) 270 271 #define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl) 272 #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) 273 274 #define DM_VERSION_MAJOR 4 275 #define DM_VERSION_MINOR 43 276 #define DM_VERSION_PATCHLEVEL 0 277 #define DM_VERSION_EXTRA "-ioctl (2020-10-01)" 278 279 /* Status bits */ 280 #define DM_READONLY_FLAG (1 << 0) /* In/Out */ 281 #define DM_SUSPEND_FLAG (1 << 1) /* In/Out */ 282 #define DM_PERSISTENT_DEV_FLAG (1 << 3) /* In */ 283 284 /* 285 * Flag passed into ioctl STATUS command to get table information 286 * rather than current status. 287 */ 288 #define DM_STATUS_TABLE_FLAG (1 << 4) /* In */ 289 290 /* 291 * Flags that indicate whether a table is present in either of 292 * the two table slots that a device has. 293 */ 294 #define DM_ACTIVE_PRESENT_FLAG (1 << 5) /* Out */ 295 #define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */ 296 297 /* 298 * Indicates that the buffer passed in wasn't big enough for the 299 * results. 300 */ 301 #define DM_BUFFER_FULL_FLAG (1 << 8) /* Out */ 302 303 /* 304 * This flag is now ignored. 305 */ 306 #define DM_SKIP_BDGET_FLAG (1 << 9) /* In */ 307 308 /* 309 * Set this to avoid attempting to freeze any filesystem when suspending. 310 */ 311 #define DM_SKIP_LOCKFS_FLAG (1 << 10) /* In */ 312 313 /* 314 * Set this to suspend without flushing queued ios. 315 * Also disables flushing uncommitted changes in the thin target before 316 * generating statistics for DM_TABLE_STATUS and DM_DEV_WAIT. 317 */ 318 #define DM_NOFLUSH_FLAG (1 << 11) /* In */ 319 320 /* 321 * If set, any table information returned will relate to the inactive 322 * table instead of the live one. Always check DM_INACTIVE_PRESENT_FLAG 323 * is set before using the data returned. 324 */ 325 #define DM_QUERY_INACTIVE_TABLE_FLAG (1 << 12) /* In */ 326 327 /* 328 * If set, a uevent was generated for which the caller may need to wait. 329 */ 330 #define DM_UEVENT_GENERATED_FLAG (1 << 13) /* Out */ 331 332 /* 333 * If set, rename changes the uuid not the name. Only permitted 334 * if no uuid was previously supplied: an existing uuid cannot be changed. 335 */ 336 #define DM_UUID_FLAG (1 << 14) /* In */ 337 338 /* 339 * If set, all buffers are wiped after use. Use when sending 340 * or requesting sensitive data such as an encryption key. 341 */ 342 #define DM_SECURE_DATA_FLAG (1 << 15) /* In */ 343 344 /* 345 * If set, a message generated output data. 346 */ 347 #define DM_DATA_OUT_FLAG (1 << 16) /* Out */ 348 349 /* 350 * If set with DM_DEV_REMOVE or DM_REMOVE_ALL this indicates that if 351 * the device cannot be removed immediately because it is still in use 352 * it should instead be scheduled for removal when it gets closed. 353 * 354 * On return from DM_DEV_REMOVE, DM_DEV_STATUS or other ioctls, this 355 * flag indicates that the device is scheduled to be removed when it 356 * gets closed. 357 */ 358 #define DM_DEFERRED_REMOVE (1 << 17) /* In/Out */ 359 360 /* 361 * If set, the device is suspended internally. 362 */ 363 #define DM_INTERNAL_SUSPEND_FLAG (1 << 18) /* Out */ 364 365 #endif /* _LINUX_DM_IOCTL_H */ 366