Fiona Ebner <f.eb...@proxmox.com> writes: > From: John Snow <js...@redhat.com> > > This patch adds support for the "BITMAP" sync mode to drive-mirror and > blockdev-mirror. It adds support only for the BitmapSyncMode "never," > because it's the simplest mode. > > This mode simply uses a user-provided bitmap as an initial copy > manifest, and then does not clear any bits in the bitmap at the > conclusion of the operation. > > Any new writes dirtied during the operation are copied out, in contrast > to backup. Note that whether these writes are reflected in the bitmap > at the conclusion of the operation depends on whether that bitmap is > actually recording! > > This patch was originally based on one by Ma Haocong, but it has since > been modified pretty heavily. > > Suggested-by: Ma Haocong <mahaoc...@didichuxing.com> > Signed-off-by: Ma Haocong <mahaoc...@didichuxing.com> > Signed-off-by: John Snow <js...@redhat.com> > [FG: switch to bdrv_dirty_bitmap_merge_internal] > Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> > Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com> > [FE: rebase for 9.0 > update version and formatting in QAPI] > Signed-off-by: Fiona Ebner <f.eb...@proxmox.com>
[...] > diff --git a/qapi/block-core.json b/qapi/block-core.json > index ab5a93a966..ac05483958 100644 > --- a/qapi/block-core.json > +++ b/qapi/block-core.json > @@ -2181,6 +2181,15 @@ > # destination (all the disk, only the sectors allocated in the > # topmost image, or only new I/O). > # > +# @bitmap: The name of a bitmap to use for sync=bitmap mode. This > +# argument must be present for bitmap mode and absent otherwise. > +# The bitmap's granularity is used instead of @granularity. > +# (Since 9.0). What happens when the user specifies @granularity anyway? Error or silently ignored? > +# > +# @bitmap-mode: Specifies the type of data the bitmap should contain > +# after the operation concludes. Must be present if sync is > +# "bitmap". Must NOT be present otherwise. (Since 9.0) Members that must be present when and only when some enum member has a certain value should perhaps be in a union branch. Perhaps the block maintainers have an opinion here. > +# > # @granularity: granularity of the dirty bitmap, default is 64K if the > # image format doesn't have clusters, 4K if the clusters are > # smaller than that, else the cluster size. Must be a power of 2 > @@ -2223,7 +2232,9 @@ > { 'struct': 'DriveMirror', > 'data': { '*job-id': 'str', 'device': 'str', 'target': 'str', > '*format': 'str', '*node-name': 'str', '*replaces': 'str', > - 'sync': 'MirrorSyncMode', '*mode': 'NewImageMode', > + 'sync': 'MirrorSyncMode', '*bitmap': 'str', > + '*bitmap-mode': 'BitmapSyncMode', > + '*mode': 'NewImageMode', > '*speed': 'int', '*granularity': 'uint32', > '*buf-size': 'int', '*on-source-error': 'BlockdevOnError', > '*on-target-error': 'BlockdevOnError', > @@ -2507,6 +2518,15 @@ > # destination (all the disk, only the sectors allocated in the > # topmost image, or only new I/O). > # > +# @bitmap: The name of a bitmap to use for sync=bitmap mode. This > +# argument must be present for bitmap mode and absent otherwise. > +# The bitmap's granularity is used instead of @granularity. > +# (Since 9.0). > +# > +# @bitmap-mode: Specifies the type of data the bitmap should contain > +# after the operation concludes. Must be present if sync is > +# "bitmap". Must NOT be present otherwise. (Since 9.0) > +# > # @granularity: granularity of the dirty bitmap, default is 64K if the > # image format doesn't have clusters, 4K if the clusters are > # smaller than that, else the cluster size. Must be a power of 2 > @@ -2557,7 +2577,8 @@ > { 'command': 'blockdev-mirror', > 'data': { '*job-id': 'str', 'device': 'str', 'target': 'str', > '*replaces': 'str', > - 'sync': 'MirrorSyncMode', > + 'sync': 'MirrorSyncMode', '*bitmap': 'str', > + '*bitmap-mode': 'BitmapSyncMode', > '*speed': 'int', '*granularity': 'uint32', > '*buf-size': 'int', '*on-source-error': 'BlockdevOnError', > '*on-target-error': 'BlockdevOnError', [...]