From: Anthony Liguori <anthony@codemonkey.ws>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [5859] Write table offset and size in one syscall (Gleb Natapov)
Date: Tue, 02 Dec 2008 20:10:26 +0000 [thread overview]
Message-ID: <E1L7bZi-0004XZ-F2@cvs.savannah.gnu.org> (raw)
Revision: 5859
http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5859
Author: aliguori
Date: 2008-12-02 20:10:14 +0000 (Tue, 02 Dec 2008)
Log Message:
-----------
Write table offset and size in one syscall (Gleb Natapov)
Otherwise if VM is killed between two writes data may be lost.
But if offset and size fields are at the same disk block one
write should update them both simultaneously.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Modified Paths:
--------------
trunk/block-qcow2.c
Modified: trunk/block-qcow2.c
===================================================================
--- trunk/block-qcow2.c 2008-12-02 20:08:04 UTC (rev 5858)
+++ trunk/block-qcow2.c 2008-12-02 20:10:14 UTC (rev 5859)
@@ -429,8 +429,7 @@
int new_l1_size, new_l1_size2, ret, i;
uint64_t *new_l1_table;
uint64_t new_l1_table_offset;
- uint64_t data64;
- uint32_t data32;
+ uint8_t data[12];
new_l1_size = s->l1_size;
if (min_size <= new_l1_size)
@@ -460,14 +459,11 @@
new_l1_table[i] = be64_to_cpu(new_l1_table[i]);
/* set new table */
- data64 = cpu_to_be64(new_l1_table_offset);
- if (bdrv_pwrite(s->hd, offsetof(QCowHeader, l1_table_offset),
- &data64, sizeof(data64)) != sizeof(data64))
+ cpu_to_be32w((uint32_t*)data, new_l1_size);
+ cpu_to_be64w((uint64_t*)(data + 4), new_l1_table_offset);
+ if (bdrv_pwrite(s->hd, offsetof(QCowHeader, l1_size), data,
+ sizeof(data)) != sizeof(data))
goto fail;
- data32 = cpu_to_be32(new_l1_size);
- if (bdrv_pwrite(s->hd, offsetof(QCowHeader, l1_size),
- &data32, sizeof(data32)) != sizeof(data32))
- goto fail;
qemu_free(s->l1_table);
free_clusters(bs, s->l1_table_offset, s->l1_size * sizeof(uint64_t));
s->l1_table_offset = new_l1_table_offset;
@@ -2281,8 +2277,7 @@
int new_table_size, new_table_size2, refcount_table_clusters, i, ret;
uint64_t *new_table;
int64_t table_offset;
- uint64_t data64;
- uint32_t data32;
+ uint8_t data[12];
int old_table_size;
int64_t old_table_offset;
@@ -2321,14 +2316,11 @@
for(i = 0; i < s->refcount_table_size; i++)
be64_to_cpus(&new_table[i]);
- data64 = cpu_to_be64(table_offset);
+ cpu_to_be64w((uint64_t*)data, table_offset);
+ cpu_to_be32w((uint32_t*)(data + 8), refcount_table_clusters);
if (bdrv_pwrite(s->hd, offsetof(QCowHeader, refcount_table_offset),
- &data64, sizeof(data64)) != sizeof(data64))
+ data, sizeof(data)) != sizeof(data))
goto fail;
- data32 = cpu_to_be32(refcount_table_clusters);
- if (bdrv_pwrite(s->hd, offsetof(QCowHeader, refcount_table_clusters),
- &data32, sizeof(data32)) != sizeof(data32))
- goto fail;
qemu_free(s->refcount_table);
old_table_offset = s->refcount_table_offset;
old_table_size = s->refcount_table_size;
reply other threads:[~2008-12-02 20:10 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E1L7bZi-0004XZ-F2@cvs.savannah.gnu.org \
--to=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).