From: Pekka Enberg Date: Sat, 9 Jul 2011 12:15:52 +0000 (+0300) Subject: kvm tools, qcow: Flush only dirty L2 tables X-Git-Tag: next-20110824~3^2~115 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=7135b8db728326665c341f3915f7d74a555dc656;p=karo-tx-linux.git kvm tools, qcow: Flush only dirty L2 tables This patch improves qcow_l2_cache_write() to only flush dirty L2 tables. Cc: Asias He Cc: Cyrill Gorcunov Cc: Ingo Molnar Cc: Prasad Joshi Cc: Sasha Levin Signed-off-by: Pekka Enberg --- diff --git a/tools/kvm/disk/qcow.c b/tools/kvm/disk/qcow.c index b71762f27d3e..13c8bea496f6 100644 --- a/tools/kvm/disk/qcow.c +++ b/tools/kvm/disk/qcow.c @@ -93,9 +93,17 @@ static int qcow_l2_cache_write(struct qcow *q, struct qcow_l2_table *c) struct qcow_header *header = q->header; u64 size; + if (!c->dirty) + return 0; + size = 1 << header->l2_bits; - return pwrite_in_full(q->fd, c->table, size * sizeof(u64), c->offset); + if (pwrite_in_full(q->fd, c->table, size * sizeof(u64), c->offset) < 0) + return -1; + + c->dirty = 0; + + return 0; } static int cache_table(struct qcow *q, struct qcow_l2_table *c) @@ -447,6 +455,7 @@ static ssize_t qcow_write_cluster(struct qcow *q, u64 offset, void *buf, u32 src if (!clust_start) { clust_start = ALIGN(f_sz, clust_sz); l2t->table[l2t_idx] = cpu_to_be64(clust_start); + l2t->dirty = 1; } mutex_unlock(&q->mutex); diff --git a/tools/kvm/include/kvm/qcow.h b/tools/kvm/include/kvm/qcow.h index d44c64ada850..650d3c290fd7 100644 --- a/tools/kvm/include/kvm/qcow.h +++ b/tools/kvm/include/kvm/qcow.h @@ -27,6 +27,7 @@ struct qcow_l2_table { u64 offset; struct rb_node node; struct list_head list; + u8 dirty; u64 table[]; };