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