Home | History | Annotate | Line # | Download | only in misc
dm-ioctl.h revision 1.1.1.2
      1      1.1  haad /*	$NetBSD: dm-ioctl.h,v 1.1.1.2 2009/12/02 00:26:09 haad Exp $	*/
      2      1.1  haad 
      3      1.1  haad /*
      4      1.1  haad  * Copyright (C) 2001 - 2003 Sistina Software (UK) Limited.
      5  1.1.1.2  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.1.1.2  haad 
    131  1.1.1.2  haad 	/*
    132  1.1.1.2  haad 	 * event_nr holds either the event number (input and output) or the
    133  1.1.1.2  haad 	 * udev cookie value (input only).
    134  1.1.1.2  haad 	 * The DM_DEV_WAIT ioctl takes an event number as input.
    135  1.1.1.2  haad 	 * The DM_SUSPEND, DM_DEV_REMOVE and DM_DEV_RENAME ioctls
    136  1.1.1.2  haad 	 * use the field as a cookie to return in the DM_COOKIE
    137  1.1.1.2  haad 	 * variable with the uevents they issue.
    138  1.1.1.2  haad 	 * For output, the ioctls return the event number, not the cookie.
    139  1.1.1.2  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.1  haad #define DM_VERSION_MAJOR	4
    273  1.1.1.2  haad #define DM_VERSION_MINOR	16
    274      1.1  haad #define DM_VERSION_PATCHLEVEL	0
    275  1.1.1.2  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.1.1.2  haad /*
    317  1.1.1.2  haad  * If set, any table information returned will relate to the inactive
    318  1.1.1.2  haad  * table instead of the live one.  Always check DM_INACTIVE_PRESENT_FLAG
    319  1.1.1.2  haad  * is set before using the data returned.
    320  1.1.1.2  haad  */
    321  1.1.1.2  haad #define DM_QUERY_INACTIVE_TABLE_FLAG	(1 << 12) /* In */
    322  1.1.1.2  haad 
    323      1.1  haad #endif				/* _LINUX_DM_IOCTL_H */
    324