From: Kevin Wolf <kwolf@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, stefanha@redhat.com
Subject: [Qemu-devel] [PATCH 3/5] qcow2: Options to enable discard for freed clusters
Date: Thu, 13 Jun 2013 13:47:41 +0200 [thread overview]
Message-ID: <1371124063-12971-4-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1371124063-12971-1-git-send-email-kwolf@redhat.com>
Deleted snapshots are discarded in the image file by default, discard
requests take their default from the -drive discard=... option and other
places that free clusters must always be enabled explicitly.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/qcow2-refcount.c | 5 +++++
block/qcow2.c | 26 ++++++++++++++++++++++++++
block/qcow2.h | 5 +++++
3 files changed, 36 insertions(+)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 6d35e49..7488988 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -488,6 +488,11 @@ static int QEMU_WARN_UNUSED_RESULT update_refcount(BlockDriverState *bs,
s->free_cluster_index = cluster_index;
}
refcount_block[block_index] = cpu_to_be16(refcount);
+ if (refcount == 0 && s->discard_passthrough[type]) {
+ /* Try discarding, ignore errors */
+ /* FIXME Doing this cluster by cluster will be painfully slow */
+ bdrv_discard(bs->file, cluster_offset, 1);
+ }
}
ret = 0;
diff --git a/block/qcow2.c b/block/qcow2.c
index e28ea47..62e6753 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -295,6 +295,22 @@ static QemuOptsList qcow2_runtime_opts = {
.type = QEMU_OPT_BOOL,
.help = "Postpone refcount updates",
},
+ {
+ .name = QCOW2_OPT_DISCARD_REQUEST,
+ .type = QEMU_OPT_BOOL,
+ .help = "Pass guest discard requests to the layer below",
+ },
+ {
+ .name = QCOW2_OPT_DISCARD_SNAPSHOT,
+ .type = QEMU_OPT_BOOL,
+ .help = "Generate discard requests when snapshot related space "
+ "is freed",
+ },
+ {
+ .name = QCOW2_OPT_DISCARD_OTHER,
+ .type = QEMU_OPT_BOOL,
+ .help = "Generate discard requests when other clusters are freed",
+ },
{ /* end of list */ }
},
};
@@ -532,6 +548,16 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags)
s->use_lazy_refcounts = qemu_opt_get_bool(opts, QCOW2_OPT_LAZY_REFCOUNTS,
(s->compatible_features & QCOW2_COMPAT_LAZY_REFCOUNTS));
+ s->discard_passthrough[QCOW2_DISCARD_NEVER] = false,
+ s->discard_passthrough[QCOW2_DISCARD_ALWAYS] = true,
+ s->discard_passthrough[QCOW2_DISCARD_REQUEST] =
+ qemu_opt_get_bool(opts, QCOW2_OPT_DISCARD_REQUEST,
+ flags & BDRV_O_UNMAP),
+ s->discard_passthrough[QCOW2_DISCARD_SNAPSHOT] =
+ qemu_opt_get_bool(opts, QCOW2_OPT_DISCARD_SNAPSHOT, true),
+ s->discard_passthrough[QCOW2_DISCARD_OTHER] =
+ qemu_opt_get_bool(opts, QCOW2_OPT_DISCARD_OTHER, false),
+
qemu_opts_del(opts);
if (s->use_lazy_refcounts && s->qcow_version < 3) {
diff --git a/block/qcow2.h b/block/qcow2.h
index 64a6479..6f91b9a 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -60,6 +60,9 @@
#define QCOW2_OPT_LAZY_REFCOUNTS "lazy_refcounts"
+#define QCOW2_OPT_DISCARD_REQUEST "pass_discard_request"
+#define QCOW2_OPT_DISCARD_SNAPSHOT "pass_discard_snapshot"
+#define QCOW2_OPT_DISCARD_OTHER "pass_discard_other"
typedef struct QCowHeader {
uint32_t magic;
@@ -187,6 +190,8 @@ typedef struct BDRVQcowState {
int qcow_version;
bool use_lazy_refcounts;
+ bool discard_passthrough[QCOW2_DISCARD_MAX];
+
uint64_t incompatible_features;
uint64_t compatible_features;
uint64_t autoclear_features;
--
1.8.1.4
next prev parent reply other threads:[~2013-06-13 11:49 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-13 11:47 [Qemu-devel] [PATCH 0/5] qcow2: Discard freed clusters Kevin Wolf
2013-06-13 11:47 ` [Qemu-devel] [PATCH 1/5] Revert "block: Disable driver-specific options for 1.5" Kevin Wolf
2013-06-13 11:47 ` [Qemu-devel] [PATCH 2/5] qcow2: Add refcount update reason to all callers Kevin Wolf
2013-06-13 11:47 ` Kevin Wolf [this message]
2013-06-13 22:10 ` [Qemu-devel] [PATCH 3/5] qcow2: Options to enable discard for freed clusters Paolo Bonzini
2013-06-14 8:31 ` Kevin Wolf
2013-06-14 14:16 ` Paolo Bonzini
2013-06-14 14:31 ` Kevin Wolf
2013-06-14 15:00 ` Paolo Bonzini
2013-06-17 15:41 ` Stefan Hajnoczi
2013-06-17 15:58 ` Kevin Wolf
2013-06-13 11:47 ` [Qemu-devel] [PATCH 4/5] qcow2: Batch discards Kevin Wolf
2013-06-17 15:45 ` Stefan Hajnoczi
2013-06-13 11:47 ` [Qemu-devel] [PATCH 5/5] block: Always enable discard on the protocol level Kevin Wolf
2013-06-13 22:06 ` Paolo Bonzini
2013-06-14 8:14 ` Kevin Wolf
2013-06-18 3:03 ` [Qemu-devel] [PATCH 0/5] qcow2: Discard freed clusters Wenchao Xia
2013-06-18 6:25 ` Kevin Wolf
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=1371124063-12971-4-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.