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 */ 101struct 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}; 135 136/* 137 * Used to specify tables. These structures appear after the 138 * dm_ioctl. 139 */ 140struct dm_target_spec { 141 uint64_t sector_start; 142 uint64_t length; 143 int32_t status; /* used when reading from kernel only */ 144 145 /* 146 * Location of the next dm_target_spec. 147 * - When specifying targets on a DM_TABLE_LOAD command, this value is 148 * the number of bytes from the start of the "current" dm_target_spec 149 * to the start of the "next" dm_target_spec. 150 * - When retrieving targets on a DM_TABLE_STATUS command, this value 151 * is the number of bytes from the start of the first dm_target_spec 152 * (that follows the dm_ioctl struct) to the start of the "next" 153 * dm_target_spec. 154 */ 155 uint32_t next; 156 157 char target_type[DM_MAX_TYPE_NAME]; 158 159 /* 160 * Parameter string starts immediately after this object. 161 * Be careful to add padding after string to ensure correct 162 * alignment of subsequent dm_target_spec. 163 */ 164}; 165 166/* 167 * Used to retrieve the target dependencies. 168 */ 169struct dm_target_deps { 170 uint32_t count; /* Array size */ 171 uint32_t padding; /* unused */ 172 uint64_t dev[0]; /* out */ 173}; 174 175/* 176 * Used to get a list of all dm devices. 177 */ 178struct dm_name_list { 179 uint64_t dev; 180 uint32_t next; /* offset to the next record from 181 the _start_ of this */ 182 char name[0]; 183}; 184 185/* 186 * Used to retrieve the target versions 187 */ 188struct dm_target_versions { 189 uint32_t next; 190 uint32_t version[3]; 191 192 char name[0]; 193}; 194 195/* 196 * Used to pass message to a target 197 */ 198struct dm_target_msg { 199 uint64_t sector; /* Device sector */ 200 201 char message[0]; 202}; 203 204/* 205 * If you change this make sure you make the corresponding change 206 * to dm-ioctl.c:lookup_ioctl() 207 */ 208enum { 209 /* Top level cmds */ 210 DM_VERSION_CMD = 0, 211 DM_REMOVE_ALL_CMD, 212 DM_LIST_DEVICES_CMD, 213 214 /* device level cmds */ 215 DM_DEV_CREATE_CMD, 216 DM_DEV_REMOVE_CMD, 217 DM_DEV_RENAME_CMD, 218 DM_DEV_SUSPEND_CMD, 219 DM_DEV_STATUS_CMD, 220 DM_DEV_WAIT_CMD, 221 222 /* Table level cmds */ 223 DM_TABLE_LOAD_CMD, 224 DM_TABLE_CLEAR_CMD, 225 DM_TABLE_DEPS_CMD, 226 DM_TABLE_STATUS_CMD, 227 228 /* Added later */ 229 DM_LIST_VERSIONS_CMD, 230 DM_TARGET_MSG_CMD, 231 DM_DEV_SET_GEOMETRY_CMD 232}; 233 234/* 235 * The dm_ioctl struct passed into the ioctl is just the header 236 * on a larger chunk of memory. On x86-64 and other 237 * architectures the dm-ioctl struct will be padded to an 8 byte 238 * boundary so the size will be different, which would change the 239 * ioctl code - yes I really messed up. This hack forces these 240 * architectures to have the correct ioctl code. 241 */ 242#ifdef CONFIG_COMPAT 243typedef char ioctl_struct[308]; 244#define DM_VERSION_32 _IOWR(DM_IOCTL, DM_VERSION_CMD, ioctl_struct) 245#define DM_REMOVE_ALL_32 _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, ioctl_struct) 246#define DM_LIST_DEVICES_32 _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, ioctl_struct) 247 248#define DM_DEV_CREATE_32 _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, ioctl_struct) 249#define DM_DEV_REMOVE_32 _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, ioctl_struct) 250#define DM_DEV_RENAME_32 _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, ioctl_struct) 251#define DM_DEV_SUSPEND_32 _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, ioctl_struct) 252#define DM_DEV_STATUS_32 _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, ioctl_struct) 253#define DM_DEV_WAIT_32 _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, ioctl_struct) 254 255#define DM_TABLE_LOAD_32 _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, ioctl_struct) 256#define DM_TABLE_CLEAR_32 _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, ioctl_struct) 257#define DM_TABLE_DEPS_32 _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, ioctl_struct) 258#define DM_TABLE_STATUS_32 _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, ioctl_struct) 259#define DM_LIST_VERSIONS_32 _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, ioctl_struct) 260#define DM_TARGET_MSG_32 _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, ioctl_struct) 261#define DM_DEV_SET_GEOMETRY_32 _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, ioctl_struct) 262#endif 263 264#define DM_IOCTL 0xfd 265 266#define DM_VERSION _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl) 267#define DM_REMOVE_ALL _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl) 268#define DM_LIST_DEVICES _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl) 269 270#define DM_DEV_CREATE _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl) 271#define DM_DEV_REMOVE _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl) 272#define DM_DEV_RENAME _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl) 273#define DM_DEV_SUSPEND _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl) 274#define DM_DEV_STATUS _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl) 275#define DM_DEV_WAIT _IOWR(DM_IOCTL, DM_DEV_WAIT_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 284#define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl) 285#define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) 286 287#define DM_VERSION_MAJOR 4 288#define DM_VERSION_MINOR 11 289#define DM_VERSION_PATCHLEVEL 0 290#define DM_VERSION_EXTRA "-ioctl (2006-10-12)" 291 292/* Status bits */ 293#define DM_READONLY_FLAG (1 << 0) /* In/Out */ 294#define DM_SUSPEND_FLAG (1 << 1) /* In/Out */ 295#define DM_PERSISTENT_DEV_FLAG (1 << 3) /* In */ 296 297/* 298 * Flag passed into ioctl STATUS command to get table information 299 * rather than current status. 300 */ 301#define DM_STATUS_TABLE_FLAG (1 << 4) /* In */ 302 303/* 304 * Flags that indicate whether a table is present in either of 305 * the two table slots that a device has. 306 */ 307#define DM_ACTIVE_PRESENT_FLAG (1 << 5) /* Out */ 308#define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */ 309 310/* 311 * Indicates that the buffer passed in wasn't big enough for the 312 * results. 313 */ 314#define DM_BUFFER_FULL_FLAG (1 << 8) /* Out */ 315 316/* 317 * This flag is now ignored. 318 */ 319#define DM_SKIP_BDGET_FLAG (1 << 9) /* In */ 320 321/* 322 * Set this to avoid attempting to freeze any filesystem when suspending. 323 */ 324#define DM_SKIP_LOCKFS_FLAG (1 << 10) /* In */ 325 326/* 327 * Set this to suspend without flushing queued ios. 328 */ 329#define DM_NOFLUSH_FLAG (1 << 11) /* In */ 330 331#endif /* _LINUX_DM_IOCTL_H */ 332