From 29c04a908cfea2676791c7c2b4ecbd6172025102 Mon Sep 17 00:00:00 2001 From: Kevin Wolf <kwolf@redhat.com> Date: Fri, 25 Jun 2010 08:06:14 -0300 Subject: [PATCH 17/18] block: Add bdrv_(p)write_sync RH-Author: Kevin Wolf <kwolf@redhat.com> Message-id: <1277453175-7489-2-git-send-email-kwolf@redhat.com> Patchwork-id: 10221 O-Subject: [RHEL-5.6/5.5.z KVM PATCH v2 1/2] block: Add bdrv_(p)write_sync Bugzilla: 572825 RH-Acked-by: Jes Sorensen <Jes.Sorensen@redhat.com> RH-Acked-by: Juan Quintela <quintela@redhat.com> RH-Acked-by: Christoph Hellwig <chellwig@redhat.com> Bugzilla: 572825 Upstream commit: f08145fe16470aca09304099888f68cfbc5d1de7 Add new functions that write and flush the written data to disk immediately. This is what needs to be used for image format metadata to maintain integrity for cache=... modes that don't use O_DSYNC. (Actually, we only need barriers, and therefore the functions are defined as such, but flushes is what is implemented in this patch - we can try to change that later) Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- qemu/block.c | 37 +++++++++++++++++++++++++++++++++++++ qemu/block.h | 4 ++++ 2 files changed, 41 insertions(+), 0 deletions(-) Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- qemu/block.c | 37 +++++++++++++++++++++++++++++++++++++ qemu/block.h | 4 ++++ 2 files changed, 41 insertions(+), 0 deletions(-) diff --git a/qemu/block.c b/qemu/block.c index 158d2c2..73c5952 100644 --- a/qemu/block.c +++ b/qemu/block.c @@ -952,6 +952,43 @@ int bdrv_pwrite(BlockDriverState *bs, int64_t offset, return drv->bdrv_pwrite(bs, offset, buf1, count1); } +/* + * Writes to the file and ensures that no writes are reordered across this + * request (acts as a barrier) + * + * Returns 0 on success, -errno in error cases. + */ +int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset, + const void *buf, int count) +{ + int ret; + + ret = bdrv_pwrite(bs, offset, buf, count); + if (ret < 0) { + return ret; + } + + /* No flush needed for cache=writethrough, it uses O_DSYNC */ + if ((bs->open_flags & BDRV_O_CACHE_MASK) != 0) { + bdrv_flush(bs); + } + + return 0; +} + +/* + * Writes to the file and ensures that no writes are reordered across this + * request (acts as a barrier) + * + * Returns 0 on success, -errno in error cases. + */ +int bdrv_write_sync(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors) +{ + return bdrv_pwrite_sync(bs, 512 * sector_num, + buf, 512 * nb_sectors); +} + /** * Truncate file to 'offset' bytes (needed only for file protocols) */ diff --git a/qemu/block.h b/qemu/block.h index 261bd84..16a6baf 100644 --- a/qemu/block.h +++ b/qemu/block.h @@ -79,6 +79,10 @@ int bdrv_pread(BlockDriverState *bs, int64_t offset, void *buf, int count); int bdrv_pwrite(BlockDriverState *bs, int64_t offset, const void *buf, int count); +int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset, + const void *buf, int count); +int bdrv_write_sync(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors); int bdrv_truncate(BlockDriverState *bs, int64_t offset); int64_t bdrv_getlength(BlockDriverState *bs); void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr); -- 1.7.0.3