qcow2: Flush pending discards before allocating cluster
PATCH 1/1 qcow2: Flush pending discards before allocating cluster
Before a freed cluster can be reused, pending discards for this cluster must be processed.
The original assumption was that this was not a problem because discards are only cached during discard/write zeroes operations, which are synchronous so that no concurrent write requests can cause cluster allocations.
However, the discard/write zeroes operation itself can allocate a new L2 table (and it has to in order to put zero flags there), so make sure we can cope with the situation.
This fixes https://bugs.launchpad.net/bugs/1349972.
--- block/qcow2-refcount.c | 5 +++++ 1 file changed, 5 insertions(+)
block/qcow2-refcount.c +5 -0
@@ -833,6 +833,11 @@ static int64_t alloc_clusters_noref(BlockDriverState *bs, uint64_t size)uint64_t i, nb_clusters, refcount;int ret; +/* We can't allocate clusters if they may still be queued for discard. */ +if (s->cache_discards) { +qcow2_process_discards (bs,0 ); + } + nb_clusters =size_to_clusters (s, size); retry:for (i =0 ; i < nb_clusters; i++) {
Signature · 1 line
1.8.3.1
Quoted 12 lines · Kevin Wolf
Before a freed cluster can be reused, pending discards for this cluster must be processed.
The original assumption was that this was not a problem because discards are only cached during discard/write zeroes operations, which are synchronous so that no concurrent write requests can cause cluster allocations.
However, the discard/write zeroes operation itself can allocate a new L2 table (and it has to in order to put zero flags there), so make sure we can cope with the situation.
Quoted 6 lines
This fixes https://bugs.launchpad.net/bugs/1349972.
Signed-off-by Kevin Wolf <[email protected]>--- block/qcow2-refcount.c | 5 +++++ 1 file changed, 5 insertions(+)
Kevin Wolf
AppliedAm 06.05.2015 um 13:29 hat Kevin Wolf geschrieben:
Quoted 8 lines
Before a freed cluster can be reused, pending discards for this cluster must be processed.
The original assumption was that this was not a problem because discards are only cached during discard/write zeroes operations, which are synchronous so that no concurrent write requests can cause cluster allocations.
Quoted 7 lines
However, the discard/write zeroes operation itself can allocate a new L2 table (and it has to in order to put zero flags there), so make sure we can cope with the situation.
This fixes https://bugs.launchpad.net/bugs/1349972.
Signed-off-by Kevin Wolf <[email protected]>
Applied to my block branch.
Kevin