1*53ee8cc1Swenshuai.xi /* 2*53ee8cc1Swenshuai.xi * Copyright (C) 2001 - 2003 Sistina Software (UK) Limited. 3*53ee8cc1Swenshuai.xi * Copyright (C) 2004 - 2005 Red Hat, Inc. All rights reserved. 4*53ee8cc1Swenshuai.xi * 5*53ee8cc1Swenshuai.xi * This file is released under the LGPL. 6*53ee8cc1Swenshuai.xi */ 7*53ee8cc1Swenshuai.xi 8*53ee8cc1Swenshuai.xi #ifndef _LINUX_DM_IOCTL_V4_H 9*53ee8cc1Swenshuai.xi #define _LINUX_DM_IOCTL_V4_H 10*53ee8cc1Swenshuai.xi 11*53ee8cc1Swenshuai.xi #include <linux/types.h> 12*53ee8cc1Swenshuai.xi 13*53ee8cc1Swenshuai.xi #define DM_DIR "mapper" /* Slashes not supported */ 14*53ee8cc1Swenshuai.xi #define DM_MAX_TYPE_NAME 16 15*53ee8cc1Swenshuai.xi #define DM_NAME_LEN 128 16*53ee8cc1Swenshuai.xi #define DM_UUID_LEN 129 17*53ee8cc1Swenshuai.xi 18*53ee8cc1Swenshuai.xi /* 19*53ee8cc1Swenshuai.xi * A traditional ioctl interface for the device mapper. 20*53ee8cc1Swenshuai.xi * 21*53ee8cc1Swenshuai.xi * Each device can have two tables associated with it, an 22*53ee8cc1Swenshuai.xi * 'active' table which is the one currently used by io passing 23*53ee8cc1Swenshuai.xi * through the device, and an 'inactive' one which is a table 24*53ee8cc1Swenshuai.xi * that is being prepared as a replacement for the 'active' one. 25*53ee8cc1Swenshuai.xi * 26*53ee8cc1Swenshuai.xi * DM_VERSION: 27*53ee8cc1Swenshuai.xi * Just get the version information for the ioctl interface. 28*53ee8cc1Swenshuai.xi * 29*53ee8cc1Swenshuai.xi * DM_REMOVE_ALL: 30*53ee8cc1Swenshuai.xi * Remove all dm devices, destroy all tables. Only really used 31*53ee8cc1Swenshuai.xi * for debug. 32*53ee8cc1Swenshuai.xi * 33*53ee8cc1Swenshuai.xi * DM_LIST_DEVICES: 34*53ee8cc1Swenshuai.xi * Get a list of all the dm device names. 35*53ee8cc1Swenshuai.xi * 36*53ee8cc1Swenshuai.xi * DM_DEV_CREATE: 37*53ee8cc1Swenshuai.xi * Create a new device, neither the 'active' or 'inactive' table 38*53ee8cc1Swenshuai.xi * slots will be filled. The device will be in suspended state 39*53ee8cc1Swenshuai.xi * after creation, however any io to the device will get errored 40*53ee8cc1Swenshuai.xi * since it will be out-of-bounds. 41*53ee8cc1Swenshuai.xi * 42*53ee8cc1Swenshuai.xi * DM_DEV_REMOVE: 43*53ee8cc1Swenshuai.xi * Remove a device, destroy any tables. 44*53ee8cc1Swenshuai.xi * 45*53ee8cc1Swenshuai.xi * DM_DEV_RENAME: 46*53ee8cc1Swenshuai.xi * Rename a device. 47*53ee8cc1Swenshuai.xi * 48*53ee8cc1Swenshuai.xi * DM_SUSPEND: 49*53ee8cc1Swenshuai.xi * This performs both suspend and resume, depending which flag is 50*53ee8cc1Swenshuai.xi * passed in. 51*53ee8cc1Swenshuai.xi * Suspend: This command will not return until all pending io to 52*53ee8cc1Swenshuai.xi * the device has completed. Further io will be deferred until 53*53ee8cc1Swenshuai.xi * the device is resumed. 54*53ee8cc1Swenshuai.xi * Resume: It is no longer an error to issue this command on an 55*53ee8cc1Swenshuai.xi * unsuspended device. If a table is present in the 'inactive' 56*53ee8cc1Swenshuai.xi * slot, it will be moved to the active slot, then the old table 57*53ee8cc1Swenshuai.xi * from the active slot will be _destroyed_. Finally the device 58*53ee8cc1Swenshuai.xi * is resumed. 59*53ee8cc1Swenshuai.xi * 60*53ee8cc1Swenshuai.xi * DM_DEV_STATUS: 61*53ee8cc1Swenshuai.xi * Retrieves the status for the table in the 'active' slot. 62*53ee8cc1Swenshuai.xi * 63*53ee8cc1Swenshuai.xi * DM_DEV_WAIT: 64*53ee8cc1Swenshuai.xi * Wait for a significant event to occur to the device. This 65*53ee8cc1Swenshuai.xi * could either be caused by an event triggered by one of the 66*53ee8cc1Swenshuai.xi * targets of the table in the 'active' slot, or a table change. 67*53ee8cc1Swenshuai.xi * 68*53ee8cc1Swenshuai.xi * DM_TABLE_LOAD: 69*53ee8cc1Swenshuai.xi * Load a table into the 'inactive' slot for the device. The 70*53ee8cc1Swenshuai.xi * device does _not_ need to be suspended prior to this command. 71*53ee8cc1Swenshuai.xi * 72*53ee8cc1Swenshuai.xi * DM_TABLE_CLEAR: 73*53ee8cc1Swenshuai.xi * Destroy any table in the 'inactive' slot (ie. abort). 74*53ee8cc1Swenshuai.xi * 75*53ee8cc1Swenshuai.xi * DM_TABLE_DEPS: 76*53ee8cc1Swenshuai.xi * Return a set of device dependencies for the 'active' table. 77*53ee8cc1Swenshuai.xi * 78*53ee8cc1Swenshuai.xi * DM_TABLE_STATUS: 79*53ee8cc1Swenshuai.xi * Return the targets status for the 'active' table. 80*53ee8cc1Swenshuai.xi * 81*53ee8cc1Swenshuai.xi * DM_TARGET_MSG: 82*53ee8cc1Swenshuai.xi * Pass a message string to the target at a specific offset of a device. 83*53ee8cc1Swenshuai.xi * 84*53ee8cc1Swenshuai.xi * DM_DEV_SET_GEOMETRY: 85*53ee8cc1Swenshuai.xi * Set the geometry of a device by passing in a string in this format: 86*53ee8cc1Swenshuai.xi * 87*53ee8cc1Swenshuai.xi * "cylinders heads sectors_per_track start_sector" 88*53ee8cc1Swenshuai.xi * 89*53ee8cc1Swenshuai.xi * Beware that CHS geometry is nearly obsolete and only provided 90*53ee8cc1Swenshuai.xi * for compatibility with dm devices that can be booted by a PC 91*53ee8cc1Swenshuai.xi * BIOS. See struct hd_geometry for range limits. Also note that 92*53ee8cc1Swenshuai.xi * the geometry is erased if the device size changes. 93*53ee8cc1Swenshuai.xi */ 94*53ee8cc1Swenshuai.xi 95*53ee8cc1Swenshuai.xi /* 96*53ee8cc1Swenshuai.xi * All ioctl arguments consist of a single chunk of memory, with 97*53ee8cc1Swenshuai.xi * this structure at the start. If a uuid is specified any 98*53ee8cc1Swenshuai.xi * lookup (eg. for a DM_INFO) will be done on that, *not* the 99*53ee8cc1Swenshuai.xi * name. 100*53ee8cc1Swenshuai.xi */ 101*53ee8cc1Swenshuai.xi struct dm_ioctl { 102*53ee8cc1Swenshuai.xi /* 103*53ee8cc1Swenshuai.xi * The version number is made up of three parts: 104*53ee8cc1Swenshuai.xi * major - no backward or forward compatibility, 105*53ee8cc1Swenshuai.xi * minor - only backwards compatible, 106*53ee8cc1Swenshuai.xi * patch - both backwards and forwards compatible. 107*53ee8cc1Swenshuai.xi * 108*53ee8cc1Swenshuai.xi * All clients of the ioctl interface should fill in the 109*53ee8cc1Swenshuai.xi * version number of the interface that they were 110*53ee8cc1Swenshuai.xi * compiled with. 111*53ee8cc1Swenshuai.xi * 112*53ee8cc1Swenshuai.xi * All recognised ioctl commands (ie. those that don't 113*53ee8cc1Swenshuai.xi * return -ENOTTY) fill out this field, even if the 114*53ee8cc1Swenshuai.xi * command failed. 115*53ee8cc1Swenshuai.xi */ 116*53ee8cc1Swenshuai.xi uint32_t version[3]; /* in/out */ 117*53ee8cc1Swenshuai.xi uint32_t data_size; /* total size of data passed in 118*53ee8cc1Swenshuai.xi * including this struct */ 119*53ee8cc1Swenshuai.xi 120*53ee8cc1Swenshuai.xi uint32_t data_start; /* offset to start of data 121*53ee8cc1Swenshuai.xi * relative to start of this struct */ 122*53ee8cc1Swenshuai.xi 123*53ee8cc1Swenshuai.xi uint32_t target_count; /* in/out */ 124*53ee8cc1Swenshuai.xi int32_t open_count; /* out */ 125*53ee8cc1Swenshuai.xi uint32_t flags; /* in/out */ 126*53ee8cc1Swenshuai.xi uint32_t event_nr; /* in/out */ 127*53ee8cc1Swenshuai.xi uint32_t padding; 128*53ee8cc1Swenshuai.xi 129*53ee8cc1Swenshuai.xi uint64_t dev; /* in/out */ 130*53ee8cc1Swenshuai.xi 131*53ee8cc1Swenshuai.xi char name[DM_NAME_LEN]; /* device name */ 132*53ee8cc1Swenshuai.xi char uuid[DM_UUID_LEN]; /* unique identifier for 133*53ee8cc1Swenshuai.xi * the block device */ 134*53ee8cc1Swenshuai.xi char data[7]; /* padding or data */ 135*53ee8cc1Swenshuai.xi }; 136*53ee8cc1Swenshuai.xi 137*53ee8cc1Swenshuai.xi /* 138*53ee8cc1Swenshuai.xi * Used to specify tables. These structures appear after the 139*53ee8cc1Swenshuai.xi * dm_ioctl. 140*53ee8cc1Swenshuai.xi */ 141*53ee8cc1Swenshuai.xi struct dm_target_spec { 142*53ee8cc1Swenshuai.xi uint64_t sector_start; 143*53ee8cc1Swenshuai.xi uint64_t length; 144*53ee8cc1Swenshuai.xi int32_t status; /* used when reading from kernel only */ 145*53ee8cc1Swenshuai.xi 146*53ee8cc1Swenshuai.xi /* 147*53ee8cc1Swenshuai.xi * Location of the next dm_target_spec. 148*53ee8cc1Swenshuai.xi * - When specifying targets on a DM_TABLE_LOAD command, this value is 149*53ee8cc1Swenshuai.xi * the number of bytes from the start of the "current" dm_target_spec 150*53ee8cc1Swenshuai.xi * to the start of the "next" dm_target_spec. 151*53ee8cc1Swenshuai.xi * - When retrieving targets on a DM_TABLE_STATUS command, this value 152*53ee8cc1Swenshuai.xi * is the number of bytes from the start of the first dm_target_spec 153*53ee8cc1Swenshuai.xi * (that follows the dm_ioctl struct) to the start of the "next" 154*53ee8cc1Swenshuai.xi * dm_target_spec. 155*53ee8cc1Swenshuai.xi */ 156*53ee8cc1Swenshuai.xi uint32_t next; 157*53ee8cc1Swenshuai.xi 158*53ee8cc1Swenshuai.xi char target_type[DM_MAX_TYPE_NAME]; 159*53ee8cc1Swenshuai.xi 160*53ee8cc1Swenshuai.xi /* 161*53ee8cc1Swenshuai.xi * Parameter string starts immediately after this object. 162*53ee8cc1Swenshuai.xi * Be careful to add padding after string to ensure correct 163*53ee8cc1Swenshuai.xi * alignment of subsequent dm_target_spec. 164*53ee8cc1Swenshuai.xi */ 165*53ee8cc1Swenshuai.xi }; 166*53ee8cc1Swenshuai.xi 167*53ee8cc1Swenshuai.xi /* 168*53ee8cc1Swenshuai.xi * Used to retrieve the target dependencies. 169*53ee8cc1Swenshuai.xi */ 170*53ee8cc1Swenshuai.xi struct dm_target_deps { 171*53ee8cc1Swenshuai.xi uint32_t count; /* Array size */ 172*53ee8cc1Swenshuai.xi uint32_t padding; /* unused */ 173*53ee8cc1Swenshuai.xi uint64_t dev[0]; /* out */ 174*53ee8cc1Swenshuai.xi }; 175*53ee8cc1Swenshuai.xi 176*53ee8cc1Swenshuai.xi /* 177*53ee8cc1Swenshuai.xi * Used to get a list of all dm devices. 178*53ee8cc1Swenshuai.xi */ 179*53ee8cc1Swenshuai.xi struct dm_name_list { 180*53ee8cc1Swenshuai.xi uint64_t dev; 181*53ee8cc1Swenshuai.xi uint32_t next; /* offset to the next record from 182*53ee8cc1Swenshuai.xi the _start_ of this */ 183*53ee8cc1Swenshuai.xi char name[0]; 184*53ee8cc1Swenshuai.xi }; 185*53ee8cc1Swenshuai.xi 186*53ee8cc1Swenshuai.xi /* 187*53ee8cc1Swenshuai.xi * Used to retrieve the target versions 188*53ee8cc1Swenshuai.xi */ 189*53ee8cc1Swenshuai.xi struct dm_target_versions { 190*53ee8cc1Swenshuai.xi uint32_t next; 191*53ee8cc1Swenshuai.xi uint32_t version[3]; 192*53ee8cc1Swenshuai.xi 193*53ee8cc1Swenshuai.xi char name[0]; 194*53ee8cc1Swenshuai.xi }; 195*53ee8cc1Swenshuai.xi 196*53ee8cc1Swenshuai.xi /* 197*53ee8cc1Swenshuai.xi * Used to pass message to a target 198*53ee8cc1Swenshuai.xi */ 199*53ee8cc1Swenshuai.xi struct dm_target_msg { 200*53ee8cc1Swenshuai.xi uint64_t sector; /* Device sector */ 201*53ee8cc1Swenshuai.xi 202*53ee8cc1Swenshuai.xi char message[0]; 203*53ee8cc1Swenshuai.xi }; 204*53ee8cc1Swenshuai.xi 205*53ee8cc1Swenshuai.xi /* 206*53ee8cc1Swenshuai.xi * If you change this make sure you make the corresponding change 207*53ee8cc1Swenshuai.xi * to dm-ioctl.c:lookup_ioctl() 208*53ee8cc1Swenshuai.xi */ 209*53ee8cc1Swenshuai.xi enum { 210*53ee8cc1Swenshuai.xi /* Top level cmds */ 211*53ee8cc1Swenshuai.xi DM_VERSION_CMD = 0, 212*53ee8cc1Swenshuai.xi DM_REMOVE_ALL_CMD, 213*53ee8cc1Swenshuai.xi DM_LIST_DEVICES_CMD, 214*53ee8cc1Swenshuai.xi 215*53ee8cc1Swenshuai.xi /* device level cmds */ 216*53ee8cc1Swenshuai.xi DM_DEV_CREATE_CMD, 217*53ee8cc1Swenshuai.xi DM_DEV_REMOVE_CMD, 218*53ee8cc1Swenshuai.xi DM_DEV_RENAME_CMD, 219*53ee8cc1Swenshuai.xi DM_DEV_SUSPEND_CMD, 220*53ee8cc1Swenshuai.xi DM_DEV_STATUS_CMD, 221*53ee8cc1Swenshuai.xi DM_DEV_WAIT_CMD, 222*53ee8cc1Swenshuai.xi 223*53ee8cc1Swenshuai.xi /* Table level cmds */ 224*53ee8cc1Swenshuai.xi DM_TABLE_LOAD_CMD, 225*53ee8cc1Swenshuai.xi DM_TABLE_CLEAR_CMD, 226*53ee8cc1Swenshuai.xi DM_TABLE_DEPS_CMD, 227*53ee8cc1Swenshuai.xi DM_TABLE_STATUS_CMD, 228*53ee8cc1Swenshuai.xi 229*53ee8cc1Swenshuai.xi /* Added later */ 230*53ee8cc1Swenshuai.xi DM_LIST_VERSIONS_CMD, 231*53ee8cc1Swenshuai.xi DM_TARGET_MSG_CMD, 232*53ee8cc1Swenshuai.xi DM_DEV_SET_GEOMETRY_CMD 233*53ee8cc1Swenshuai.xi }; 234*53ee8cc1Swenshuai.xi 235*53ee8cc1Swenshuai.xi #define DM_IOCTL 0xfd 236*53ee8cc1Swenshuai.xi 237*53ee8cc1Swenshuai.xi #define DM_VERSION _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl) 238*53ee8cc1Swenshuai.xi #define DM_REMOVE_ALL _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl) 239*53ee8cc1Swenshuai.xi #define DM_LIST_DEVICES _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl) 240*53ee8cc1Swenshuai.xi 241*53ee8cc1Swenshuai.xi #define DM_DEV_CREATE _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl) 242*53ee8cc1Swenshuai.xi #define DM_DEV_REMOVE _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl) 243*53ee8cc1Swenshuai.xi #define DM_DEV_RENAME _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl) 244*53ee8cc1Swenshuai.xi #define DM_DEV_SUSPEND _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl) 245*53ee8cc1Swenshuai.xi #define DM_DEV_STATUS _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl) 246*53ee8cc1Swenshuai.xi #define DM_DEV_WAIT _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl) 247*53ee8cc1Swenshuai.xi 248*53ee8cc1Swenshuai.xi #define DM_TABLE_LOAD _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl) 249*53ee8cc1Swenshuai.xi #define DM_TABLE_CLEAR _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl) 250*53ee8cc1Swenshuai.xi #define DM_TABLE_DEPS _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl) 251*53ee8cc1Swenshuai.xi #define DM_TABLE_STATUS _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl) 252*53ee8cc1Swenshuai.xi 253*53ee8cc1Swenshuai.xi #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl) 254*53ee8cc1Swenshuai.xi 255*53ee8cc1Swenshuai.xi #define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl) 256*53ee8cc1Swenshuai.xi #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) 257*53ee8cc1Swenshuai.xi 258*53ee8cc1Swenshuai.xi #define DM_VERSION_MAJOR 4 259*53ee8cc1Swenshuai.xi #define DM_VERSION_MINOR 13 260*53ee8cc1Swenshuai.xi #define DM_VERSION_PATCHLEVEL 0 261*53ee8cc1Swenshuai.xi #define DM_VERSION_EXTRA "-ioctl (2007-10-18)" 262*53ee8cc1Swenshuai.xi 263*53ee8cc1Swenshuai.xi /* Status bits */ 264*53ee8cc1Swenshuai.xi #define DM_READONLY_FLAG (1 << 0) /* In/Out */ 265*53ee8cc1Swenshuai.xi #define DM_SUSPEND_FLAG (1 << 1) /* In/Out */ 266*53ee8cc1Swenshuai.xi #define DM_PERSISTENT_DEV_FLAG (1 << 3) /* In */ 267*53ee8cc1Swenshuai.xi 268*53ee8cc1Swenshuai.xi /* 269*53ee8cc1Swenshuai.xi * Flag passed into ioctl STATUS command to get table information 270*53ee8cc1Swenshuai.xi * rather than current status. 271*53ee8cc1Swenshuai.xi */ 272*53ee8cc1Swenshuai.xi #define DM_STATUS_TABLE_FLAG (1 << 4) /* In */ 273*53ee8cc1Swenshuai.xi 274*53ee8cc1Swenshuai.xi /* 275*53ee8cc1Swenshuai.xi * Flags that indicate whether a table is present in either of 276*53ee8cc1Swenshuai.xi * the two table slots that a device has. 277*53ee8cc1Swenshuai.xi */ 278*53ee8cc1Swenshuai.xi #define DM_ACTIVE_PRESENT_FLAG (1 << 5) /* Out */ 279*53ee8cc1Swenshuai.xi #define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */ 280*53ee8cc1Swenshuai.xi 281*53ee8cc1Swenshuai.xi /* 282*53ee8cc1Swenshuai.xi * Indicates that the buffer passed in wasn't big enough for the 283*53ee8cc1Swenshuai.xi * results. 284*53ee8cc1Swenshuai.xi */ 285*53ee8cc1Swenshuai.xi #define DM_BUFFER_FULL_FLAG (1 << 8) /* Out */ 286*53ee8cc1Swenshuai.xi 287*53ee8cc1Swenshuai.xi /* 288*53ee8cc1Swenshuai.xi * This flag is now ignored. 289*53ee8cc1Swenshuai.xi */ 290*53ee8cc1Swenshuai.xi #define DM_SKIP_BDGET_FLAG (1 << 9) /* In */ 291*53ee8cc1Swenshuai.xi 292*53ee8cc1Swenshuai.xi /* 293*53ee8cc1Swenshuai.xi * Set this to avoid attempting to freeze any filesystem when suspending. 294*53ee8cc1Swenshuai.xi */ 295*53ee8cc1Swenshuai.xi #define DM_SKIP_LOCKFS_FLAG (1 << 10) /* In */ 296*53ee8cc1Swenshuai.xi 297*53ee8cc1Swenshuai.xi /* 298*53ee8cc1Swenshuai.xi * Set this to suspend without flushing queued ios. 299*53ee8cc1Swenshuai.xi */ 300*53ee8cc1Swenshuai.xi #define DM_NOFLUSH_FLAG (1 << 11) /* In */ 301*53ee8cc1Swenshuai.xi 302*53ee8cc1Swenshuai.xi #endif /* _LINUX_DM_IOCTL_H */ 303