Revision 6377af48

b/block/qcow2-cluster.c
453 453
        c = 1;
454 454
        *cluster_offset &= L2E_COMPRESSED_OFFSET_SIZE_MASK;
455 455
        break;
456
    case QCOW2_CLUSTER_ZERO:
457
        c = count_contiguous_clusters(nb_clusters, s->cluster_size,
458
                &l2_table[l2_index], 0,
459
                QCOW_OFLAG_COMPRESSED | QCOW_OFLAG_ZERO);
460
        *cluster_offset = 0;
461
        break;
456 462
    case QCOW2_CLUSTER_UNALLOCATED:
457 463
        /* how many empty clusters ? */
458 464
        c = count_contiguous_free_clusters(nb_clusters, &l2_table[l2_index]);
......
461 467
    case QCOW2_CLUSTER_NORMAL:
462 468
        /* how many allocated clusters ? */
463 469
        c = count_contiguous_clusters(nb_clusters, s->cluster_size,
464
                &l2_table[l2_index], 0, QCOW_OFLAG_COMPRESSED);
470
                &l2_table[l2_index], 0,
471
                QCOW_OFLAG_COMPRESSED | QCOW_OFLAG_ZERO);
465 472
        *cluster_offset &= L2E_OFFSET_MASK;
466 473
        break;
467 474
    }
......
720 727
            break;
721 728
        case QCOW2_CLUSTER_UNALLOCATED:
722 729
        case QCOW2_CLUSTER_COMPRESSED:
730
        case QCOW2_CLUSTER_ZERO:
723 731
            break;
724 732
        default:
725 733
            abort();
......
868 876
        && (cluster_offset & QCOW_OFLAG_COPIED))
869 877
    {
870 878
        /* We keep all QCOW_OFLAG_COPIED clusters */
871
        keep_clusters = count_contiguous_clusters(nb_clusters, s->cluster_size,
872
                                                  &l2_table[l2_index], 0,
873
                                                  QCOW_OFLAG_COPIED);
879
        keep_clusters =
880
            count_contiguous_clusters(nb_clusters, s->cluster_size,
881
                                      &l2_table[l2_index], 0,
882
                                      QCOW_OFLAG_COPIED | QCOW_OFLAG_ZERO);
874 883
        assert(keep_clusters <= nb_clusters);
875 884
        nb_clusters -= keep_clusters;
876 885
    } else {
b/block/qcow2-refcount.c
703 703
                            nb_clusters << s->cluster_bits);
704 704
        break;
705 705
    case QCOW2_CLUSTER_UNALLOCATED:
706
    case QCOW2_CLUSTER_ZERO:
706 707
        break;
707 708
    default:
708 709
        abort();
......
973 974
                l2_entry & ~511, nb_csectors * 512);
974 975
            break;
975 976

  
977
        case QCOW2_CLUSTER_ZERO:
978
            if ((l2_entry & L2E_OFFSET_MASK) == 0) {
979
                break;
980
            }
981
            /* fall through */
982

  
976 983
        case QCOW2_CLUSTER_NORMAL:
977 984
        {
978 985
            /* QCOW_OFLAG_COPIED must be set iff refcount == 1 */
b/block/qcow2.c
536 536
            }
537 537
            break;
538 538

  
539
        case QCOW2_CLUSTER_ZERO:
540
            if (s->qcow_version < 3) {
541
                ret = -EIO;
542
                goto fail;
543
            }
544
            qemu_iovec_memset(&hd_qiov, 0, 512 * cur_nr_sectors);
545
            break;
546

  
539 547
        case QCOW2_CLUSTER_COMPRESSED:
540 548
            /* add AIO support for compressed blocks ? */
541 549
            ret = qcow2_decompress_cluster(bs, cluster_offset);
b/block/qcow2.h
43 43
#define QCOW_OFLAG_COPIED     (1LL << 63)
44 44
/* indicate that the cluster is compressed (they never have the copied flag) */
45 45
#define QCOW_OFLAG_COMPRESSED (1LL << 62)
46
/* The cluster reads as all zeros */
47
#define QCOW_OFLAG_ZERO (1LL << 0)
46 48

  
47 49
#define REFCOUNT_SHIFT 1 /* refcount size is 2 bytes */
48 50

  
......
184 186
    QCOW2_CLUSTER_UNALLOCATED,
185 187
    QCOW2_CLUSTER_NORMAL,
186 188
    QCOW2_CLUSTER_COMPRESSED,
189
    QCOW2_CLUSTER_ZERO
187 190
};
188 191

  
189 192
#define L1E_OFFSET_MASK 0x00ffffffffffff00ULL
......
213 216
{
214 217
    if (l2_entry & QCOW_OFLAG_COMPRESSED) {
215 218
        return QCOW2_CLUSTER_COMPRESSED;
219
    } else if (l2_entry & QCOW_OFLAG_ZERO) {
220
        return QCOW2_CLUSTER_ZERO;
216 221
    } else if (!(l2_entry & L2E_OFFSET_MASK)) {
217 222
        return QCOW2_CLUSTER_UNALLOCATED;
218 223
    } else {

Also available in: Unified diff