linux-headers (unknown)

(root)/
include/
linux/
dm-ioctl.h
       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   */
     103  struct 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   */
     153  struct 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   */
     182  struct dm_target_deps {
     183  	__u32 count;	/* Array size */
     184  	__u32 padding;	/* unused */
     185  	__u64 dev[];	/* out */
     186  };
     187  
     188  /*
     189   * Used to get a list of all dm devices.
     190   */
     191  struct dm_name_list {
     192  	__u64 dev;
     193  	__u32 next;		/* offset to the next record from
     194  				   the _start_ of this */
     195  	char name[];
     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   */
     215  struct dm_target_versions {
     216          __u32 next;
     217          __u32 version[3];
     218  
     219          char name[];
     220  };
     221  
     222  /*
     223   * Used to pass message to a target
     224   */
     225  struct dm_target_msg {
     226  	__u64 sector;	/* Device sector */
     227  
     228  	char message[];
     229  };
     230  
     231  /*
     232   * If you change this make sure you make the corresponding change
     233   * to dm-ioctl.c:lookup_ioctl()
     234   */
     235  enum {
     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	48
     290  #define DM_VERSION_PATCHLEVEL	0
     291  #define DM_VERSION_EXTRA	"-ioctl (2023-03-01)"
     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 */