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