cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dm-ioctl.h (11602B)


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