Revision 4c1612d9 block/qcow2-cluster.c

b/block/qcow2-cluster.c
578 578
    return cluster_offset;
579 579
}
580 580

  
581
/*
582
 * Write L2 table updates to disk, writing whole sectors to avoid a
583
 * read-modify-write in bdrv_pwrite
584
 */
585
#define L2_ENTRIES_PER_SECTOR (512 / 8)
586
static int write_l2_entries(BDRVQcowState *s, uint64_t *l2_table,
587
    uint64_t l2_offset, int l2_index, int num)
588
{
589
    int l2_start_index = l2_index & ~(L1_ENTRIES_PER_SECTOR - 1);
590
    int start_offset = (8 * l2_index) & ~511;
591
    int end_offset = (8 * (l2_index + num) + 511) & ~511;
592
    size_t len = end_offset - start_offset;
593

  
594
    if (bdrv_pwrite(s->hd, l2_offset + start_offset, &l2_table[l2_start_index],
595
        len) != len)
596
    {
597
        return -1;
598
    }
599

  
600
    return 0;
601
}
602

  
581 603
int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, uint64_t cluster_offset,
582 604
    QCowL2Meta *m)
583 605
{
......
625 647
                    (i << s->cluster_bits)) | QCOW_OFLAG_COPIED);
626 648
     }
627 649

  
628
    if (bdrv_pwrite(s->hd, l2_offset + l2_index * sizeof(uint64_t),
629
                l2_table + l2_index, m->nb_clusters * sizeof(uint64_t)) !=
630
            m->nb_clusters * sizeof(uint64_t))
650
    if (write_l2_entries(s, l2_table, l2_offset, l2_index, m->nb_clusters) < 0) {
651
        ret = -1;
631 652
        goto err;
653
    }
632 654

  
633 655
    for (i = 0; i < j; i++)
634 656
        qcow2_free_any_clusters(bs,

Also available in: Unified diff