%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/lib/dkms/blksnap/6.3.0.73/source/
Upload File :
Create Path :
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 */

Zerion Mini Shell 1.0