static int get_whole_cluster(BlockDriverState *bs,

                VmdkExtent *extent,

                uint64_t cluster_offset,

                uint64_t offset,

                bool allocate)

{

    /* 128 sectors * 512 bytes each = grain size 64KB */

    uint8_t  whole_grain[extent->cluster_sectors * 512];



    /* we will be here if it's first write on non-exist grain(cluster).

     * try to read from parent image, if exist */

    if (bs->backing_hd) {

        int ret;



        if (!vmdk_is_cid_valid(bs))

            return -1;



        /* floor offset to cluster */

        offset -= offset % (extent->cluster_sectors * 512);

        ret = bdrv_read(bs->backing_hd, offset >> 9, whole_grain,

                extent->cluster_sectors);

        if (ret < 0) {

            return -1;

        }



        /* Write grain only into the active image */

        ret = bdrv_write(extent->file, cluster_offset, whole_grain,

                extent->cluster_sectors);

        if (ret < 0) {

            return -1;

        }

    }

    return 0;

}

static int get_whole_cluster(BlockDriverState *bs,

                VmdkExtent *extent,

                uint64_t cluster_offset,

                uint64_t offset,

                bool allocate)

{

    

    uint8_t  whole_grain[extent->cluster_sectors * 512];



    



    if (bs->backing_hd) {

        int ret;



        if (!vmdk_is_cid_valid(bs))

            return -1;



        

        offset -= offset % (extent->cluster_sectors * 512);

        ret = bdrv_read(bs->backing_hd, offset >> 9, whole_grain,

                extent->cluster_sectors);

        if (ret < 0) {

            return -1;

        }



        

        ret = bdrv_write(extent->file, cluster_offset, whole_grain,

                extent->cluster_sectors);

        if (ret < 0) {

            return -1;

        }

    }

    return 0;

}

static int FUNC_0(BlockDriverState *VAR_0,

                VmdkExtent *VAR_1,

                uint64_t VAR_2,

                uint64_t VAR_3,

                bool VAR_4)

{

    

    uint8_t  whole_grain[VAR_1->cluster_sectors * 512];



    



    if (VAR_0->backing_hd) {

        int VAR_5;



        if (!vmdk_is_cid_valid(VAR_0))

            return -1;



        

        VAR_3 -= VAR_3 % (VAR_1->cluster_sectors * 512);

        VAR_5 = bdrv_read(VAR_0->backing_hd, VAR_3 >> 9, whole_grain,

                VAR_1->cluster_sectors);

        if (VAR_5 < 0) {

            return -1;

        }



        

        VAR_5 = bdrv_write(VAR_1->file, VAR_2, whole_grain,

                VAR_1->cluster_sectors);

        if (VAR_5 < 0) {

            return -1;

        }

    }

    return 0;

}

static int FUNC_0(BlockDriverState *VAR_0,
VmdkExtent *VAR_1,
uint64_t VAR_2,
uint64_t VAR_3,
bool VAR_4)
{ uint8_t  whole_grain[VAR_1->cluster_sectors * 512]; if (VAR_0->backing_hd) { int VAR_5; if (!vmdk_is_cid_valid(VAR_0))
return -1; VAR_3 -= VAR_3 % (VAR_1->cluster_sectors * 512); VAR_5 = bdrv_read(VAR_0->backing_hd, VAR_3 >> 9, whole_grain,
VAR_1->cluster_sectors); if (VAR_5 < 0) { return -1; } VAR_5 = bdrv_write(VAR_1->file, VAR_2, whole_grain,
VAR_1->cluster_sectors); if (VAR_5 < 0) { return -1; } } return 0; }