-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e53d902
commit ba76dde
Showing
12 changed files
with
6,516 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,209 @@ | ||
From e6e7a6261134ca91bd4768a70ecc7dd31c2388e1 Mon Sep 17 00:00:00 2001 | ||
From: Sergei Shtepa <[email protected]> | ||
Date: Thu, 16 Nov 2023 12:32:58 +0100 | ||
Subject: [PATCH v6 00/11] blksnap - block devices snapshots module | ||
|
||
Hi all. | ||
|
||
I am happy to offer a improved version of the Block Devices Snapshots | ||
Module. It allows to create non-persistent snapshots of any block devices. | ||
The main purpose of such snapshots is to provide backups of block devices. | ||
See more in Documentation/block/blksnap.rst. | ||
|
||
The Block Device Filtering Mechanism is added to the block layer. This | ||
allows to attach and detach block device filters to the block layer. | ||
Filters allow to extend the functionality of the block layer. | ||
See more in Documentation/block/blkfilter.rst. | ||
|
||
The tool, library and tests for working with blksnap can be found on github. | ||
Link: https://github.com/veeam/blksnap/tree/stable-v2.0 | ||
|
||
In the new version, the method of saving shapshot difference has been | ||
changed. Why this should have been done, Dave Chinner <[email protected]> | ||
described in detail in the comments to the previous version. | ||
Link: https://lore.kernel.org/lkml/[email protected]/T/#mfe9b8f46833011deea4b24714212230ac38db978 | ||
|
||
The module is incompatible with features hardware inline encryption and | ||
data integrity. | ||
Link: https://lore.kernel.org/lkml/[email protected]/T/#m3f13e580876bff1d283eb2a79d1ecdef3b98cc42 | ||
|
||
Based on LK v6.7-rc1. | ||
|
||
v6 changes: | ||
- The difference storage has been changed. | ||
In the previous version, the file was created only to reserve sector | ||
ranges on a block device. The data was stored directly to the block | ||
device in these sector ranges. Now saving and reading data is done using | ||
'VFS' using vfs_iter_write() and vfs_iter_read() functions. This allows | ||
not to depend on the filesystem and use, for example, tmpfs. Using an | ||
unnamed temporary file allows to hide it from other processes and | ||
automatically release it when the snapshot is closed. | ||
However, now the module does not allow to add a block device to the | ||
snapshot on which the difference stoarge is located. There is no way to | ||
ensure the immutability of file metadata when writing data to a file. | ||
This means that the metadata of the filesystem may change, which may | ||
cause damage to the snapshot. | ||
- _IOW and _IOR were mixed up - fixed. | ||
- Protection against the use of the snapshots for block devices with | ||
hardware inline encryption and data integrity was implemented. | ||
Compatibility with them was not planned and has not been tested at the | ||
moment. | ||
|
||
v5 changes: | ||
- Rebase for "kernel/git/axboe/linux-block.git" branch "for-6.5/block". | ||
Link: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git/log/?h=for-6.5/block | ||
|
||
v4 changes: | ||
- Structures for describing the state of chunks are allocated dynamically. | ||
This reduces memory consumption, since the struct chunk is allocated only | ||
for those blocks for which the snapshot image state differs from the | ||
original block device. | ||
- The algorithm for calculating the chunk size depending on the size of the | ||
block device has been changed. For large block devices, it is now | ||
possible to allocate a larger number of chunks, and their size is smaller. | ||
- For block devices, a 'filter' file has been added to /sys/block/<device>. | ||
It displays the name of the filter that is attached to the block device. | ||
- Fixed a problem with the lack of protection against re-adding a block | ||
device to a snapshot. | ||
- Fixed a bug in the algorithm of allocating the next bio for a chunk. | ||
This problem was accurred on large disks, for which a chunk consists of | ||
at least two bio. | ||
- The ownership mechanism of the diff_area structure has been changed. | ||
This fixed the error of prematurely releasing the diff_area structure | ||
when destroying the snapshot. | ||
- Documentation corrected. | ||
- The Sparse analyzer is passed. | ||
- Use __u64 type instead pointers in UAPI. | ||
|
||
v3 changes: | ||
- New block device I/O controls BLKFILTER_ATTACH and BLKFILTER_DETACH allow | ||
to attach and detach filters. | ||
- New block device I/O control BLKFILTER_CTL allow send command to attached | ||
block device filter. | ||
- The copy-on-write algorithm for processing I/O units has been optimized | ||
and has become asynchronous. | ||
- The snapshot image reading algorithm has been optimized and has become | ||
asynchronous. | ||
- Optimized the finite state machine for processing chunks. | ||
- Fixed a tracking block size calculation bug. | ||
|
||
v2 changes: | ||
- Added documentation for Block Device Filtering Mechanism. | ||
- Added documentation for Block Devices Snapshots Module (blksnap). | ||
- The MAINTAINERS file has been updated. | ||
- Optimized queue code for snapshot images. | ||
- Fixed comments, log messages and code for better readability. | ||
|
||
v1 changes: | ||
- Forgotten "static" declarations have been added. | ||
- The text of the comments has been corrected. | ||
- It is possible to connect only one filter, since there are no others in | ||
upstream. | ||
- Do not have additional locks for attach/detach filter. | ||
- blksnap.h moved to include/uapi/. | ||
- #pragma once and commented code removed. | ||
- uuid_t removed from user API. | ||
- Removed default values for module parameters from the configuration file. | ||
- The debugging code for tracking memory leaks has been removed. | ||
- Simplified Makefile. | ||
- Optimized work with large memory buffers, CBT tables are now in virtual | ||
memory. | ||
- The allocation code of minor numbers has been optimized. | ||
- The implementation of the snapshot image block device has been | ||
simplified, now it is a bio-based block device. | ||
- Removed initialization of global variables with null values. | ||
- only one bio is used to copy one chunk. | ||
- Checked on ppc64le. | ||
|
||
|
||
Sergei Shtepa (11): | ||
documentation: Block Device Filtering Mechanism | ||
block: Block Device Filtering Mechanism | ||
documentation: Block Devices Snapshots Module | ||
blksnap: header file of the module interface | ||
blksnap: module management interface functions | ||
blksnap: handling and tracking I/O units | ||
blksnap: difference storage and chunk | ||
blksnap: event queue from the difference storage | ||
blksnap: snapshot and snapshot image block device | ||
blksnap: Kconfig and Makefile | ||
blksnap: prevents using devices with data integrity or inline | ||
encryption | ||
|
||
Documentation/block/blkfilter.rst | 66 ++ | ||
Documentation/block/blksnap.rst | 352 +++++++++ | ||
Documentation/block/index.rst | 2 + | ||
.../userspace-api/ioctl/ioctl-number.rst | 1 + | ||
MAINTAINERS | 17 + | ||
block/Makefile | 3 +- | ||
block/bdev.c | 2 + | ||
block/blk-core.c | 35 +- | ||
block/blk-filter.c | 238 +++++++ | ||
block/blk.h | 11 + | ||
block/genhd.c | 10 + | ||
block/ioctl.c | 7 + | ||
block/partitions/core.c | 9 + | ||
drivers/block/Kconfig | 2 + | ||
drivers/block/Makefile | 2 + | ||
drivers/block/blksnap/Kconfig | 31 + | ||
drivers/block/blksnap/Makefile | 15 + | ||
drivers/block/blksnap/cbt_map.c | 228 ++++++ | ||
drivers/block/blksnap/cbt_map.h | 90 +++ | ||
drivers/block/blksnap/chunk.c | 667 ++++++++++++++++++ | ||
drivers/block/blksnap/chunk.h | 142 ++++ | ||
drivers/block/blksnap/diff_area.c | 601 ++++++++++++++++ | ||
drivers/block/blksnap/diff_area.h | 175 +++++ | ||
drivers/block/blksnap/diff_buffer.c | 115 +++ | ||
drivers/block/blksnap/diff_buffer.h | 37 + | ||
drivers/block/blksnap/diff_storage.c | 291 ++++++++ | ||
drivers/block/blksnap/diff_storage.h | 104 +++ | ||
drivers/block/blksnap/event_queue.c | 81 +++ | ||
drivers/block/blksnap/event_queue.h | 64 ++ | ||
drivers/block/blksnap/main.c | 475 +++++++++++++ | ||
drivers/block/blksnap/params.h | 16 + | ||
drivers/block/blksnap/snapimage.c | 134 ++++ | ||
drivers/block/blksnap/snapimage.h | 10 + | ||
drivers/block/blksnap/snapshot.c | 457 ++++++++++++ | ||
drivers/block/blksnap/snapshot.h | 64 ++ | ||
drivers/block/blksnap/tracker.c | 358 ++++++++++ | ||
drivers/block/blksnap/tracker.h | 78 ++ | ||
include/linux/blk-filter.h | 51 ++ | ||
include/linux/blk_types.h | 1 + | ||
include/linux/blkdev.h | 1 + | ||
include/linux/sched.h | 1 + | ||
include/uapi/linux/blk-filter.h | 35 + | ||
include/uapi/linux/blksnap.h | 388 ++++++++++ | ||
include/uapi/linux/fs.h | 3 + | ||
44 files changed, 5468 insertions(+), 2 deletions(-) | ||
create mode 100644 Documentation/block/blkfilter.rst | ||
create mode 100644 Documentation/block/blksnap.rst | ||
create mode 100644 block/blk-filter.c | ||
create mode 100644 drivers/block/blksnap/Kconfig | ||
create mode 100644 drivers/block/blksnap/Makefile | ||
create mode 100644 drivers/block/blksnap/cbt_map.c | ||
create mode 100644 drivers/block/blksnap/cbt_map.h | ||
create mode 100644 drivers/block/blksnap/chunk.c | ||
create mode 100644 drivers/block/blksnap/chunk.h | ||
create mode 100644 drivers/block/blksnap/diff_area.c | ||
create mode 100644 drivers/block/blksnap/diff_area.h | ||
create mode 100644 drivers/block/blksnap/diff_buffer.c | ||
create mode 100644 drivers/block/blksnap/diff_buffer.h | ||
create mode 100644 drivers/block/blksnap/diff_storage.c | ||
create mode 100644 drivers/block/blksnap/diff_storage.h | ||
create mode 100644 drivers/block/blksnap/event_queue.c | ||
create mode 100644 drivers/block/blksnap/event_queue.h | ||
create mode 100644 drivers/block/blksnap/main.c | ||
create mode 100644 drivers/block/blksnap/params.h | ||
create mode 100644 drivers/block/blksnap/snapimage.c | ||
create mode 100644 drivers/block/blksnap/snapimage.h | ||
create mode 100644 drivers/block/blksnap/snapshot.c | ||
create mode 100644 drivers/block/blksnap/snapshot.h | ||
create mode 100644 drivers/block/blksnap/tracker.c | ||
create mode 100644 drivers/block/blksnap/tracker.h | ||
create mode 100644 include/linux/blk-filter.h | ||
create mode 100644 include/uapi/linux/blk-filter.h | ||
create mode 100644 include/uapi/linux/blksnap.h | ||
|
||
-- | ||
2.20.1 | ||
|
124 changes: 124 additions & 0 deletions
124
patches/lk6.7-rc1-v2/v6-0001-documentation-Block-Device-Filtering-Mechanism.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
From 879784a77d7f15d7b485be91199771ce525380a0 Mon Sep 17 00:00:00 2001 | ||
From: Sergei Shtepa <[email protected]> | ||
Date: Tue, 7 Nov 2023 11:20:24 +0100 | ||
Subject: [PATCH v6 01/11] documentation: Block Device Filtering Mechanism | ||
|
||
The document contains: | ||
* Describes the purpose of the mechanism | ||
* A little historical background on the capabilities of handling I/O | ||
units of the Linux kernel | ||
* Brief description of the design | ||
* Reference to interface description | ||
|
||
Signed-off-by: Sergei Shtepa <[email protected]> | ||
--- | ||
Documentation/block/blkfilter.rst | 66 +++++++++++++++++++++++++++++++ | ||
Documentation/block/index.rst | 1 + | ||
MAINTAINERS | 6 +++ | ||
3 files changed, 73 insertions(+) | ||
create mode 100644 Documentation/block/blkfilter.rst | ||
|
||
diff --git a/Documentation/block/blkfilter.rst b/Documentation/block/blkfilter.rst | ||
new file mode 100644 | ||
index 000000000000..4e148e78f3d4 | ||
--- /dev/null | ||
+++ b/Documentation/block/blkfilter.rst | ||
@@ -0,0 +1,66 @@ | ||
+.. SPDX-License-Identifier: GPL-2.0 | ||
+ | ||
+================================ | ||
+Block Device Filtering Mechanism | ||
+================================ | ||
+ | ||
+The block device filtering mechanism provides the ability to attach block | ||
+device filters. Block device filters allow performing additional processing | ||
+for I/O units. | ||
+ | ||
+Introduction | ||
+============ | ||
+ | ||
+The idea of handling I/O units on block devices is not new. Back in the | ||
+2.6 kernel, there was an undocumented possibility of handling I/O units | ||
+by substituting the make_request_fn() function, which belonged to the | ||
+request_queue structure. But none of the in-tree kernel modules used this | ||
+feature, and it was eliminated in the 5.10 kernel. | ||
+ | ||
+The block device filtering mechanism returns the ability to handle I/O units. | ||
+It is possible to safely attach a filter to a block device "on the fly" without | ||
+changing the structure of the block device's stack. | ||
+ | ||
+It supports attaching one filter to one block device, because there is only | ||
+one filter implementation in the kernel yet. | ||
+See Documentation/block/blksnap.rst. | ||
+ | ||
+Design | ||
+====== | ||
+ | ||
+The block device filtering mechanism provides registration and unregistration | ||
+for filter operations. The struct blkfilter_operations contains a pointer to | ||
+the callback functions for the filter. After registering the filter operations, | ||
+the filter can be managed using block device ioctls BLKFILTER_ATTACH, | ||
+BLKFILTER_DETACH and BLKFILTER_CTL. | ||
+ | ||
+When the filter is attached, the callback function is called for each I/O unit | ||
+for a block device, providing I/O unit filtering. Depending on the result of | ||
+filtering the I/O unit, it can either be passed for subsequent processing by | ||
+the block layer, or skipped. | ||
+ | ||
+The filter can be implemented as a loadable module. In this case, the filter | ||
+module cannot be unloaded while the filter is attached to at least one of the | ||
+block devices. | ||
+ | ||
+Interface description | ||
+===================== | ||
+ | ||
+The ioctl BLKFILTER_ATTACH allows user-space programs to attach a block device | ||
+filter to a block device. The ioctl BLKFILTER_DETACH allows user-space programs | ||
+to detach it. Both ioctls use &struct blkfilter_name. The ioctl BLKFILTER_CTL | ||
+allows user-space programs to send a filter-specific command. It use &struct | ||
+blkfilter_ctl. | ||
+ | ||
+.. kernel-doc:: include/uapi/linux/blk-filter.h | ||
+ | ||
+To register in the system, the filter uses the &struct blkfilter_operations, | ||
+which contains callback functions, unique filter name and module owner. When | ||
+attaching a filter to a block device, the filter creates a &struct blkfilter. | ||
+The pointer to the &struct blkfilter allows the filter to determine for which | ||
+block device the callback functions are being called. | ||
+ | ||
+.. kernel-doc:: include/linux/blk-filter.h | ||
+ | ||
+.. kernel-doc:: block/blk-filter.c | ||
+ :export: | ||
diff --git a/Documentation/block/index.rst b/Documentation/block/index.rst | ||
index 9fea696f9daa..e9712f72cd6d 100644 | ||
--- a/Documentation/block/index.rst | ||
+++ b/Documentation/block/index.rst | ||
@@ -10,6 +10,7 @@ Block | ||
bfq-iosched | ||
biovecs | ||
blk-mq | ||
+ blkfilter | ||
cmdline-partition | ||
data-integrity | ||
deadline-iosched | ||
diff --git a/MAINTAINERS b/MAINTAINERS | ||
index 97f51d5ec1cf..c20cbec81b58 100644 | ||
--- a/MAINTAINERS | ||
+++ b/MAINTAINERS | ||
@@ -3584,6 +3584,12 @@ M: Jan-Simon Moeller <[email protected]> | ||
S: Maintained | ||
F: drivers/leds/leds-blinkm.c | ||
|
||
+BLOCK DEVICE FILTERING MECHANISM | ||
+M: Sergei Shtepa <[email protected]> | ||
+L: [email protected] | ||
+S: Supported | ||
+F: Documentation/block/blkfilter.rst | ||
+ | ||
BLOCK LAYER | ||
M: Jens Axboe <[email protected]> | ||
L: [email protected] | ||
-- | ||
2.20.1 | ||
|
Oops, something went wrong.