Lines Matching refs:extent
538 VmdkExtent *extent; in vmdk_add_extent() local
573 extent = &s->extents[s->num_extents]; in vmdk_add_extent()
576 memset(extent, 0, sizeof(VmdkExtent)); in vmdk_add_extent()
577 extent->file = file; in vmdk_add_extent()
578 extent->flat = flat; in vmdk_add_extent()
579 extent->sectors = sectors; in vmdk_add_extent()
580 extent->l1_table_offset = l1_offset; in vmdk_add_extent()
581 extent->l1_backup_table_offset = l1_backup_offset; in vmdk_add_extent()
582 extent->l1_size = l1_size; in vmdk_add_extent()
583 extent->l1_entry_sectors = l2_size * cluster_sectors; in vmdk_add_extent()
584 extent->l2_size = l2_size; in vmdk_add_extent()
585 extent->cluster_sectors = flat ? sectors : cluster_sectors; in vmdk_add_extent()
586 extent->next_cluster_sector = ROUND_UP(nb_sectors, cluster_sectors); in vmdk_add_extent()
587 extent->entry_size = sizeof(uint32_t); in vmdk_add_extent()
590 extent->end_sector = (*(extent - 1)).end_sector + extent->sectors; in vmdk_add_extent()
592 extent->end_sector = extent->sectors; in vmdk_add_extent()
594 bs->total_sectors = extent->end_sector; in vmdk_add_extent()
596 *new_extent = extent; in vmdk_add_extent()
602 vmdk_init_tables(BlockDriverState *bs, VmdkExtent *extent, Error **errp) in vmdk_init_tables() argument
609 l1_size = extent->l1_size * extent->entry_size; in vmdk_init_tables()
610 extent->l1_table = g_try_malloc(l1_size); in vmdk_init_tables()
611 if (l1_size && extent->l1_table == NULL) { in vmdk_init_tables()
615 ret = bdrv_pread(extent->file, extent->l1_table_offset, l1_size, in vmdk_init_tables()
616 extent->l1_table, 0); in vmdk_init_tables()
618 bdrv_refresh_filename(extent->file->bs); in vmdk_init_tables()
621 extent->file->bs->filename); in vmdk_init_tables()
624 for (i = 0; i < extent->l1_size; i++) { in vmdk_init_tables()
625 if (extent->entry_size == sizeof(uint64_t)) { in vmdk_init_tables()
626 le64_to_cpus((uint64_t *)extent->l1_table + i); in vmdk_init_tables()
628 assert(extent->entry_size == sizeof(uint32_t)); in vmdk_init_tables()
629 le32_to_cpus((uint32_t *)extent->l1_table + i); in vmdk_init_tables()
633 if (extent->l1_backup_table_offset) { in vmdk_init_tables()
634 assert(!extent->sesparse); in vmdk_init_tables()
635 extent->l1_backup_table = g_try_malloc(l1_size); in vmdk_init_tables()
636 if (l1_size && extent->l1_backup_table == NULL) { in vmdk_init_tables()
640 ret = bdrv_pread(extent->file, extent->l1_backup_table_offset, in vmdk_init_tables()
641 l1_size, extent->l1_backup_table, 0); in vmdk_init_tables()
643 bdrv_refresh_filename(extent->file->bs); in vmdk_init_tables()
646 extent->file->bs->filename); in vmdk_init_tables()
649 for (i = 0; i < extent->l1_size; i++) { in vmdk_init_tables()
650 le32_to_cpus(&extent->l1_backup_table[i]); in vmdk_init_tables()
654 extent->l2_cache = in vmdk_init_tables()
655 g_malloc(extent->entry_size * extent->l2_size * L2_CACHE_SIZE); in vmdk_init_tables()
658 g_free(extent->l1_backup_table); in vmdk_init_tables()
660 g_free(extent->l1_table); in vmdk_init_tables()
671 VmdkExtent *extent = NULL; in vmdk_open_vmfs_sparse() local
688 &extent, in vmdk_open_vmfs_sparse()
693 ret = vmdk_init_tables(bs, extent, errp); in vmdk_open_vmfs_sparse()
827 VmdkExtent *extent = NULL; in vmdk_open_se_sparse() local
879 &extent, in vmdk_open_se_sparse()
885 extent->sesparse = true; in vmdk_open_se_sparse()
886 extent->sesparse_l2_tables_offset = const_header.grain_tables_offset; in vmdk_open_se_sparse()
887 extent->sesparse_clusters_offset = const_header.grains_offset; in vmdk_open_se_sparse()
888 extent->entry_size = sizeof(uint64_t); in vmdk_open_se_sparse()
890 ret = vmdk_init_tables(bs, extent, errp); in vmdk_open_se_sparse()
944 VmdkExtent *extent = NULL; in vmdk_open_vmdk4() local
1068 &extent, in vmdk_open_vmdk4()
1073 extent->compressed = in vmdk_open_vmdk4()
1075 if (extent->compressed) { in vmdk_open_vmdk4()
1079 extent->has_marker = le32_to_cpu(header.flags) & VMDK4_FLAG_MARKER; in vmdk_open_vmdk4()
1080 extent->version = le32_to_cpu(header.version); in vmdk_open_vmdk4()
1081 extent->has_zero_grain = le32_to_cpu(header.flags) & VMDK4_FLAG_ZERO_GRAIN; in vmdk_open_vmdk4()
1082 ret = vmdk_init_tables(bs, extent, errp); in vmdk_open_vmdk4()
1165 VmdkExtent *extent = NULL; in vmdk_parse_extents() local
1249 0, 0, 0, 0, 0, &extent, errp); in vmdk_parse_extents()
1260 extent->flat_start_offset = flat_offset << 9; in vmdk_parse_extents()
1281 extent = &s->extents[s->num_extents - 1]; in vmdk_parse_extents()
1294 extent = &s->extents[s->num_extents - 1]; in vmdk_parse_extents()
1307 extent->type = g_strdup(type); in vmdk_parse_extents()
1462 get_whole_cluster(BlockDriverState *bs, VmdkExtent *extent, in get_whole_cluster() argument
1473 cluster_bytes = extent->cluster_sectors << BDRV_SECTOR_BITS; in get_whole_cluster()
1495 BLKDBG_CO_EVENT(extent->file, BLKDBG_COW_READ); in get_whole_cluster()
1503 BLKDBG_CO_EVENT(extent->file, BLKDBG_COW_WRITE); in get_whole_cluster()
1504 ret = bdrv_co_pwrite(extent->file, cluster_offset, skip_start_bytes, in get_whole_cluster()
1515 BLKDBG_CO_EVENT(extent->file, BLKDBG_COW_READ); in get_whole_cluster()
1524 BLKDBG_CO_EVENT(extent->file, BLKDBG_COW_WRITE); in get_whole_cluster()
1525 ret = bdrv_co_pwrite(extent->file, cluster_offset + skip_end_bytes, in get_whole_cluster()
1541 vmdk_L2update(VmdkExtent *extent, VmdkMetaData *m_data, uint32_t offset) in vmdk_L2update() argument
1545 BLKDBG_CO_EVENT(extent->file, BLKDBG_L2_UPDATE); in vmdk_L2update()
1546 if (bdrv_co_pwrite(extent->file, in vmdk_L2update()
1553 if (extent->l1_backup_table_offset != 0) { in vmdk_L2update()
1554 m_data->l2_offset = extent->l1_backup_table[m_data->l1_index]; in vmdk_L2update()
1555 if (bdrv_co_pwrite(extent->file, in vmdk_L2update()
1562 if (bdrv_co_flush(extent->file->bs) < 0) { in vmdk_L2update()
1593 get_cluster_offset(BlockDriverState *bs, VmdkExtent *extent, in get_cluster_offset() argument
1605 unsigned int l2_size_bytes = extent->l2_size * extent->entry_size; in get_cluster_offset()
1610 if (extent->flat) { in get_cluster_offset()
1611 *cluster_offset = extent->flat_start_offset; in get_cluster_offset()
1615 offset -= (extent->end_sector - extent->sectors) * SECTOR_SIZE; in get_cluster_offset()
1616 l1_index = (offset >> 9) / extent->l1_entry_sectors; in get_cluster_offset()
1617 if (l1_index >= extent->l1_size) { in get_cluster_offset()
1620 if (extent->sesparse) { in get_cluster_offset()
1623 assert(extent->entry_size == sizeof(uint64_t)); in get_cluster_offset()
1625 l2_offset_u64 = ((uint64_t *)extent->l1_table)[l1_index]; in get_cluster_offset()
1639 l2_offset_u64 = extent->sesparse_l2_tables_offset + in get_cluster_offset()
1647 assert(extent->entry_size == sizeof(uint32_t)); in get_cluster_offset()
1648 l2_offset = ((uint32_t *)extent->l1_table)[l1_index]; in get_cluster_offset()
1654 if (l2_offset == extent->l2_cache_offsets[i]) { in get_cluster_offset()
1656 if (++extent->l2_cache_counts[i] == 0xffffffff) { in get_cluster_offset()
1658 extent->l2_cache_counts[j] >>= 1; in get_cluster_offset()
1661 l2_table = (char *)extent->l2_cache + (i * l2_size_bytes); in get_cluster_offset()
1669 if (extent->l2_cache_counts[i] < min_count) { in get_cluster_offset()
1670 min_count = extent->l2_cache_counts[i]; in get_cluster_offset()
1674 l2_table = (char *)extent->l2_cache + (min_index * l2_size_bytes); in get_cluster_offset()
1675 BLKDBG_CO_EVENT(extent->file, BLKDBG_L2_LOAD); in get_cluster_offset()
1676 if (bdrv_co_pread(extent->file, in get_cluster_offset()
1684 extent->l2_cache_offsets[min_index] = l2_offset; in get_cluster_offset()
1685 extent->l2_cache_counts[min_index] = 1; in get_cluster_offset()
1687 l2_index = ((offset >> 9) / extent->cluster_sectors) % extent->l2_size; in get_cluster_offset()
1695 if (extent->sesparse) { in get_cluster_offset()
1714 cluster_sector = extent->sesparse_clusters_offset + in get_cluster_offset()
1715 cluster_sector * extent->cluster_sectors; in get_cluster_offset()
1723 if (extent->has_zero_grain && cluster_sector == VMDK_GTE_ZEROED) { in get_cluster_offset()
1732 assert(!extent->sesparse); in get_cluster_offset()
1734 if (extent->next_cluster_sector >= VMDK_EXTENT_MAX_SECTORS) { in get_cluster_offset()
1738 cluster_sector = extent->next_cluster_sector; in get_cluster_offset()
1739 extent->next_cluster_sector += extent->cluster_sectors; in get_cluster_offset()
1746 ret = get_whole_cluster(bs, extent, cluster_sector * BDRV_SECTOR_SIZE, in get_cluster_offset()
1763 VmdkExtent *extent = start_hint; in find_extent() local
1765 if (!extent) { in find_extent()
1766 extent = &s->extents[0]; in find_extent()
1768 while (extent < &s->extents[s->num_extents]) { in find_extent()
1769 if (sector_num < extent->end_sector) { in find_extent()
1770 return extent; in find_extent()
1772 extent++; in find_extent()
1777 static inline uint64_t vmdk_find_offset_in_cluster(VmdkExtent *extent, in vmdk_find_offset_in_cluster() argument
1781 uint64_t cluster_size = extent->cluster_sectors * BDRV_SECTOR_SIZE; in vmdk_find_offset_in_cluster()
1784 (extent->end_sector - extent->sectors) * BDRV_SECTOR_SIZE; in vmdk_find_offset_in_cluster()
1797 VmdkExtent *extent; in vmdk_co_block_status() local
1799 extent = find_extent(s, offset >> BDRV_SECTOR_BITS, NULL); in vmdk_co_block_status()
1800 if (!extent) { in vmdk_co_block_status()
1804 ret = get_cluster_offset(bs, extent, NULL, offset, false, &cluster_offset, in vmdk_co_block_status()
1808 index_in_cluster = vmdk_find_offset_in_cluster(extent, offset); in vmdk_co_block_status()
1821 if (!extent->compressed) { in vmdk_co_block_status()
1824 if (extent->flat) { in vmdk_co_block_status()
1830 *file = extent->file->bs; in vmdk_co_block_status()
1834 n = extent->cluster_sectors * BDRV_SECTOR_SIZE - index_in_cluster; in vmdk_co_block_status()
1840 vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset, in vmdk_write_extent() argument
1852 if (extent->compressed) { in vmdk_write_extent()
1857 n_bytes > (extent->cluster_sectors * SECTOR_SIZE) || in vmdk_write_extent()
1858 (n_bytes < (extent->cluster_sectors * SECTOR_SIZE) && in vmdk_write_extent()
1859 offset + n_bytes != extent->end_sector * SECTOR_SIZE)) in vmdk_write_extent()
1865 if (!extent->has_marker) { in vmdk_write_extent()
1869 buf_len = (extent->cluster_sectors << 9) * 2; in vmdk_write_extent()
1888 BLKDBG_CO_EVENT(extent->file, BLKDBG_WRITE_COMPRESSED); in vmdk_write_extent()
1893 BLKDBG_CO_EVENT(extent->file, BLKDBG_WRITE_AIO); in vmdk_write_extent()
1897 ret = bdrv_co_pwritev(extent->file, write_offset, n_bytes, in vmdk_write_extent()
1902 if (extent->compressed) { in vmdk_write_extent()
1903 extent->next_cluster_sector = write_end_sector; in vmdk_write_extent()
1905 extent->next_cluster_sector = MAX(extent->next_cluster_sector, in vmdk_write_extent()
1915 if (!extent->compressed) { in vmdk_write_extent()
1922 vmdk_read_extent(VmdkExtent *extent, int64_t cluster_offset, in vmdk_read_extent() argument
1934 if (!extent->compressed) { in vmdk_read_extent()
1935 BLKDBG_CO_EVENT(extent->file, BLKDBG_READ_AIO); in vmdk_read_extent()
1936 ret = bdrv_co_preadv(extent->file, in vmdk_read_extent()
1944 cluster_bytes = extent->cluster_sectors * 512; in vmdk_read_extent()
1949 BLKDBG_CO_EVENT(extent->file, BLKDBG_READ_COMPRESSED); in vmdk_read_extent()
1950 ret = bdrv_co_pread(extent->file, cluster_offset, buf_bytes, cluster_buf, in vmdk_read_extent()
1958 if (extent->has_marker) { in vmdk_read_extent()
1994 VmdkExtent *extent = NULL; in vmdk_co_preadv() local
2003 extent = find_extent(s, offset >> BDRV_SECTOR_BITS, extent); in vmdk_co_preadv()
2004 if (!extent) { in vmdk_co_preadv()
2008 ret = get_cluster_offset(bs, extent, NULL, in vmdk_co_preadv()
2010 offset_in_cluster = vmdk_find_offset_in_cluster(extent, offset); in vmdk_co_preadv()
2012 n_bytes = MIN(bytes, extent->cluster_sectors * BDRV_SECTOR_SIZE in vmdk_co_preadv()
2040 ret = vmdk_read_extent(extent, cluster_offset, offset_in_cluster, in vmdk_co_preadv()
2074 VmdkExtent *extent = NULL; in vmdk_pwritev() local
2089 extent = find_extent(s, offset >> BDRV_SECTOR_BITS, extent); in vmdk_pwritev()
2090 if (!extent) { in vmdk_pwritev()
2093 if (extent->sesparse) { in vmdk_pwritev()
2096 offset_in_cluster = vmdk_find_offset_in_cluster(extent, offset); in vmdk_pwritev()
2097 n_bytes = MIN(bytes, extent->cluster_sectors * BDRV_SECTOR_SIZE in vmdk_pwritev()
2100 ret = get_cluster_offset(bs, extent, &m_data, offset, in vmdk_pwritev()
2101 !(extent->compressed || zeroed), in vmdk_pwritev()
2104 if (extent->compressed) { in vmdk_pwritev()
2112 ret = get_cluster_offset(bs, extent, &m_data, offset, in vmdk_pwritev()
2121 if (extent->has_zero_grain && in vmdk_pwritev()
2123 n_bytes >= extent->cluster_sectors * BDRV_SECTOR_SIZE) { in vmdk_pwritev()
2124 n_bytes = extent->cluster_sectors * BDRV_SECTOR_SIZE; in vmdk_pwritev()
2127 if (vmdk_L2update(extent, &m_data, VMDK_GTE_ZEROED) in vmdk_pwritev()
2136 ret = vmdk_write_extent(extent, cluster_offset, offset_in_cluster, in vmdk_pwritev()
2143 if (vmdk_L2update(extent, &m_data, in vmdk_pwritev()
2947 static VmdkExtentInfo * GRAPH_RDLOCK vmdk_get_extent_info(VmdkExtent *extent) in vmdk_get_extent_info() argument
2951 bdrv_refresh_filename(extent->file->bs); in vmdk_get_extent_info()
2953 .filename = g_strdup(extent->file->bs->filename), in vmdk_get_extent_info()
2954 .format = g_strdup(extent->type), in vmdk_get_extent_info()
2955 .virtual_size = extent->sectors * BDRV_SECTOR_SIZE, in vmdk_get_extent_info()
2956 .compressed = extent->compressed, in vmdk_get_extent_info()
2957 .has_compressed = extent->compressed, in vmdk_get_extent_info()
2958 .cluster_size = extent->cluster_sectors * BDRV_SECTOR_SIZE, in vmdk_get_extent_info()
2959 .has_cluster_size = !extent->flat, in vmdk_get_extent_info()
2969 VmdkExtent *extent = NULL; in vmdk_co_check() local
2983 extent = find_extent(s, sector_num, extent); in vmdk_co_check()
2984 if (!extent) { in vmdk_co_check()
2991 ret = get_cluster_offset(bs, extent, NULL, in vmdk_co_check()
3001 int64_t extent_len = bdrv_co_getlength(extent->file->bs); in vmdk_co_check()
3017 sector_num += extent->cluster_sectors; in vmdk_co_check()