include/linux/dm-ioctl.h
changeset 0 aa628870c1d3
equal deleted inserted replaced
-1:000000000000 0:aa628870c1d3
       
     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  */
       
   101 struct 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 	char data[7];		/* padding or data */
       
   135 };
       
   136 
       
   137 /*
       
   138  * Used to specify tables.  These structures appear after the
       
   139  * dm_ioctl.
       
   140  */
       
   141 struct dm_target_spec {
       
   142 	uint64_t sector_start;
       
   143 	uint64_t length;
       
   144 	int32_t status;		/* used when reading from kernel only */
       
   145 
       
   146 	/*
       
   147 	 * Location of the next dm_target_spec.
       
   148 	 * - When specifying targets on a DM_TABLE_LOAD command, this value is
       
   149 	 *   the number of bytes from the start of the "current" dm_target_spec
       
   150 	 *   to the start of the "next" dm_target_spec.
       
   151 	 * - When retrieving targets on a DM_TABLE_STATUS command, this value
       
   152 	 *   is the number of bytes from the start of the first dm_target_spec
       
   153 	 *   (that follows the dm_ioctl struct) to the start of the "next"
       
   154 	 *   dm_target_spec.
       
   155 	 */
       
   156 	uint32_t next;
       
   157 
       
   158 	char target_type[DM_MAX_TYPE_NAME];
       
   159 
       
   160 	/*
       
   161 	 * Parameter string starts immediately after this object.
       
   162 	 * Be careful to add padding after string to ensure correct
       
   163 	 * alignment of subsequent dm_target_spec.
       
   164 	 */
       
   165 };
       
   166 
       
   167 /*
       
   168  * Used to retrieve the target dependencies.
       
   169  */
       
   170 struct dm_target_deps {
       
   171 	uint32_t count;	/* Array size */
       
   172 	uint32_t padding;	/* unused */
       
   173 	uint64_t dev[0];	/* out */
       
   174 };
       
   175 
       
   176 /*
       
   177  * Used to get a list of all dm devices.
       
   178  */
       
   179 struct dm_name_list {
       
   180 	uint64_t dev;
       
   181 	uint32_t next;		/* offset to the next record from
       
   182 				   the _start_ of this */
       
   183 	char name[0];
       
   184 };
       
   185 
       
   186 /*
       
   187  * Used to retrieve the target versions
       
   188  */
       
   189 struct dm_target_versions {
       
   190         uint32_t next;
       
   191         uint32_t version[3];
       
   192 
       
   193         char name[0];
       
   194 };
       
   195 
       
   196 /*
       
   197  * Used to pass message to a target
       
   198  */
       
   199 struct dm_target_msg {
       
   200 	uint64_t sector;	/* Device sector */
       
   201 
       
   202 	char message[0];
       
   203 };
       
   204 
       
   205 /*
       
   206  * If you change this make sure you make the corresponding change
       
   207  * to dm-ioctl.c:lookup_ioctl()
       
   208  */
       
   209 enum {
       
   210 	/* Top level cmds */
       
   211 	DM_VERSION_CMD = 0,
       
   212 	DM_REMOVE_ALL_CMD,
       
   213 	DM_LIST_DEVICES_CMD,
       
   214 
       
   215 	/* device level cmds */
       
   216 	DM_DEV_CREATE_CMD,
       
   217 	DM_DEV_REMOVE_CMD,
       
   218 	DM_DEV_RENAME_CMD,
       
   219 	DM_DEV_SUSPEND_CMD,
       
   220 	DM_DEV_STATUS_CMD,
       
   221 	DM_DEV_WAIT_CMD,
       
   222 
       
   223 	/* Table level cmds */
       
   224 	DM_TABLE_LOAD_CMD,
       
   225 	DM_TABLE_CLEAR_CMD,
       
   226 	DM_TABLE_DEPS_CMD,
       
   227 	DM_TABLE_STATUS_CMD,
       
   228 
       
   229 	/* Added later */
       
   230 	DM_LIST_VERSIONS_CMD,
       
   231 	DM_TARGET_MSG_CMD,
       
   232 	DM_DEV_SET_GEOMETRY_CMD
       
   233 };
       
   234 
       
   235 #define DM_IOCTL 0xfd
       
   236 
       
   237 #define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
       
   238 #define DM_REMOVE_ALL    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl)
       
   239 #define DM_LIST_DEVICES  _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl)
       
   240 
       
   241 #define DM_DEV_CREATE    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl)
       
   242 #define DM_DEV_REMOVE    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl)
       
   243 #define DM_DEV_RENAME    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl)
       
   244 #define DM_DEV_SUSPEND   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl)
       
   245 #define DM_DEV_STATUS    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl)
       
   246 #define DM_DEV_WAIT      _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl)
       
   247 
       
   248 #define DM_TABLE_LOAD    _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl)
       
   249 #define DM_TABLE_CLEAR   _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl)
       
   250 #define DM_TABLE_DEPS    _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl)
       
   251 #define DM_TABLE_STATUS  _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl)
       
   252 
       
   253 #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl)
       
   254 
       
   255 #define DM_TARGET_MSG	 _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl)
       
   256 #define DM_DEV_SET_GEOMETRY	_IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
       
   257 
       
   258 #define DM_VERSION_MAJOR	4
       
   259 #define DM_VERSION_MINOR	14
       
   260 #define DM_VERSION_PATCHLEVEL	0
       
   261 #define DM_VERSION_EXTRA	"-ioctl (2008-04-23)"
       
   262 
       
   263 /* Status bits */
       
   264 #define DM_READONLY_FLAG	(1 << 0) /* In/Out */
       
   265 #define DM_SUSPEND_FLAG		(1 << 1) /* In/Out */
       
   266 #define DM_PERSISTENT_DEV_FLAG	(1 << 3) /* In */
       
   267 
       
   268 /*
       
   269  * Flag passed into ioctl STATUS command to get table information
       
   270  * rather than current status.
       
   271  */
       
   272 #define DM_STATUS_TABLE_FLAG	(1 << 4) /* In */
       
   273 
       
   274 /*
       
   275  * Flags that indicate whether a table is present in either of
       
   276  * the two table slots that a device has.
       
   277  */
       
   278 #define DM_ACTIVE_PRESENT_FLAG   (1 << 5) /* Out */
       
   279 #define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */
       
   280 
       
   281 /*
       
   282  * Indicates that the buffer passed in wasn't big enough for the
       
   283  * results.
       
   284  */
       
   285 #define DM_BUFFER_FULL_FLAG	(1 << 8) /* Out */
       
   286 
       
   287 /*
       
   288  * This flag is now ignored.
       
   289  */
       
   290 #define DM_SKIP_BDGET_FLAG	(1 << 9) /* In */
       
   291 
       
   292 /*
       
   293  * Set this to avoid attempting to freeze any filesystem when suspending.
       
   294  */
       
   295 #define DM_SKIP_LOCKFS_FLAG	(1 << 10) /* In */
       
   296 
       
   297 /*
       
   298  * Set this to suspend without flushing queued ios.
       
   299  */
       
   300 #define DM_NOFLUSH_FLAG		(1 << 11) /* In */
       
   301 
       
   302 #endif				/* _LINUX_DM_IOCTL_H */