This patch series adds a new block driver, blklogwrites, to QEMU. The driver is given two block devices: a raw device backed by an image or a host block device, and a log device, typically backed by a file, on which writes to the raw device are logged.
The logging format used is the same as in the dm-log-writes target of the Linux kernel device mapper. The log reflects the writes that have been performed on the guest block device and flushed. To be strict, the log may contain writes that have not been flushed yet, but they are technically outside the bounds of the log until the next flush updates the metadata in the log superblock. We believe these semantics to be useful even though they may not be completely identical to those of dm-log-writes. This functionality can be used for crash consistency and fs consistency testing in filesystem drivers, including on non-Linux guests and older guests running Linux versions without support for dm-log-writes. This is simple and useful. Admittedly this and more advanced things could perhaps be done by extending the quorum driver, but this approach would require re-engineering the functionality and involve a more complicated setup, so we offer this simple solution which we have found useful internally. In the first patch of this series, two block permission constants are moved from block.c to include/block/block.h to make them available outside of block.c. The next patch uses these constants. The driver requires all requests to be aligned to the sector size. In the second patch of this series, which includes the bulk of the blklogwrites driver, this sector size is assumed to be equal to BDRV_SECTOR_SIZE for simplicity. In patches 3-8, a mechanism to pass the block configuration of a block backend to a block driver is introduced, and this mechanism is integrated in various hw/block drivers. In patch 9, blklogwrites is changed to use the block configuration of the relevant block backend to set its block limits. Finally, in patch 10, blklogwrites is improved to use the logical sector size of the block backend for logging. This means that the sector size in the log metadata will be set to the logical sector size, and offsets and sizes of writes will be expressed as a multiple of that instead of BDRV_SECTOR_SIZE. v4: - Check return value of snprintf() (flagged by patchew) - Don't use C99 for loop initial declaration (flagged by patchew, but wasn't QEMU supposed to be C99? Oh well.) - Add proper "Since" fields for blklogwrites in block-core.json - Rebase on current upstream master v3: - Rebase on current upstream master v2: - Incorporate review feedback - Add patches to apply block configurations in more block device drivers Aapo Vienamo (1): block: Add blklogwrites Ari Sundholm (9): block: Move two block permission constants to the relevant enum block: Add a mechanism for passing a block driver a block configuration hw/scsi/scsi-disk: Always apply block configuration to block driver hw/ide/qdev: Always apply block configuration to block driver hw/block/virtio-blk: Always apply block configuration to block driver hw/block/nvme: Always apply block configuration to block driver hw/block/fdc: Always apply block configuration to block driver block/blklogwrites: Use block limits from the backend block configuration block/blklogwrites: Use the block device logical sector size when logging writes MAINTAINERS | 6 + block.c | 6 - block/Makefile.objs | 1 + block/blklogwrites.c | 426 ++++++++++++++++++++++++++++++++++++++++++++++ block/io.c | 22 +++ hw/block/block.c | 12 +- hw/block/fdc.c | 4 + hw/block/nvme.c | 1 + hw/block/virtio-blk.c | 1 + hw/ide/qdev.c | 2 + hw/scsi/scsi-disk.c | 1 + include/block/block.h | 17 ++ include/block/block_int.h | 9 + include/hw/block/block.h | 1 + qapi/block-core.json | 30 +++- 15 files changed, 526 insertions(+), 13 deletions(-) create mode 100644 block/blklogwrites.c -- 2.7.4