Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 340e01248478ba8b78a6d4d1809b1eff > files > 277

kvm-83-270.el5_11.src.rpm

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