qcow2: Round QCowL2Meta.offset down to cluster boundary
The offset within the cluster is already present as n_start and this is what the code uses. QCowL2Meta.offset is only needed at a cluster granularity. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
a7f3d65b65
commit
1d3afd649b
|
@ -631,7 +631,7 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m)
|
||||||
old_cluster = g_malloc(m->nb_clusters * sizeof(uint64_t));
|
old_cluster = g_malloc(m->nb_clusters * sizeof(uint64_t));
|
||||||
|
|
||||||
/* copy content of unmodified sectors */
|
/* copy content of unmodified sectors */
|
||||||
start_sect = (m->offset & ~(s->cluster_size - 1)) >> 9;
|
start_sect = m->offset >> 9;
|
||||||
if (m->n_start) {
|
if (m->n_start) {
|
||||||
cow = true;
|
cow = true;
|
||||||
qemu_co_mutex_unlock(&s->lock);
|
qemu_co_mutex_unlock(&s->lock);
|
||||||
|
@ -966,7 +966,7 @@ again:
|
||||||
.cluster_offset = keep_clusters == 0 ?
|
.cluster_offset = keep_clusters == 0 ?
|
||||||
alloc_cluster_offset : cluster_offset,
|
alloc_cluster_offset : cluster_offset,
|
||||||
.alloc_offset = alloc_cluster_offset,
|
.alloc_offset = alloc_cluster_offset,
|
||||||
.offset = alloc_offset,
|
.offset = alloc_offset & ~(s->cluster_size - 1),
|
||||||
.n_start = keep_clusters == 0 ? n_start : 0,
|
.n_start = keep_clusters == 0 ? n_start : 0,
|
||||||
.nb_clusters = nb_clusters,
|
.nb_clusters = nb_clusters,
|
||||||
.nb_available = MIN(requested_sectors, avail_sectors),
|
.nb_available = MIN(requested_sectors, avail_sectors),
|
||||||
|
|
|
@ -199,12 +199,34 @@ struct QCowAIOCB;
|
||||||
/* XXX This could be private for qcow2-cluster.c */
|
/* XXX This could be private for qcow2-cluster.c */
|
||||||
typedef struct QCowL2Meta
|
typedef struct QCowL2Meta
|
||||||
{
|
{
|
||||||
|
/** Guest offset of the first newly allocated cluster */
|
||||||
uint64_t offset;
|
uint64_t offset;
|
||||||
|
|
||||||
|
/** Host offset of the first cluster of the request */
|
||||||
uint64_t cluster_offset;
|
uint64_t cluster_offset;
|
||||||
|
|
||||||
|
/** Host offset of the first newly allocated cluster */
|
||||||
uint64_t alloc_offset;
|
uint64_t alloc_offset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of sectors between the start of the first allocated cluster and
|
||||||
|
* the area that the guest actually writes to.
|
||||||
|
*/
|
||||||
int n_start;
|
int n_start;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of sectors from the start of the first allocated cluster to
|
||||||
|
* the end of the (possibly shortened) request
|
||||||
|
*/
|
||||||
int nb_available;
|
int nb_available;
|
||||||
|
|
||||||
|
/** Number of newly allocated clusters */
|
||||||
int nb_clusters;
|
int nb_clusters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests that overlap with this allocation and wait to be restarted
|
||||||
|
* when the allocating request has completed.
|
||||||
|
*/
|
||||||
CoQueue dependent_requests;
|
CoQueue dependent_requests;
|
||||||
|
|
||||||
QLIST_ENTRY(QCowL2Meta) next_in_flight;
|
QLIST_ENTRY(QCowL2Meta) next_in_flight;
|
||||||
|
|
Loading…
Reference in New Issue