%PDF- %PDF-
Direktori : /var/lib/dkms/blksnap/6.3.0.73/source/ |
Current File : //var/lib/dkms/blksnap/6.3.0.73/source/blk_snap.h |
/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __LINUX_BLK_SNAP_H #define __LINUX_BLK_SNAP_H #include <linux/types.h> #include <linux/uuid.h> #define BLK_SNAP_MODULE_NAME "veeamblksnap" #define BLK_SNAP_IMAGE_NAME "veeamblksnapimg" #define BLK_SNAP 'V' #ifdef BLK_SNAP_MODIFICATION #define IOCTL_MOD 32 #endif enum blk_snap_ioctl { /* * Service controls */ blk_snap_ioctl_version, /* * Contols for tracking */ blk_snap_ioctl_tracker_remove, blk_snap_ioctl_tracker_collect, blk_snap_ioctl_tracker_read_cbt_map, blk_snap_ioctl_tracker_mark_dirty_blocks, /* * Snapshot contols */ blk_snap_ioctl_snapshot_create, blk_snap_ioctl_snapshot_destroy, blk_snap_ioctl_snapshot_append_storage, blk_snap_ioctl_snapshot_take, blk_snap_ioctl_snapshot_collect, blk_snap_ioctl_snapshot_collect_images, blk_snap_ioctl_snapshot_wait_event, blk_snap_ioctl_end, #ifdef BLK_SNAP_MODIFICATION /* * Additional controls for any standalone modification */ blk_snap_ioctl_mod = IOCTL_MOD, blk_snap_ioctl_setlog, blk_snap_ioctl_get_sector_state, blk_snap_ioctl_end_mod #endif }; /** * struct blk_snap_version - Result for the &IOCTL_BLK_SNAP_VERSION control. * @major: * Version major part. * @minor: * Version minor part. * @revision: * Revision number. * @build: * Build number. Should be zero. */ struct blk_snap_version { __u16 major; __u16 minor; __u16 revision; __u16 build; }; /** * IOCTL_BLK_SNAP_VERSION - Get version and compatibility flags. * * Linking the product behavior to the version code does not seem to be a very * good idea. Version is only for logs. */ #define IOCTL_BLK_SNAP_VERSION \ _IOW(BLK_SNAP, blk_snap_ioctl_version, struct blk_snap_version) #ifdef BLK_SNAP_MODIFICATION enum blk_snap_compat_flags { blk_snap_compat_flag_debug_sector_state, blk_snap_compat_flag_setlog, /* * Reserved for new features */ blk_snap_compat_flags_end }; static_assert(blk_snap_compat_flags_end <= 64, "There are too many compatibility flags."); #define BLK_SNAP_MOD_NAME_LIMIT 32 /** * struct blk_snap_modification - Result for &IOCTL_BLK_SNAP_VERSION control. * * @compatibility_flags: * [TBD] Reserved for new modification specific features. * @name: * Name of modification of the module (fork name, for example). * It's should be empty string for upstream module. */ struct blk_snap_mod { __u64 compatibility_flags; __u8 name[BLK_SNAP_MOD_NAME_LIMIT]; }; /** * IOCTL_BLK_SNAP_MOD - Get modification name and compatibility flags. * * Linking the product behavior to the version code does not seem to me a very * good idea. However, such an ioctl is good for checking that the module has * loaded and is responding to requests. * * The compatibility flags allows to safely extend the functionality of the * module. When the blk_snap kernel module receives new ioctl it will be * enough to add a bit. * * The name of the modification can be used by the authors of forks and branches * of the original module. The module in upstream have not any modifications. */ #define IOCTL_BLK_SNAP_MOD \ _IOW(BLK_SNAP, blk_snap_ioctl_mod, struct blk_snap_mod) #endif /* * The main functionality of the module is change block tracking (CBT). * Next, a number of ioctls will describe the interface for the CBT mechanism. */ /** * struct blk_snap_dev_t - Block device ID. * @mj: * Device ID major part. * @mn: * Device ID minor part. * * In user space and in kernel space, block devices are encoded differently. * We need to enter our own type to guarantee the correct transmission of the * major and minor parts. */ struct blk_snap_dev_t { __u32 mj; __u32 mn; }; /** * struct blk_snap_tracker_remove - Input argument for the * &IOCTL_BLK_SNAP_TRACKER_REMOVE control. * @dev_id: * Device ID. */ struct blk_snap_tracker_remove { struct blk_snap_dev_t dev_id; }; /** * IOCTL_BLK_SNAP_TRACKER_REMOVE - Remove a device from tracking. * * Removes the device from tracking changes. * Adding a device for tracking is performed when creating a snapshot * that includes this device. */ #define IOCTL_BLK_SNAP_TRACKER_REMOVE \ _IOW(BLK_SNAP, blk_snap_ioctl_tracker_remove, \ struct blk_snap_tracker_remove) /** * struct blk_snap_cbt_info - Information about change tracking for a block * device. * @dev_id: * Device ID. * @blk_size: * Block size in bytes. * @device_capacity: * Device capacity in bytes. * @blk_count: * Number of blocks. * @generation_id: * Unique identification number of change tracking generation. * @snap_number: * Current changes number. */ struct blk_snap_cbt_info { struct blk_snap_dev_t dev_id; __u32 blk_size; __u64 device_capacity; __u32 blk_count; uuid_t generation_id; __u8 snap_number; }; /** * struct blk_snap_tracker_collect - Argument for the * &IOCTL_BLK_SNAP_TRACKER_COLLECT control. * @count: * Size of @cbt_info_array in the number of &struct blk_snap_cbt_info. * If @cbt_info_array has not enough space, it will contain the required * size of the array. * @cbt_info_array: * Pointer to the array for output. */ struct blk_snap_tracker_collect { __u32 count; struct blk_snap_cbt_info *cbt_info_array; }; /** * IOCTL_BLK_SNAP_TRACKER_COLLECT - Collect all tracked devices. * * Getting information about all devices under tracking. * This ioctl returns the same information that the module outputs * to sysfs for each device under tracking. */ #define IOCTL_BLK_SNAP_TRACKER_COLLECT \ _IOW(BLK_SNAP, blk_snap_ioctl_tracker_collect, \ struct blk_snap_tracker_collect) /** * struct blk_snap_tracker_read_cbt_bitmap - Argument for the * &IOCTL_BLK_SNAP_TRACKER_READ_CBT_MAP control. * @dev_id: * Device ID. * @offset: * Offset from the beginning of the CBT bitmap in bytes. * @length: * Size of @buff in bytes. * @buff: * Pointer to the buffer for output. */ struct blk_snap_tracker_read_cbt_bitmap { struct blk_snap_dev_t dev_id; __u32 offset; __u32 length; __u8 *buff; }; /** * IOCTL_BLK_SNAP_TRACKER_READ_CBT_MAP - Read the CBT map. * * This ioctl allows to read the table of changes. Sysfs also has a file that * allows to read this table. */ #define IOCTL_BLK_SNAP_TRACKER_READ_CBT_MAP \ _IOR(BLK_SNAP, blk_snap_ioctl_tracker_read_cbt_map, \ struct blk_snap_tracker_read_cbt_bitmap) /** * struct blk_snap_block_range - Element of array for * &struct blk_snap_tracker_mark_dirty_blocks. * @sector_offset: * Offset from the beginning of the disk in sectors. * @sector_count: * Number of sectors. */ struct blk_snap_block_range { __u64 sector_offset; __u64 sector_count; }; /** * struct blk_snap_tracker_mark_dirty_blocks - Argument for the * &IOCTL_BLK_SNAP_TRACKER_MARK_DIRTY_BLOCKS control. * @dev_id: * Device ID. * @count: * Size of @dirty_blocks_array in the number of * &struct blk_snap_block_range. * @dirty_blocks_array: * Pointer to the array of &struct blk_snap_block_range. */ struct blk_snap_tracker_mark_dirty_blocks { struct blk_snap_dev_t dev_id; __u32 count; struct blk_snap_block_range *dirty_blocks_array; }; /** * IOCTL_BLK_SNAP_TRACKER_MARK_DIRTY_BLOCKS - Set dirty blocks in the CBT map. * * There are cases when some blocks need to be marked as changed. * This ioctl allows to do this. */ #define IOCTL_BLK_SNAP_TRACKER_MARK_DIRTY_BLOCKS \ _IOR(BLK_SNAP, blk_snap_ioctl_tracker_mark_dirty_blocks, \ struct blk_snap_tracker_mark_dirty_blocks) /* * Next, there will be a description of the interface for working with * snapshots. */ /** * struct blk_snap_snapshot_create - Argument for the * &IOCTL_BLK_SNAP_SNAPSHOT_CREATE control. * @count: * Size of @dev_id_array in the number of &struct blk_snap_dev_t. * @dev_id_array: * Pointer to the array of &struct blk_snap_dev_t. * @id: * Return ID of the created snapshot. */ struct blk_snap_snapshot_create { __u32 count; struct blk_snap_dev_t *dev_id_array; uuid_t id; }; /** * This ioctl creates a snapshot structure in the memory and allocates an * identifier for it. Further interaction with the snapshot is possible by * this identifier. * Several snapshots can be created at the same time, but with the condition * that one block device can only be included in one snapshot. */ #define IOCTL_BLK_SNAP_SNAPSHOT_CREATE \ _IOW(BLK_SNAP, blk_snap_ioctl_snapshot_create, \ struct blk_snap_snapshot_create) /** * struct blk_snap_snapshot_destroy - Argument for the * &IOCTL_BLK_SNAP_SNAPSHOT_DESTROY control. * @id: * Snapshot ID. */ struct blk_snap_snapshot_destroy { uuid_t id; }; /** * IOCTL_BLK_SNAP_SNAPSHOT_DESTROY - Release and destroy the snapshot. * * Destroys all snapshot structures and releases all its allocated resources. */ #define IOCTL_BLK_SNAP_SNAPSHOT_DESTROY \ _IOR(BLK_SNAP, blk_snap_ioctl_snapshot_destroy, \ struct blk_snap_snapshot_destroy) /** * struct blk_snap_snapshot_append_storage - Argument for the * &IOCTL_BLK_SNAP_SNAPSHOT_APPEND_STORAGE control. * @id: * Snapshot ID. * @dev_id: * Device ID. * @count: * Size of @ranges in the number of &struct blk_snap_block_range. * @ranges: * Pointer to the array of &struct blk_snap_block_range. */ struct blk_snap_snapshot_append_storage { uuid_t id; struct blk_snap_dev_t dev_id; __u32 count; struct blk_snap_block_range *ranges; }; /** * IOCTL_BLK_SNAP_SNAPSHOT_APPEND_STORAGE - Append storage to the difference * storage of the snapshot. * * The snapshot difference storage can be set either before or after creating * the snapshot images. This allows to dynamically expand the difference * storage while holding the snapshot. */ #define IOCTL_BLK_SNAP_SNAPSHOT_APPEND_STORAGE \ _IOW(BLK_SNAP, blk_snap_ioctl_snapshot_append_storage, \ struct blk_snap_snapshot_append_storage) /** * struct blk_snap_snapshot_take - Argument for the * &IOCTL_BLK_SNAP_SNAPSHOT_TAKE control. * @id: * Snapshot ID. */ struct blk_snap_snapshot_take { uuid_t id; }; /** * IOCTL_BLK_SNAP_SNAPSHOT_TAKE - Take snapshot. * * This ioctl creates snapshot images of block devices and switches CBT tables. * The snapshot must be created before this call, and the areas of block * devices should be added to the difference storage. */ #define IOCTL_BLK_SNAP_SNAPSHOT_TAKE \ _IOR(BLK_SNAP, blk_snap_ioctl_snapshot_take, \ struct blk_snap_snapshot_take) /** * struct blk_snap_snapshot_collect - Argument for the * &IOCTL_BLK_SNAP_SNAPSHOT_COLLECT control. * @count: * Size of @ids in the number of &uuid_t. * If @ids has not enough space, it will contain the required * size of the array. * @ids: * Pointer to the array with the snapshot ID for output. If the pointer is * zero, the ioctl returns the number of active snapshots in &count. * */ struct blk_snap_snapshot_collect { __u32 count; uuid_t *ids; }; /** * IOCTL_BLK_SNAP_SNAPSHOT_COLLECT - Get collection of created snapshots. * * This information can also be obtained from files from sysfs. */ #define IOCTL_BLK_SNAP_SNAPSHOT_COLLECT \ _IOW(BLK_SNAP, blk_snap_ioctl_snapshot_collect, \ struct blk_snap_snapshot_collect) /** * struct blk_snap_image_info - Associates the original device in the snapshot * and the corresponding snapshot image. * @orig_dev_id: * Device ID. * @image_dev_id: * Image ID. */ struct blk_snap_image_info { struct blk_snap_dev_t orig_dev_id; struct blk_snap_dev_t image_dev_id; }; /** * struct blk_snap_snapshot_collect_images - Argument for the * &IOCTL_BLK_SNAP_SNAPSHOT_COLLECT_IMAGES control. * @id: * Snapshot ID. * @count: * Size of @image_info_array in the number of &struct blk_snap_image_info. * If @image_info_array has not enough space, it will contain the required * size of the array. * @image_info_array: * Pointer to the array for output. */ struct blk_snap_snapshot_collect_images { uuid_t id; __u32 count; struct blk_snap_image_info *image_info_array; }; /** * IOCTL_BLK_SNAP_SNAPSHOT_COLLECT_IMAGES - Get a collection of devices and * their snapshot images. * * While holding the snapshot, this ioctl allows you to get a table of * correspondences of the original devices and their snapshot images. * This information can also be obtained from files from sysfs. */ #define IOCTL_BLK_SNAP_SNAPSHOT_COLLECT_IMAGES \ _IOW(BLK_SNAP, blk_snap_ioctl_snapshot_collect_images, \ struct blk_snap_snapshot_collect_images) enum blk_snap_event_codes { /** * Low free space in difference storage event. * * If the free space in the difference storage is reduced to the * specified limit, the module generates this event. */ blk_snap_event_code_low_free_space, /** * Snapshot image is corrupted event. * * If a chunk could not be allocated when trying to save data to the * difference storage, this event is generated. * However, this does not mean that the backup process was interrupted * with an error. If the snapshot image has been read to the end by * this time, the backup process is considered successful. */ blk_snap_event_code_corrupted, }; /** * struct blk_snap_snapshot_event - Argument for the * &IOCTL_BLK_SNAP_SNAPSHOT_WAIT_EVENT control. * @id: * Snapshot ID. * @timeout_ms: * Timeout for waiting in milliseconds. * @time_label: * Timestamp of the received event. * @code: * Code of the received event. * @data: * The received event body. */ struct blk_snap_snapshot_event { uuid_t id; __u32 timeout_ms; __u32 code; __s64 time_label; __u8 data[4096 - 32]; }; static_assert( sizeof(struct blk_snap_snapshot_event) == 4096, "The size struct blk_snap_snapshot_event should be equal to the size of the page."); /** * IOCTL_BLK_SNAP_SNAPSHOT_WAIT_EVENT - Wait and get the event from the * snapshot. * * While holding the snapshot, the kernel module can transmit information about * changes in its state in the form of events to the user level. * It is very important to receive these events as quickly as possible, so the * user's thread is in the state of interruptable sleep. */ #define IOCTL_BLK_SNAP_SNAPSHOT_WAIT_EVENT \ _IOW(BLK_SNAP, blk_snap_ioctl_snapshot_wait_event, \ struct blk_snap_snapshot_event) /** * struct blk_snap_event_low_free_space - Data for the * &blk_snap_event_code_low_free_space event. * @requested_nr_sect: * The required number of sectors. */ struct blk_snap_event_low_free_space { __u64 requested_nr_sect; }; /** * struct blk_snap_event_corrupted - Data for the * &blk_snap_event_code_corrupted event. * @orig_dev_id: * Device ID. * @err_code: * Error code. */ struct blk_snap_event_corrupted { struct blk_snap_dev_t orig_dev_id; __s32 err_code; }; #ifdef BLK_SNAP_MODIFICATION /** * @tz_minuteswest: * Time zone offset in minutes. * The system time is in UTC. In order for the module to write local time * to the log, its offset should be specified. * @level: * 0 - disable logging to file * 3 - only error messages * 4 - log warnings * 6 - log info messages * 7 - log debug messages * @filepath_size: * Count of bytes in &filepath. * @filename: * Full path for log file. */ struct blk_snap_setlog { __s32 tz_minuteswest; __u32 level; __u32 filepath_size; __u8 *filepath; }; /** * */ #define IOCTL_BLK_SNAP_SETLOG \ _IOW(BLK_SNAP, blk_snap_ioctl_setlog, struct blk_snap_setlog) /** * */ struct blk_snap_sector_state { __u8 snap_number_prev; __u8 snap_number_curr; __u32 chunk_state; }; struct blk_snap_get_sector_state { struct blk_snap_dev_t image_dev_id; __u64 sector; struct blk_snap_sector_state state; }; /** * */ #define IOCTL_BLK_SNAP_GET_SECTOR_STATE \ _IOW(BLK_SNAP, blk_snap_ioctl_get_sector_state, \ struct blk_snap_get_sector_state) #endif /* BLK_SNAP_MODIFICATION */ #endif /* __LINUX_BLK_SNAP_H */