static int zero_single_l2(BlockDriverState *bs, uint64_t offset,

                          uint64_t nb_clusters, int flags)

{

    BDRVQcow2State *s = bs->opaque;

    uint64_t *l2_table;

    int l2_index;

    int ret;

    int i;



    ret = get_cluster_table(bs, offset, &l2_table, &l2_index);

    if (ret < 0) {

        return ret;

    }



    /* Limit nb_clusters to one L2 table */

    nb_clusters = MIN(nb_clusters, s->l2_size - l2_index);

    assert(nb_clusters <= INT_MAX);



    for (i = 0; i < nb_clusters; i++) {

        uint64_t old_offset;



        old_offset = be64_to_cpu(l2_table[l2_index + i]);



        /* Update L2 entries */

        qcow2_cache_entry_mark_dirty(bs, s->l2_table_cache, l2_table);

        if (old_offset & QCOW_OFLAG_COMPRESSED || flags & BDRV_REQ_MAY_UNMAP) {

            l2_table[l2_index + i] = cpu_to_be64(QCOW_OFLAG_ZERO);

            qcow2_free_any_clusters(bs, old_offset, 1, QCOW2_DISCARD_REQUEST);

        } else {

            l2_table[l2_index + i] |= cpu_to_be64(QCOW_OFLAG_ZERO);

        }

    }



    qcow2_cache_put(bs, s->l2_table_cache, (void **) &l2_table);



    return nb_clusters;

}

static int zero_single_l2(BlockDriverState *bs, uint64_t offset,

                          uint64_t nb_clusters, int flags)

{

    BDRVQcow2State *s = bs->opaque;

    uint64_t *l2_table;

    int l2_index;

    int ret;

    int i;



    ret = get_cluster_table(bs, offset, &l2_table, &l2_index);

    if (ret < 0) {

        return ret;

    }



    

    nb_clusters = MIN(nb_clusters, s->l2_size - l2_index);

    assert(nb_clusters <= INT_MAX);



    for (i = 0; i < nb_clusters; i++) {

        uint64_t old_offset;



        old_offset = be64_to_cpu(l2_table[l2_index + i]);



        

        qcow2_cache_entry_mark_dirty(bs, s->l2_table_cache, l2_table);

        if (old_offset & QCOW_OFLAG_COMPRESSED || flags & BDRV_REQ_MAY_UNMAP) {

            l2_table[l2_index + i] = cpu_to_be64(QCOW_OFLAG_ZERO);

            qcow2_free_any_clusters(bs, old_offset, 1, QCOW2_DISCARD_REQUEST);

        } else {

            l2_table[l2_index + i] |= cpu_to_be64(QCOW_OFLAG_ZERO);

        }

    }



    qcow2_cache_put(bs, s->l2_table_cache, (void **) &l2_table);



    return nb_clusters;

}

static int FUNC_0(BlockDriverState *VAR_0, uint64_t VAR_1,

                          uint64_t VAR_2, int VAR_3)

{

    BDRVQcow2State *s = VAR_0->opaque;

    uint64_t *l2_table;

    int VAR_4;

    int VAR_5;

    int VAR_6;



    VAR_5 = get_cluster_table(VAR_0, VAR_1, &l2_table, &VAR_4);

    if (VAR_5 < 0) {

        return VAR_5;

    }



    

    VAR_2 = MIN(VAR_2, s->l2_size - VAR_4);

    assert(VAR_2 <= INT_MAX);



    for (VAR_6 = 0; VAR_6 < VAR_2; VAR_6++) {

        uint64_t old_offset;



        old_offset = be64_to_cpu(l2_table[VAR_4 + VAR_6]);



        

        qcow2_cache_entry_mark_dirty(VAR_0, s->l2_table_cache, l2_table);

        if (old_offset & QCOW_OFLAG_COMPRESSED || VAR_3 & BDRV_REQ_MAY_UNMAP) {

            l2_table[VAR_4 + VAR_6] = cpu_to_be64(QCOW_OFLAG_ZERO);

            qcow2_free_any_clusters(VAR_0, old_offset, 1, QCOW2_DISCARD_REQUEST);

        } else {

            l2_table[VAR_4 + VAR_6] |= cpu_to_be64(QCOW_OFLAG_ZERO);

        }

    }



    qcow2_cache_put(VAR_0, s->l2_table_cache, (void **) &l2_table);



    return VAR_2;

}

static int FUNC_0(BlockDriverState *VAR_0, uint64_t VAR_1,
uint64_t VAR_2, int VAR_3)
{ BDRVQcow2State *s = VAR_0->opaque; uint64_t *l2_table; int VAR_4; int VAR_5; int VAR_6; VAR_5 = get_cluster_table(VAR_0, VAR_1, &l2_table, &VAR_4); if (VAR_5 < 0) { return VAR_5; } VAR_2 = MIN(VAR_2, s->l2_size - VAR_4); assert(VAR_2 <= INT_MAX); for (VAR_6 = 0; VAR_6 < VAR_2; VAR_6++) { uint64_t old_offset; old_offset = be64_to_cpu(l2_table[VAR_4 + VAR_6]); qcow2_cache_entry_mark_dirty(VAR_0, s->l2_table_cache, l2_table); if (old_offset & QCOW_OFLAG_COMPRESSED || VAR_3 & BDRV_REQ_MAY_UNMAP) { l2_table[VAR_4 + VAR_6] = cpu_to_be64(QCOW_OFLAG_ZERO); qcow2_free_any_clusters(VAR_0, old_offset, 1, QCOW2_DISCARD_REQUEST); } else { l2_table[VAR_4 + VAR_6] |= cpu_to_be64(QCOW_OFLAG_ZERO); } } qcow2_cache_put(VAR_0, s->l2_table_cache, (void **) &l2_table); return VAR_2; }