186835cedSPrasad Joshi #include "kvm/qcow.h" 286835cedSPrasad Joshi 386835cedSPrasad Joshi #include "kvm/disk-image.h" 486835cedSPrasad Joshi #include "kvm/read-write.h" 5c0799eb9SPekka Enberg #include "kvm/mutex.h" 686835cedSPrasad Joshi #include "kvm/util.h" 786835cedSPrasad Joshi 886835cedSPrasad Joshi #include <sys/types.h> 986835cedSPrasad Joshi #include <sys/stat.h> 1086835cedSPrasad Joshi #include <stdbool.h> 1186835cedSPrasad Joshi #include <stdlib.h> 1286835cedSPrasad Joshi #include <string.h> 1386835cedSPrasad Joshi #include <unistd.h> 1486835cedSPrasad Joshi #include <fcntl.h> 15*af68c51aSLan Tianyu #ifdef CONFIG_HAS_ZLIB 16*af68c51aSLan Tianyu #include <zlib.h> 17*af68c51aSLan Tianyu #endif 1886835cedSPrasad Joshi 1986835cedSPrasad Joshi #include <linux/byteorder.h> 20865c675fSPrasad Joshi #include <linux/kernel.h> 210df6b4d9SPekka Enberg #include <linux/types.h> 2286835cedSPrasad Joshi 23e94cdf08SPekka Enberg static int l2_table_insert(struct rb_root *root, struct qcow_l2_table *new) 243309045fSPrasad Joshi { 253309045fSPrasad Joshi struct rb_node **link = &(root->rb_node), *parent = NULL; 263309045fSPrasad Joshi u64 offset = new->offset; 273309045fSPrasad Joshi 283309045fSPrasad Joshi /* search the tree */ 293309045fSPrasad Joshi while (*link) { 30473d58ffSPekka Enberg struct qcow_l2_table *t; 313309045fSPrasad Joshi 32473d58ffSPekka Enberg t = rb_entry(*link, struct qcow_l2_table, node); 333309045fSPrasad Joshi if (!t) 343309045fSPrasad Joshi goto error; 353309045fSPrasad Joshi 363309045fSPrasad Joshi parent = *link; 373309045fSPrasad Joshi 383309045fSPrasad Joshi if (t->offset > offset) 393309045fSPrasad Joshi link = &(*link)->rb_left; 403309045fSPrasad Joshi else if (t->offset < offset) 413309045fSPrasad Joshi link = &(*link)->rb_right; 423309045fSPrasad Joshi else 433309045fSPrasad Joshi goto out; 443309045fSPrasad Joshi } 453309045fSPrasad Joshi 463309045fSPrasad Joshi /* add new node */ 473309045fSPrasad Joshi rb_link_node(&new->node, parent, link); 483309045fSPrasad Joshi rb_insert_color(&new->node, root); 493309045fSPrasad Joshi out: 503309045fSPrasad Joshi return 0; 513309045fSPrasad Joshi error: 523309045fSPrasad Joshi return -1; 533309045fSPrasad Joshi } 543309045fSPrasad Joshi 55e94cdf08SPekka Enberg static struct qcow_l2_table *l2_table_lookup(struct rb_root *root, u64 offset) 563309045fSPrasad Joshi { 573309045fSPrasad Joshi struct rb_node *link = root->rb_node; 583309045fSPrasad Joshi 593309045fSPrasad Joshi while (link) { 60473d58ffSPekka Enberg struct qcow_l2_table *t; 613309045fSPrasad Joshi 62473d58ffSPekka Enberg t = rb_entry(link, struct qcow_l2_table, node); 633309045fSPrasad Joshi if (!t) 643309045fSPrasad Joshi goto out; 653309045fSPrasad Joshi 663309045fSPrasad Joshi if (t->offset > offset) 673309045fSPrasad Joshi link = link->rb_left; 683309045fSPrasad Joshi else if (t->offset < offset) 693309045fSPrasad Joshi link = link->rb_right; 703309045fSPrasad Joshi else 713309045fSPrasad Joshi return t; 723309045fSPrasad Joshi } 733309045fSPrasad Joshi out: 743309045fSPrasad Joshi return NULL; 753309045fSPrasad Joshi } 763309045fSPrasad Joshi 77e94cdf08SPekka Enberg static void l1_table_free_cache(struct qcow_l1_table *l1t) 783309045fSPrasad Joshi { 797b4eb530SPekka Enberg struct rb_root *r = &l1t->root; 803309045fSPrasad Joshi struct list_head *pos, *n; 81473d58ffSPekka Enberg struct qcow_l2_table *t; 823309045fSPrasad Joshi 837b4eb530SPekka Enberg list_for_each_safe(pos, n, &l1t->lru_list) { 843309045fSPrasad Joshi /* Remove cache table from the list and RB tree */ 853309045fSPrasad Joshi list_del(pos); 86473d58ffSPekka Enberg t = list_entry(pos, struct qcow_l2_table, list); 873309045fSPrasad Joshi rb_erase(&t->node, r); 883309045fSPrasad Joshi 893309045fSPrasad Joshi /* Free the cached node */ 903309045fSPrasad Joshi free(t); 913309045fSPrasad Joshi } 923309045fSPrasad Joshi } 933309045fSPrasad Joshi 94a4e46515SPekka Enberg static int qcow_l2_cache_write(struct qcow *q, struct qcow_l2_table *c) 95a4e46515SPekka Enberg { 96a4e46515SPekka Enberg struct qcow_header *header = q->header; 97a4e46515SPekka Enberg u64 size; 98a4e46515SPekka Enberg 99aff88976SPekka Enberg if (!c->dirty) 100aff88976SPekka Enberg return 0; 101aff88976SPekka Enberg 102a4e46515SPekka Enberg size = 1 << header->l2_bits; 103a4e46515SPekka Enberg 104aff88976SPekka Enberg if (pwrite_in_full(q->fd, c->table, size * sizeof(u64), c->offset) < 0) 105aff88976SPekka Enberg return -1; 106aff88976SPekka Enberg 107aff88976SPekka Enberg c->dirty = 0; 108aff88976SPekka Enberg 109aff88976SPekka Enberg return 0; 110a4e46515SPekka Enberg } 111a4e46515SPekka Enberg 112473d58ffSPekka Enberg static int cache_table(struct qcow *q, struct qcow_l2_table *c) 1133309045fSPrasad Joshi { 1147b4eb530SPekka Enberg struct qcow_l1_table *l1t = &q->table; 1157b4eb530SPekka Enberg struct rb_root *r = &l1t->root; 116473d58ffSPekka Enberg struct qcow_l2_table *lru; 1173309045fSPrasad Joshi 1187b4eb530SPekka Enberg if (l1t->nr_cached == MAX_CACHE_NODES) { 1193309045fSPrasad Joshi /* 1203309045fSPrasad Joshi * The node at the head of the list is least recently used 1213309045fSPrasad Joshi * node. Remove it from the list and replaced with a new node. 1223309045fSPrasad Joshi */ 1237b4eb530SPekka Enberg lru = list_first_entry(&l1t->lru_list, struct qcow_l2_table, list); 1243309045fSPrasad Joshi 125a4e46515SPekka Enberg if (qcow_l2_cache_write(q, lru) < 0) 126a4e46515SPekka Enberg goto error; 127a4e46515SPekka Enberg 1283309045fSPrasad Joshi /* Remove the node from the cache */ 1293309045fSPrasad Joshi rb_erase(&lru->node, r); 1303309045fSPrasad Joshi list_del_init(&lru->list); 1317b4eb530SPekka Enberg l1t->nr_cached--; 1323309045fSPrasad Joshi 1333309045fSPrasad Joshi /* Free the LRUed node */ 1343309045fSPrasad Joshi free(lru); 1353309045fSPrasad Joshi } 1363309045fSPrasad Joshi 1373309045fSPrasad Joshi /* Add new node in RB Tree: Helps in searching faster */ 138e94cdf08SPekka Enberg if (l2_table_insert(r, c) < 0) 1393309045fSPrasad Joshi goto error; 1403309045fSPrasad Joshi 1413309045fSPrasad Joshi /* Add in LRU replacement list */ 1427b4eb530SPekka Enberg list_add_tail(&c->list, &l1t->lru_list); 1437b4eb530SPekka Enberg l1t->nr_cached++; 1443309045fSPrasad Joshi 1453309045fSPrasad Joshi return 0; 1463309045fSPrasad Joshi error: 1473309045fSPrasad Joshi return -1; 1483309045fSPrasad Joshi } 1493309045fSPrasad Joshi 150e94cdf08SPekka Enberg static struct qcow_l2_table *l2_table_search(struct qcow *q, u64 offset) 1513309045fSPrasad Joshi { 1527b4eb530SPekka Enberg struct qcow_l1_table *l1t = &q->table; 153fe8bdde0SPekka Enberg struct qcow_l2_table *l2t; 1543309045fSPrasad Joshi 155e94cdf08SPekka Enberg l2t = l2_table_lookup(&l1t->root, offset); 156fe8bdde0SPekka Enberg if (!l2t) 157fe8bdde0SPekka Enberg return NULL; 1583309045fSPrasad Joshi 1593309045fSPrasad Joshi /* Update the LRU state, by moving the searched node to list tail */ 1607b4eb530SPekka Enberg list_move_tail(&l2t->list, &l1t->lru_list); 1613309045fSPrasad Joshi 162fe8bdde0SPekka Enberg return l2t; 1633309045fSPrasad Joshi } 1643309045fSPrasad Joshi 1653309045fSPrasad Joshi /* Allocates a new node for caching L2 table */ 166473d58ffSPekka Enberg static struct qcow_l2_table *new_cache_table(struct qcow *q, u64 offset) 1673309045fSPrasad Joshi { 1683309045fSPrasad Joshi struct qcow_header *header = q->header; 169473d58ffSPekka Enberg struct qcow_l2_table *c; 1703309045fSPrasad Joshi u64 l2t_sz; 1713309045fSPrasad Joshi u64 size; 1723309045fSPrasad Joshi 1733309045fSPrasad Joshi l2t_sz = 1 << header->l2_bits; 1743309045fSPrasad Joshi size = sizeof(*c) + l2t_sz * sizeof(u64); 1753309045fSPrasad Joshi c = calloc(1, size); 1763309045fSPrasad Joshi if (!c) 1773309045fSPrasad Joshi goto out; 1783309045fSPrasad Joshi 1793309045fSPrasad Joshi c->offset = offset; 1803309045fSPrasad Joshi RB_CLEAR_NODE(&c->node); 1813309045fSPrasad Joshi INIT_LIST_HEAD(&c->list); 1823309045fSPrasad Joshi out: 1833309045fSPrasad Joshi return c; 1843309045fSPrasad Joshi } 1853309045fSPrasad Joshi 186742fce76SPrasad Joshi static inline u64 get_l1_index(struct qcow *q, u64 offset) 18786835cedSPrasad Joshi { 188ad627d62SPekka Enberg struct qcow_header *header = q->header; 18986835cedSPrasad Joshi 19086835cedSPrasad Joshi return offset >> (header->l2_bits + header->cluster_bits); 19186835cedSPrasad Joshi } 19286835cedSPrasad Joshi 193742fce76SPrasad Joshi static inline u64 get_l2_index(struct qcow *q, u64 offset) 19486835cedSPrasad Joshi { 195ad627d62SPekka Enberg struct qcow_header *header = q->header; 19686835cedSPrasad Joshi 19786835cedSPrasad Joshi return (offset >> (header->cluster_bits)) & ((1 << header->l2_bits)-1); 19886835cedSPrasad Joshi } 19986835cedSPrasad Joshi 200742fce76SPrasad Joshi static inline u64 get_cluster_offset(struct qcow *q, u64 offset) 20186835cedSPrasad Joshi { 202ad627d62SPekka Enberg struct qcow_header *header = q->header; 20386835cedSPrasad Joshi 20486835cedSPrasad Joshi return offset & ((1 << header->cluster_bits)-1); 20586835cedSPrasad Joshi } 20686835cedSPrasad Joshi 207fe8bdde0SPekka Enberg static struct qcow_l2_table *qcow_read_l2_table(struct qcow *q, u64 offset) 2083309045fSPrasad Joshi { 2093309045fSPrasad Joshi struct qcow_header *header = q->header; 210fe8bdde0SPekka Enberg struct qcow_l2_table *l2t; 2113309045fSPrasad Joshi u64 size; 2123309045fSPrasad Joshi 2133309045fSPrasad Joshi size = 1 << header->l2_bits; 2143309045fSPrasad Joshi 2153309045fSPrasad Joshi /* search an entry for offset in cache */ 216e94cdf08SPekka Enberg l2t = l2_table_search(q, offset); 217fe8bdde0SPekka Enberg if (l2t) 218fe8bdde0SPekka Enberg return l2t; 2193309045fSPrasad Joshi 2203309045fSPrasad Joshi /* allocate new node for caching l2 table */ 221fe8bdde0SPekka Enberg l2t = new_cache_table(q, offset); 222fe8bdde0SPekka Enberg if (!l2t) 2233309045fSPrasad Joshi goto error; 2243309045fSPrasad Joshi 2253309045fSPrasad Joshi /* table not cached: read from the disk */ 226fe8bdde0SPekka Enberg if (pread_in_full(q->fd, l2t->table, size * sizeof(u64), offset) < 0) 2273309045fSPrasad Joshi goto error; 2283309045fSPrasad Joshi 2293309045fSPrasad Joshi /* cache the table */ 230fe8bdde0SPekka Enberg if (cache_table(q, l2t) < 0) 2313309045fSPrasad Joshi goto error; 2323309045fSPrasad Joshi 233fe8bdde0SPekka Enberg return l2t; 2343309045fSPrasad Joshi error: 235fe8bdde0SPekka Enberg free(l2t); 236fe8bdde0SPekka Enberg return NULL; 2373309045fSPrasad Joshi } 2383309045fSPrasad Joshi 239*af68c51aSLan Tianyu static int qcow_decompress_buffer(u8 *out_buf, int out_buf_size, 240*af68c51aSLan Tianyu const u8 *buf, int buf_size) 241*af68c51aSLan Tianyu { 242*af68c51aSLan Tianyu #ifdef CONFIG_HAS_ZLIB 243*af68c51aSLan Tianyu z_stream strm1, *strm = &strm1; 244*af68c51aSLan Tianyu int ret, out_len; 245*af68c51aSLan Tianyu 246*af68c51aSLan Tianyu memset(strm, 0, sizeof(*strm)); 247*af68c51aSLan Tianyu 248*af68c51aSLan Tianyu strm->next_in = (u8 *)buf; 249*af68c51aSLan Tianyu strm->avail_in = buf_size; 250*af68c51aSLan Tianyu strm->next_out = out_buf; 251*af68c51aSLan Tianyu strm->avail_out = out_buf_size; 252*af68c51aSLan Tianyu 253*af68c51aSLan Tianyu ret = inflateInit2(strm, -12); 254*af68c51aSLan Tianyu if (ret != Z_OK) 255*af68c51aSLan Tianyu return -1; 256*af68c51aSLan Tianyu 257*af68c51aSLan Tianyu ret = inflate(strm, Z_FINISH); 258*af68c51aSLan Tianyu out_len = strm->next_out - out_buf; 259*af68c51aSLan Tianyu if ((ret != Z_STREAM_END && ret != Z_BUF_ERROR) || 260*af68c51aSLan Tianyu out_len != out_buf_size) { 261*af68c51aSLan Tianyu inflateEnd(strm); 262*af68c51aSLan Tianyu return -1; 263*af68c51aSLan Tianyu } 264*af68c51aSLan Tianyu 265*af68c51aSLan Tianyu inflateEnd(strm); 266*af68c51aSLan Tianyu return 0; 267*af68c51aSLan Tianyu #else 268*af68c51aSLan Tianyu return -1; 269*af68c51aSLan Tianyu #endif 270*af68c51aSLan Tianyu } 271*af68c51aSLan Tianyu 272*af68c51aSLan Tianyu static ssize_t qcow1_read_cluster(struct qcow *q, u64 offset, 273*af68c51aSLan Tianyu void *dst, u32 dst_len) 27486835cedSPrasad Joshi { 275ad627d62SPekka Enberg struct qcow_header *header = q->header; 2763fb67b93SPekka Enberg struct qcow_l1_table *l1t = &q->table; 2773fb67b93SPekka Enberg struct qcow_l2_table *l2t; 278742fce76SPrasad Joshi u64 clust_offset; 279742fce76SPrasad Joshi u64 clust_start; 2803fb67b93SPekka Enberg u64 l2t_offset; 281a51948ceSPekka Enberg size_t length; 2823fb67b93SPekka Enberg u64 l2t_size; 283742fce76SPrasad Joshi u64 l1_idx; 284742fce76SPrasad Joshi u64 l2_idx; 285*af68c51aSLan Tianyu int coffset; 286*af68c51aSLan Tianyu int csize; 28786835cedSPrasad Joshi 288c5e0624bSPrasad Joshi l1_idx = get_l1_index(q, offset); 2893fb67b93SPekka Enberg if (l1_idx >= l1t->table_size) 290c0799eb9SPekka Enberg return -1; 29186835cedSPrasad Joshi 2923dac48d4SPrasad Joshi clust_offset = get_cluster_offset(q, offset); 293*af68c51aSLan Tianyu if (clust_offset >= q->cluster_size) 294c0799eb9SPekka Enberg return -1; 2953dac48d4SPrasad Joshi 296*af68c51aSLan Tianyu length = q->cluster_size - clust_offset; 2973dac48d4SPrasad Joshi if (length > dst_len) 2983dac48d4SPrasad Joshi length = dst_len; 2993dac48d4SPrasad Joshi 300c0799eb9SPekka Enberg mutex_lock(&q->mutex); 301b2ebe61bSPekka Enberg 3023fb67b93SPekka Enberg l2t_offset = be64_to_cpu(l1t->l1_table[l1_idx]); 3033fb67b93SPekka Enberg if (!l2t_offset) 3043dac48d4SPrasad Joshi goto zero_cluster; 30586835cedSPrasad Joshi 3063fb67b93SPekka Enberg l2t_size = 1 << header->l2_bits; 30786835cedSPrasad Joshi 3083309045fSPrasad Joshi /* read and cache level 2 table */ 3093fb67b93SPekka Enberg l2t = qcow_read_l2_table(q, l2t_offset); 3103fb67b93SPekka Enberg if (!l2t) 311b6edb0ecSSasha Levin goto out_error; 31286835cedSPrasad Joshi 313c5e0624bSPrasad Joshi l2_idx = get_l2_index(q, offset); 3143fb67b93SPekka Enberg if (l2_idx >= l2t_size) 315b6edb0ecSSasha Levin goto out_error; 31686835cedSPrasad Joshi 3173fb67b93SPekka Enberg clust_start = be64_to_cpu(l2t->table[l2_idx]); 318*af68c51aSLan Tianyu if (clust_start & QCOW1_OFLAG_COMPRESSED) { 319*af68c51aSLan Tianyu coffset = clust_start & q->cluster_offset_mask; 320*af68c51aSLan Tianyu csize = clust_start >> (63 - q->header->cluster_bits); 321*af68c51aSLan Tianyu csize &= (q->cluster_size - 1); 322*af68c51aSLan Tianyu 323*af68c51aSLan Tianyu if (pread_in_full(q->fd, q->cluster_data, csize, 324*af68c51aSLan Tianyu coffset) < 0) { 325b2ebe61bSPekka Enberg goto out_error; 326b2ebe61bSPekka Enberg } 327b2ebe61bSPekka Enberg 328*af68c51aSLan Tianyu if (qcow_decompress_buffer(q->cluster_cache, q->cluster_size, 329*af68c51aSLan Tianyu q->cluster_data, csize) < 0) { 330*af68c51aSLan Tianyu goto out_error; 331*af68c51aSLan Tianyu } 332*af68c51aSLan Tianyu 333*af68c51aSLan Tianyu memcpy(dst, q->cluster_cache + clust_offset, length); 334*af68c51aSLan Tianyu mutex_unlock(&q->mutex); 335*af68c51aSLan Tianyu } else{ 33686835cedSPrasad Joshi if (!clust_start) 3373dac48d4SPrasad Joshi goto zero_cluster; 33886835cedSPrasad Joshi 339c0799eb9SPekka Enberg mutex_unlock(&q->mutex); 34086835cedSPrasad Joshi 341*af68c51aSLan Tianyu if (pread_in_full(q->fd, dst, length, 342*af68c51aSLan Tianyu clust_start + clust_offset) < 0) 343c0799eb9SPekka Enberg return -1; 344*af68c51aSLan Tianyu } 345c0799eb9SPekka Enberg 3463dac48d4SPrasad Joshi return length; 34786835cedSPrasad Joshi 348179b71f0SPekka Enberg zero_cluster: 349c0799eb9SPekka Enberg mutex_unlock(&q->mutex); 350179b71f0SPekka Enberg memset(dst, 0, length); 351c0799eb9SPekka Enberg return length; 352179b71f0SPekka Enberg 35386835cedSPrasad Joshi out_error: 354c0799eb9SPekka Enberg mutex_unlock(&q->mutex); 355179b71f0SPekka Enberg length = -1; 356c0799eb9SPekka Enberg return -1; 3573dac48d4SPrasad Joshi } 358b6edb0ecSSasha Levin 359*af68c51aSLan Tianyu static ssize_t qcow2_read_cluster(struct qcow *q, u64 offset, 360*af68c51aSLan Tianyu void *dst, u32 dst_len) 361*af68c51aSLan Tianyu { 362*af68c51aSLan Tianyu struct qcow_header *header = q->header; 363*af68c51aSLan Tianyu struct qcow_l1_table *l1t = &q->table; 364*af68c51aSLan Tianyu struct qcow_l2_table *l2t; 365*af68c51aSLan Tianyu u64 clust_offset; 366*af68c51aSLan Tianyu u64 clust_start; 367*af68c51aSLan Tianyu u64 l2t_offset; 368*af68c51aSLan Tianyu size_t length; 369*af68c51aSLan Tianyu u64 l2t_size; 370*af68c51aSLan Tianyu u64 l1_idx; 371*af68c51aSLan Tianyu u64 l2_idx; 372*af68c51aSLan Tianyu int coffset; 373*af68c51aSLan Tianyu int sector_offset; 374*af68c51aSLan Tianyu int nb_csectors; 375*af68c51aSLan Tianyu int csize; 376*af68c51aSLan Tianyu 377*af68c51aSLan Tianyu l1_idx = get_l1_index(q, offset); 378*af68c51aSLan Tianyu if (l1_idx >= l1t->table_size) 379*af68c51aSLan Tianyu return -1; 380*af68c51aSLan Tianyu 381*af68c51aSLan Tianyu clust_offset = get_cluster_offset(q, offset); 382*af68c51aSLan Tianyu if (clust_offset >= q->cluster_size) 383*af68c51aSLan Tianyu return -1; 384*af68c51aSLan Tianyu 385*af68c51aSLan Tianyu length = q->cluster_size - clust_offset; 386*af68c51aSLan Tianyu if (length > dst_len) 387*af68c51aSLan Tianyu length = dst_len; 388*af68c51aSLan Tianyu 389*af68c51aSLan Tianyu mutex_lock(&q->mutex); 390*af68c51aSLan Tianyu 391*af68c51aSLan Tianyu l2t_offset = be64_to_cpu(l1t->l1_table[l1_idx]); 392*af68c51aSLan Tianyu 393*af68c51aSLan Tianyu l2t_offset &= ~QCOW2_OFLAG_COPIED; 394*af68c51aSLan Tianyu if (!l2t_offset) 395*af68c51aSLan Tianyu goto zero_cluster; 396*af68c51aSLan Tianyu 397*af68c51aSLan Tianyu l2t_size = 1 << header->l2_bits; 398*af68c51aSLan Tianyu 399*af68c51aSLan Tianyu /* read and cache level 2 table */ 400*af68c51aSLan Tianyu l2t = qcow_read_l2_table(q, l2t_offset); 401*af68c51aSLan Tianyu if (!l2t) 402*af68c51aSLan Tianyu goto out_error; 403*af68c51aSLan Tianyu 404*af68c51aSLan Tianyu l2_idx = get_l2_index(q, offset); 405*af68c51aSLan Tianyu if (l2_idx >= l2t_size) 406*af68c51aSLan Tianyu goto out_error; 407*af68c51aSLan Tianyu 408*af68c51aSLan Tianyu clust_start = be64_to_cpu(l2t->table[l2_idx]); 409*af68c51aSLan Tianyu if (clust_start & QCOW2_OFLAG_COMPRESSED) { 410*af68c51aSLan Tianyu coffset = clust_start & q->cluster_offset_mask; 411*af68c51aSLan Tianyu nb_csectors = ((clust_start >> q->csize_shift) 412*af68c51aSLan Tianyu & q->csize_mask) + 1; 413*af68c51aSLan Tianyu sector_offset = coffset & (SECTOR_SIZE - 1); 414*af68c51aSLan Tianyu csize = nb_csectors * SECTOR_SIZE - sector_offset; 415*af68c51aSLan Tianyu 416*af68c51aSLan Tianyu if (pread_in_full(q->fd, q->cluster_data, 417*af68c51aSLan Tianyu nb_csectors * SECTOR_SIZE, 418*af68c51aSLan Tianyu coffset & ~(SECTOR_SIZE - 1)) < 0) { 419*af68c51aSLan Tianyu goto out_error; 420*af68c51aSLan Tianyu } 421*af68c51aSLan Tianyu 422*af68c51aSLan Tianyu if (qcow_decompress_buffer(q->cluster_cache, q->cluster_size, 423*af68c51aSLan Tianyu q->cluster_data + sector_offset, 424*af68c51aSLan Tianyu csize) < 0) { 425*af68c51aSLan Tianyu goto out_error; 426*af68c51aSLan Tianyu } 427*af68c51aSLan Tianyu 428*af68c51aSLan Tianyu memcpy(dst, q->cluster_cache + clust_offset, length); 429*af68c51aSLan Tianyu mutex_unlock(&q->mutex); 430*af68c51aSLan Tianyu } else{ 431*af68c51aSLan Tianyu clust_start &= QCOW2_OFFSET_MASK; 432*af68c51aSLan Tianyu if (!clust_start) 433*af68c51aSLan Tianyu goto zero_cluster; 434*af68c51aSLan Tianyu 435*af68c51aSLan Tianyu mutex_unlock(&q->mutex); 436*af68c51aSLan Tianyu 437*af68c51aSLan Tianyu if (pread_in_full(q->fd, dst, length, 438*af68c51aSLan Tianyu clust_start + clust_offset) < 0) 439*af68c51aSLan Tianyu return -1; 440*af68c51aSLan Tianyu } 441*af68c51aSLan Tianyu 442*af68c51aSLan Tianyu return length; 443*af68c51aSLan Tianyu 444*af68c51aSLan Tianyu zero_cluster: 445*af68c51aSLan Tianyu mutex_unlock(&q->mutex); 446*af68c51aSLan Tianyu memset(dst, 0, length); 447*af68c51aSLan Tianyu return length; 448*af68c51aSLan Tianyu 449*af68c51aSLan Tianyu out_error: 450*af68c51aSLan Tianyu mutex_unlock(&q->mutex); 451*af68c51aSLan Tianyu length = -1; 452*af68c51aSLan Tianyu return -1; 453*af68c51aSLan Tianyu } 454*af68c51aSLan Tianyu 455*af68c51aSLan Tianyu static ssize_t qcow_read_sector(struct disk_image *disk, u64 sector, 456*af68c51aSLan Tianyu void *dst, u32 dst_len) 4573dac48d4SPrasad Joshi { 45843835ac9SSasha Levin struct qcow *q = disk->priv; 459ad627d62SPekka Enberg struct qcow_header *header = q->header; 460d8eea993SPekka Enberg u32 nr_read; 4610df6b4d9SPekka Enberg u64 offset; 4620df6b4d9SPekka Enberg char *buf; 4633dac48d4SPrasad Joshi u32 nr; 4643dac48d4SPrasad Joshi 4650df6b4d9SPekka Enberg buf = dst; 466d8eea993SPekka Enberg nr_read = 0; 4670df6b4d9SPekka Enberg 468d8eea993SPekka Enberg while (nr_read < dst_len) { 4693dac48d4SPrasad Joshi offset = sector << SECTOR_SHIFT; 4703dac48d4SPrasad Joshi if (offset >= header->size) 4710df6b4d9SPekka Enberg return -1; 4723dac48d4SPrasad Joshi 473*af68c51aSLan Tianyu if (q->version == QCOW1_VERSION) 474*af68c51aSLan Tianyu nr = qcow1_read_cluster(q, offset, buf, 475*af68c51aSLan Tianyu dst_len - nr_read); 476*af68c51aSLan Tianyu else 477*af68c51aSLan Tianyu nr = qcow2_read_cluster(q, offset, buf, 478*af68c51aSLan Tianyu dst_len - nr_read); 479*af68c51aSLan Tianyu 480a51948ceSPekka Enberg if (nr <= 0) 4810df6b4d9SPekka Enberg return -1; 4823dac48d4SPrasad Joshi 483d8eea993SPekka Enberg nr_read += nr; 4843dac48d4SPrasad Joshi buf += nr; 4853dac48d4SPrasad Joshi sector += (nr >> SECTOR_SHIFT); 4863dac48d4SPrasad Joshi } 4870df6b4d9SPekka Enberg 48872133dd2SAsias He return dst_len; 48986835cedSPrasad Joshi } 49086835cedSPrasad Joshi 491865c675fSPrasad Joshi static inline u64 file_size(int fd) 492865c675fSPrasad Joshi { 493865c675fSPrasad Joshi struct stat st; 4940df6b4d9SPekka Enberg 495865c675fSPrasad Joshi if (fstat(fd, &st) < 0) 496865c675fSPrasad Joshi return 0; 4970df6b4d9SPekka Enberg 498865c675fSPrasad Joshi return st.st_size; 499865c675fSPrasad Joshi } 500865c675fSPrasad Joshi 5010df6b4d9SPekka Enberg static inline int qcow_pwrite_sync(int fd, void *buf, size_t count, off_t offset) 502865c675fSPrasad Joshi { 503865c675fSPrasad Joshi if (pwrite_in_full(fd, buf, count, offset) < 0) 504865c675fSPrasad Joshi return -1; 5050df6b4d9SPekka Enberg 5067d94a719SPekka Enberg return fdatasync(fd); 507865c675fSPrasad Joshi } 508865c675fSPrasad Joshi 509865c675fSPrasad Joshi /* Writes a level 2 table at the end of the file. */ 510b1c84095SPekka Enberg static u64 qcow_write_l2_table(struct qcow *q, u64 *table) 511865c675fSPrasad Joshi { 512865c675fSPrasad Joshi struct qcow_header *header = q->header; 513865c675fSPrasad Joshi u64 clust_sz; 514865c675fSPrasad Joshi u64 f_sz; 5150df6b4d9SPekka Enberg u64 off; 5160df6b4d9SPekka Enberg u64 sz; 517865c675fSPrasad Joshi 518865c675fSPrasad Joshi f_sz = file_size(q->fd); 519865c675fSPrasad Joshi if (!f_sz) 520865c675fSPrasad Joshi return 0; 521865c675fSPrasad Joshi 522865c675fSPrasad Joshi sz = 1 << header->l2_bits; 523865c675fSPrasad Joshi clust_sz = 1 << header->cluster_bits; 524865c675fSPrasad Joshi off = ALIGN(f_sz, clust_sz); 525865c675fSPrasad Joshi 5266fe151aeSPekka Enberg if (pwrite_in_full(q->fd, table, sz * sizeof(u64), off) < 0) 527865c675fSPrasad Joshi return 0; 5280df6b4d9SPekka Enberg 529865c675fSPrasad Joshi return off; 530865c675fSPrasad Joshi } 531865c675fSPrasad Joshi 5323ecac800SPekka Enberg static void refcount_table_free_cache(struct qcow_refcount_table *rft) 5333ecac800SPekka Enberg { 5343ecac800SPekka Enberg struct rb_root *r = &rft->root; 5353ecac800SPekka Enberg struct list_head *pos, *n; 5363ecac800SPekka Enberg struct qcow_refcount_block *t; 5373ecac800SPekka Enberg 5383ecac800SPekka Enberg list_for_each_safe(pos, n, &rft->lru_list) { 5393ecac800SPekka Enberg list_del(pos); 5403ecac800SPekka Enberg t = list_entry(pos, struct qcow_refcount_block, list); 5413ecac800SPekka Enberg rb_erase(&t->node, r); 5423ecac800SPekka Enberg 5433ecac800SPekka Enberg free(t); 5443ecac800SPekka Enberg } 5453ecac800SPekka Enberg } 5463ecac800SPekka Enberg 5473ecac800SPekka Enberg static int refcount_block_insert(struct rb_root *root, struct qcow_refcount_block *new) 5483ecac800SPekka Enberg { 5493ecac800SPekka Enberg struct rb_node **link = &(root->rb_node), *parent = NULL; 5503ecac800SPekka Enberg u64 offset = new->offset; 5513ecac800SPekka Enberg 5523ecac800SPekka Enberg /* search the tree */ 5533ecac800SPekka Enberg while (*link) { 5543ecac800SPekka Enberg struct qcow_refcount_block *t; 5553ecac800SPekka Enberg 5563ecac800SPekka Enberg t = rb_entry(*link, struct qcow_refcount_block, node); 5573ecac800SPekka Enberg if (!t) 5583ecac800SPekka Enberg goto error; 5593ecac800SPekka Enberg 5603ecac800SPekka Enberg parent = *link; 5613ecac800SPekka Enberg 5623ecac800SPekka Enberg if (t->offset > offset) 5633ecac800SPekka Enberg link = &(*link)->rb_left; 5643ecac800SPekka Enberg else if (t->offset < offset) 5653ecac800SPekka Enberg link = &(*link)->rb_right; 5663ecac800SPekka Enberg else 5673ecac800SPekka Enberg goto out; 5683ecac800SPekka Enberg } 5693ecac800SPekka Enberg 5703ecac800SPekka Enberg /* add new node */ 5713ecac800SPekka Enberg rb_link_node(&new->node, parent, link); 5723ecac800SPekka Enberg rb_insert_color(&new->node, root); 5733ecac800SPekka Enberg out: 5743ecac800SPekka Enberg return 0; 5753ecac800SPekka Enberg error: 5763ecac800SPekka Enberg return -1; 5773ecac800SPekka Enberg } 5783ecac800SPekka Enberg 5793ecac800SPekka Enberg static int write_refcount_block(struct qcow *q, struct qcow_refcount_block *rfb) 5803ecac800SPekka Enberg { 5813ecac800SPekka Enberg if (!rfb->dirty) 5823ecac800SPekka Enberg return 0; 5833ecac800SPekka Enberg 5843ecac800SPekka Enberg if (pwrite_in_full(q->fd, rfb->entries, rfb->size * sizeof(u16), rfb->offset) < 0) 5853ecac800SPekka Enberg return -1; 5863ecac800SPekka Enberg 5873ecac800SPekka Enberg rfb->dirty = 0; 5883ecac800SPekka Enberg 5893ecac800SPekka Enberg return 0; 5903ecac800SPekka Enberg } 5913ecac800SPekka Enberg 5923ecac800SPekka Enberg static int cache_refcount_block(struct qcow *q, struct qcow_refcount_block *c) 5933ecac800SPekka Enberg { 5943ecac800SPekka Enberg struct qcow_refcount_table *rft = &q->refcount_table; 5953ecac800SPekka Enberg struct rb_root *r = &rft->root; 5963ecac800SPekka Enberg struct qcow_refcount_block *lru; 5973ecac800SPekka Enberg 5983ecac800SPekka Enberg if (rft->nr_cached == MAX_CACHE_NODES) { 5993ecac800SPekka Enberg lru = list_first_entry(&rft->lru_list, struct qcow_refcount_block, list); 6003ecac800SPekka Enberg 6013ecac800SPekka Enberg if (write_refcount_block(q, lru) < 0) 6023ecac800SPekka Enberg goto error; 6033ecac800SPekka Enberg 6043ecac800SPekka Enberg rb_erase(&lru->node, r); 6053ecac800SPekka Enberg list_del_init(&lru->list); 6063ecac800SPekka Enberg rft->nr_cached--; 6073ecac800SPekka Enberg 6083ecac800SPekka Enberg free(lru); 6093ecac800SPekka Enberg } 6103ecac800SPekka Enberg 6113ecac800SPekka Enberg if (refcount_block_insert(r, c) < 0) 6123ecac800SPekka Enberg goto error; 6133ecac800SPekka Enberg 6143ecac800SPekka Enberg list_add_tail(&c->list, &rft->lru_list); 6153ecac800SPekka Enberg rft->nr_cached++; 6163ecac800SPekka Enberg 6173ecac800SPekka Enberg return 0; 6183ecac800SPekka Enberg error: 6193ecac800SPekka Enberg return -1; 6203ecac800SPekka Enberg } 6213ecac800SPekka Enberg 6223ecac800SPekka Enberg static struct qcow_refcount_block *new_refcount_block(struct qcow *q, u64 rfb_offset) 6233ecac800SPekka Enberg { 6243ecac800SPekka Enberg struct qcow_refcount_block *rfb; 6253ecac800SPekka Enberg 626*af68c51aSLan Tianyu rfb = malloc(sizeof *rfb + q->cluster_size); 6273ecac800SPekka Enberg if (!rfb) 6283ecac800SPekka Enberg return NULL; 6293ecac800SPekka Enberg 6303ecac800SPekka Enberg rfb->offset = rfb_offset; 631*af68c51aSLan Tianyu rfb->size = q->cluster_size / sizeof(u16); 6323ecac800SPekka Enberg RB_CLEAR_NODE(&rfb->node); 6333ecac800SPekka Enberg INIT_LIST_HEAD(&rfb->list); 6343ecac800SPekka Enberg 6353ecac800SPekka Enberg return rfb; 6363ecac800SPekka Enberg } 6373ecac800SPekka Enberg 6383ecac800SPekka Enberg static struct qcow_refcount_block *refcount_block_lookup(struct rb_root *root, u64 offset) 6393ecac800SPekka Enberg { 6403ecac800SPekka Enberg struct rb_node *link = root->rb_node; 6413ecac800SPekka Enberg 6423ecac800SPekka Enberg while (link) { 6433ecac800SPekka Enberg struct qcow_refcount_block *t; 6443ecac800SPekka Enberg 6453ecac800SPekka Enberg t = rb_entry(link, struct qcow_refcount_block, node); 6463ecac800SPekka Enberg if (!t) 6473ecac800SPekka Enberg goto out; 6483ecac800SPekka Enberg 6493ecac800SPekka Enberg if (t->offset > offset) 6503ecac800SPekka Enberg link = link->rb_left; 6513ecac800SPekka Enberg else if (t->offset < offset) 6523ecac800SPekka Enberg link = link->rb_right; 6533ecac800SPekka Enberg else 6543ecac800SPekka Enberg return t; 6553ecac800SPekka Enberg } 6563ecac800SPekka Enberg out: 6573ecac800SPekka Enberg return NULL; 6583ecac800SPekka Enberg } 6593ecac800SPekka Enberg 6603ecac800SPekka Enberg static struct qcow_refcount_block *refcount_block_search(struct qcow *q, u64 offset) 6613ecac800SPekka Enberg { 6623ecac800SPekka Enberg struct qcow_refcount_table *rft = &q->refcount_table; 6633ecac800SPekka Enberg struct qcow_refcount_block *rfb; 6643ecac800SPekka Enberg 6653ecac800SPekka Enberg rfb = refcount_block_lookup(&rft->root, offset); 6663ecac800SPekka Enberg if (!rfb) 6673ecac800SPekka Enberg return NULL; 6683ecac800SPekka Enberg 6693ecac800SPekka Enberg /* Update the LRU state, by moving the searched node to list tail */ 6703ecac800SPekka Enberg list_move_tail(&rfb->list, &rft->lru_list); 6713ecac800SPekka Enberg 6723ecac800SPekka Enberg return rfb; 6733ecac800SPekka Enberg } 6743ecac800SPekka Enberg 6753ecac800SPekka Enberg static struct qcow_refcount_block *qcow_read_refcount_block(struct qcow *q, u64 clust_idx) 6763ecac800SPekka Enberg { 6773ecac800SPekka Enberg struct qcow_header *header = q->header; 6783ecac800SPekka Enberg struct qcow_refcount_table *rft = &q->refcount_table; 6793ecac800SPekka Enberg struct qcow_refcount_block *rfb; 6803ecac800SPekka Enberg u64 rfb_offset; 6813ecac800SPekka Enberg u64 rft_idx; 6823ecac800SPekka Enberg 6833ecac800SPekka Enberg rft_idx = clust_idx >> (header->cluster_bits - QCOW_REFCOUNT_BLOCK_SHIFT); 6843ecac800SPekka Enberg if (rft_idx >= rft->rf_size) 6853ecac800SPekka Enberg return NULL; 6863ecac800SPekka Enberg 6873ecac800SPekka Enberg rfb_offset = be64_to_cpu(rft->rf_table[rft_idx]); 6883ecac800SPekka Enberg 6893ecac800SPekka Enberg rfb = refcount_block_search(q, rfb_offset); 6903ecac800SPekka Enberg if (rfb) 6913ecac800SPekka Enberg return rfb; 6923ecac800SPekka Enberg 6933ecac800SPekka Enberg rfb = new_refcount_block(q, rfb_offset); 6943ecac800SPekka Enberg if (!rfb) 6953ecac800SPekka Enberg return NULL; 6963ecac800SPekka Enberg 6973ecac800SPekka Enberg if (pread_in_full(q->fd, rfb->entries, rfb->size * sizeof(u16), rfb_offset) < 0) 6983ecac800SPekka Enberg goto error_free_rfb; 6993ecac800SPekka Enberg 7003ecac800SPekka Enberg if (cache_refcount_block(q, rfb) < 0) 7013ecac800SPekka Enberg goto error_free_rfb; 7023ecac800SPekka Enberg 7033ecac800SPekka Enberg return rfb; 7043ecac800SPekka Enberg 7053ecac800SPekka Enberg error_free_rfb: 7063ecac800SPekka Enberg free(rfb); 7073ecac800SPekka Enberg 7083ecac800SPekka Enberg return NULL; 7093ecac800SPekka Enberg } 7103ecac800SPekka Enberg 711865c675fSPrasad Joshi /* 712865c675fSPrasad Joshi * QCOW file might grow during a write operation. Not only data but metadata is 713865c675fSPrasad Joshi * also written at the end of the file. Therefore it is necessary to ensure 7140df6b4d9SPekka Enberg * every write is committed to disk. Hence we use uses qcow_pwrite_sync() to 715865c675fSPrasad Joshi * synchronize the in-core state of QCOW image to disk. 716865c675fSPrasad Joshi * 717865c675fSPrasad Joshi * We also try to restore the image to a consistent state if the metdata 718865c675fSPrasad Joshi * operation fails. The two metadat operations are: level 1 and level 2 table 719865c675fSPrasad Joshi * update. If either of them fails the image is truncated to a consistent state. 720865c675fSPrasad Joshi */ 721b1c84095SPekka Enberg static ssize_t qcow_write_cluster(struct qcow *q, u64 offset, void *buf, u32 src_len) 722865c675fSPrasad Joshi { 723865c675fSPrasad Joshi struct qcow_header *header = q->header; 7243fb67b93SPekka Enberg struct qcow_l1_table *l1t = &q->table; 725fe8bdde0SPekka Enberg struct qcow_l2_table *l2t; 7260df6b4d9SPekka Enberg u64 clust_start; 7273ecac800SPekka Enberg u64 clust_flags; 7283fb67b93SPekka Enberg u64 l2t_offset; 7290df6b4d9SPekka Enberg u64 clust_off; 7303fb67b93SPekka Enberg u64 l2t_size; 731865c675fSPrasad Joshi u64 clust_sz; 732865c675fSPrasad Joshi u64 l1t_idx; 733865c675fSPrasad Joshi u64 l2t_idx; 734865c675fSPrasad Joshi u64 f_sz; 7350df6b4d9SPekka Enberg u64 len; 736865c675fSPrasad Joshi 737fe8bdde0SPekka Enberg l2t = NULL; 7383fb67b93SPekka Enberg l2t_size = 1 << header->l2_bits; 739865c675fSPrasad Joshi clust_sz = 1 << header->cluster_bits; 740865c675fSPrasad Joshi 741865c675fSPrasad Joshi l1t_idx = get_l1_index(q, offset); 7423fb67b93SPekka Enberg if (l1t_idx >= l1t->table_size) 743c0799eb9SPekka Enberg return -1; 744865c675fSPrasad Joshi 745865c675fSPrasad Joshi l2t_idx = get_l2_index(q, offset); 7463fb67b93SPekka Enberg if (l2t_idx >= l2t_size) 747c0799eb9SPekka Enberg return -1; 748865c675fSPrasad Joshi 749865c675fSPrasad Joshi clust_off = get_cluster_offset(q, offset); 750865c675fSPrasad Joshi if (clust_off >= clust_sz) 751c0799eb9SPekka Enberg return -1; 752865c675fSPrasad Joshi 753865c675fSPrasad Joshi len = clust_sz - clust_off; 754865c675fSPrasad Joshi if (len > src_len) 755865c675fSPrasad Joshi len = src_len; 756865c675fSPrasad Joshi 757c0799eb9SPekka Enberg mutex_lock(&q->mutex); 758c0799eb9SPekka Enberg 7593fb67b93SPekka Enberg l2t_offset = be64_to_cpu(l1t->l1_table[l1t_idx]); 760*af68c51aSLan Tianyu if (l2t_offset & QCOW2_OFLAG_COMPRESSED) { 761121dd76eSPekka Enberg pr_warning("compressed clusters are not supported"); 762121dd76eSPekka Enberg goto error; 763121dd76eSPekka Enberg } 764*af68c51aSLan Tianyu if (!(l2t_offset & QCOW2_OFLAG_COPIED)) { 7653ecac800SPekka Enberg pr_warning("L2 copy-on-write clusters are not supported"); 766b2ebe61bSPekka Enberg goto error; 767b2ebe61bSPekka Enberg } 768b2ebe61bSPekka Enberg 769*af68c51aSLan Tianyu l2t_offset &= QCOW2_OFFSET_MASK; 7703fb67b93SPekka Enberg if (l2t_offset) { 7713309045fSPrasad Joshi /* read and cache l2 table */ 7723fb67b93SPekka Enberg l2t = qcow_read_l2_table(q, l2t_offset); 773fe8bdde0SPekka Enberg if (!l2t) 7743309045fSPrasad Joshi goto error; 775865c675fSPrasad Joshi } else { 7763fb67b93SPekka Enberg l2t = new_cache_table(q, l2t_offset); 777fe8bdde0SPekka Enberg if (!l2t) 7783309045fSPrasad Joshi goto error; 7793309045fSPrasad Joshi 7800df6b4d9SPekka Enberg /* Capture the state of the consistent QCOW image */ 781865c675fSPrasad Joshi f_sz = file_size(q->fd); 782865c675fSPrasad Joshi if (!f_sz) 7833309045fSPrasad Joshi goto free_cache; 784865c675fSPrasad Joshi 785865c675fSPrasad Joshi /* Write the l2 table of 0's at the end of the file */ 7863fb67b93SPekka Enberg l2t_offset = qcow_write_l2_table(q, l2t->table); 7873fb67b93SPekka Enberg if (!l2t_offset) 7883309045fSPrasad Joshi goto free_cache; 789865c675fSPrasad Joshi 790fe8bdde0SPekka Enberg if (cache_table(q, l2t) < 0) { 7913309045fSPrasad Joshi if (ftruncate(q->fd, f_sz) < 0) 7923309045fSPrasad Joshi goto free_cache; 7933309045fSPrasad Joshi 7943309045fSPrasad Joshi goto free_cache; 795865c675fSPrasad Joshi } 796865c675fSPrasad Joshi 7970df6b4d9SPekka Enberg /* Update the in-core entry */ 7983fb67b93SPekka Enberg l1t->l1_table[l1t_idx] = cpu_to_be64(l2t_offset); 799865c675fSPrasad Joshi } 800865c675fSPrasad Joshi 8010df6b4d9SPekka Enberg /* Capture the state of the consistent QCOW image */ 802865c675fSPrasad Joshi f_sz = file_size(q->fd); 803865c675fSPrasad Joshi if (!f_sz) 8043309045fSPrasad Joshi goto error; 805865c675fSPrasad Joshi 806b2ebe61bSPekka Enberg clust_start = be64_to_cpu(l2t->table[l2t_idx]); 8073ecac800SPekka Enberg 808*af68c51aSLan Tianyu clust_flags = clust_start & QCOW2_OFLAGS_MASK; 809*af68c51aSLan Tianyu if (clust_flags & QCOW2_OFLAG_COMPRESSED) { 810121dd76eSPekka Enberg pr_warning("compressed clusters are not supported"); 811121dd76eSPekka Enberg goto error; 812121dd76eSPekka Enberg } 813b2ebe61bSPekka Enberg 814*af68c51aSLan Tianyu clust_start &= QCOW2_OFFSET_MASK; 815865c675fSPrasad Joshi if (!clust_start) { 816865c675fSPrasad Joshi clust_start = ALIGN(f_sz, clust_sz); 817*af68c51aSLan Tianyu l2t->table[l2t_idx] = cpu_to_be64(clust_start | QCOW2_OFLAG_COPIED); 818aff88976SPekka Enberg l2t->dirty = 1; 819865c675fSPrasad Joshi } 8200df6b4d9SPekka Enberg 821*af68c51aSLan Tianyu if (!(clust_flags & QCOW2_OFLAG_COPIED)) { 8223ecac800SPekka Enberg struct qcow_refcount_block *rfb = NULL; 8233ecac800SPekka Enberg u16 clust_refcount; 8243ecac800SPekka Enberg u64 clust_idx; 8253ecac800SPekka Enberg u64 rfb_idx; 8263ecac800SPekka Enberg 827*af68c51aSLan Tianyu clust_idx = (clust_start & QCOW2_OFFSET_MASK) 828*af68c51aSLan Tianyu >> (header->cluster_bits); 8293ecac800SPekka Enberg 8303ecac800SPekka Enberg rfb = qcow_read_refcount_block(q, clust_idx); 8313ecac800SPekka Enberg if (!rfb) { 8323ecac800SPekka Enberg pr_warning("L1: error while reading refcount table"); 8333ecac800SPekka Enberg goto error; 8343ecac800SPekka Enberg } 8353ecac800SPekka Enberg 8363ecac800SPekka Enberg rfb_idx = clust_idx & (((1ULL << (header->cluster_bits - QCOW_REFCOUNT_BLOCK_SHIFT)) - 1)); 8373ecac800SPekka Enberg if (rfb_idx >= rfb->size) { 8383ecac800SPekka Enberg pr_warning("L1: refcount block index out of bounds"); 8393ecac800SPekka Enberg goto error; 8403ecac800SPekka Enberg } 8413ecac800SPekka Enberg 8423ecac800SPekka Enberg clust_refcount = be16_to_cpu(rfb->entries[rfb_idx]); 8433ecac800SPekka Enberg if (!clust_refcount) { 8443ecac800SPekka Enberg clust_refcount = 1; 8453ecac800SPekka Enberg rfb->entries[rfb_idx] = cpu_to_be16(clust_refcount); 8463ecac800SPekka Enberg rfb->dirty = 1; 8473ecac800SPekka Enberg } 8483ecac800SPekka Enberg 8493ecac800SPekka Enberg if (clust_refcount > 1) { 8503ecac800SPekka Enberg pr_warning("L1 copy-on-write clusters are not supported"); 8513ecac800SPekka Enberg goto error; 8523ecac800SPekka Enberg } 8533ecac800SPekka Enberg } 8543ecac800SPekka Enberg 855c0799eb9SPekka Enberg mutex_unlock(&q->mutex); 856c0799eb9SPekka Enberg 857a4e46515SPekka Enberg /* Write actual data */ 858a4e46515SPekka Enberg if (pwrite_in_full(q->fd, buf, len, clust_start + clust_off) < 0) 859a4e46515SPekka Enberg return -1; 860a4e46515SPekka Enberg 861865c675fSPrasad Joshi return len; 8623309045fSPrasad Joshi 8633309045fSPrasad Joshi free_cache: 864fe8bdde0SPekka Enberg free(l2t); 865865c675fSPrasad Joshi error: 866c0799eb9SPekka Enberg mutex_unlock(&q->mutex); 867865c675fSPrasad Joshi return -1; 868865c675fSPrasad Joshi } 869865c675fSPrasad Joshi 870b1c84095SPekka Enberg static ssize_t qcow_write_sector(struct disk_image *disk, u64 sector, void *src, u32 src_len) 87186835cedSPrasad Joshi { 872865c675fSPrasad Joshi struct qcow *q = disk->priv; 873865c675fSPrasad Joshi struct qcow_header *header = q->header; 874c4acb611SIngo Molnar u32 nr_written; 8750df6b4d9SPekka Enberg char *buf; 876865c675fSPrasad Joshi u64 offset; 877865c675fSPrasad Joshi ssize_t nr; 878865c675fSPrasad Joshi 8790df6b4d9SPekka Enberg buf = src; 8800df6b4d9SPekka Enberg nr_written = 0; 881865c675fSPrasad Joshi offset = sector << SECTOR_SHIFT; 8820df6b4d9SPekka Enberg 8830df6b4d9SPekka Enberg while (nr_written < src_len) { 884865c675fSPrasad Joshi if (offset >= header->size) 8850df6b4d9SPekka Enberg return -1; 886865c675fSPrasad Joshi 887b1c84095SPekka Enberg nr = qcow_write_cluster(q, offset, buf, src_len - nr_written); 888865c675fSPrasad Joshi if (nr < 0) 8890df6b4d9SPekka Enberg return -1; 890865c675fSPrasad Joshi 8910df6b4d9SPekka Enberg nr_written += nr; 892865c675fSPrasad Joshi buf += nr; 893865c675fSPrasad Joshi offset += nr; 894865c675fSPrasad Joshi } 8950df6b4d9SPekka Enberg 89672133dd2SAsias He return nr_written; 89786835cedSPrasad Joshi } 89886835cedSPrasad Joshi 899b1c84095SPekka Enberg static ssize_t qcow_nowrite_sector(struct disk_image *disk, u64 sector, void *src, u32 src_len) 900f10860caSPekka Enberg { 901f10860caSPekka Enberg /* I/O error */ 902b1c84095SPekka Enberg pr_info("%s: no write support\n", __func__); 903f10860caSPekka Enberg return -1; 904f10860caSPekka Enberg } 905f10860caSPekka Enberg 906659f4186SPekka Enberg static int qcow_disk_flush(struct disk_image *disk) 907659f4186SPekka Enberg { 90873984b11SPekka Enberg struct qcow *q = disk->priv; 9093ecac800SPekka Enberg struct qcow_refcount_table *rft; 91073984b11SPekka Enberg struct qcow_header *header; 911a4e46515SPekka Enberg struct list_head *pos, *n; 9127b4eb530SPekka Enberg struct qcow_l1_table *l1t; 91373984b11SPekka Enberg 91473984b11SPekka Enberg header = q->header; 9157b4eb530SPekka Enberg l1t = &q->table; 9163ecac800SPekka Enberg rft = &q->refcount_table; 91773984b11SPekka Enberg 918a4e46515SPekka Enberg mutex_lock(&q->mutex); 919a4e46515SPekka Enberg 9203ecac800SPekka Enberg list_for_each_safe(pos, n, &rft->lru_list) { 9213ecac800SPekka Enberg struct qcow_refcount_block *c = list_entry(pos, struct qcow_refcount_block, list); 9223ecac800SPekka Enberg 9233ecac800SPekka Enberg if (write_refcount_block(q, c) < 0) 9243ecac800SPekka Enberg goto error_unlock; 9253ecac800SPekka Enberg } 9263ecac800SPekka Enberg 9273ecac800SPekka Enberg if (fdatasync(disk->fd) < 0) 9283ecac800SPekka Enberg goto error_unlock; 9293ecac800SPekka Enberg 9307b4eb530SPekka Enberg list_for_each_safe(pos, n, &l1t->lru_list) { 931a4e46515SPekka Enberg struct qcow_l2_table *c = list_entry(pos, struct qcow_l2_table, list); 932a4e46515SPekka Enberg 933a4e46515SPekka Enberg if (qcow_l2_cache_write(q, c) < 0) 934a4e46515SPekka Enberg goto error_unlock; 935a4e46515SPekka Enberg } 936a4e46515SPekka Enberg 937a4e46515SPekka Enberg if (fdatasync(disk->fd) < 0) 938a4e46515SPekka Enberg goto error_unlock; 939a4e46515SPekka Enberg 9407b4eb530SPekka Enberg if (pwrite_in_full(disk->fd, l1t->l1_table, l1t->table_size * sizeof(u64), header->l1_table_offset) < 0) 941a4e46515SPekka Enberg goto error_unlock; 942a4e46515SPekka Enberg 943a4e46515SPekka Enberg mutex_unlock(&q->mutex); 94473984b11SPekka Enberg 945659f4186SPekka Enberg return fsync(disk->fd); 946a4e46515SPekka Enberg 947a4e46515SPekka Enberg error_unlock: 948a4e46515SPekka Enberg mutex_unlock(&q->mutex); 949a4e46515SPekka Enberg return -1; 950659f4186SPekka Enberg } 951659f4186SPekka Enberg 952b1c84095SPekka Enberg static int qcow_disk_close(struct disk_image *disk) 95386835cedSPrasad Joshi { 95486835cedSPrasad Joshi struct qcow *q; 95586835cedSPrasad Joshi 95643835ac9SSasha Levin if (!disk) 95772133dd2SAsias He return 0; 95886835cedSPrasad Joshi 95943835ac9SSasha Levin q = disk->priv; 96086835cedSPrasad Joshi 9613ecac800SPekka Enberg refcount_table_free_cache(&q->refcount_table); 962e94cdf08SPekka Enberg l1_table_free_cache(&q->table); 963*af68c51aSLan Tianyu free(q->cluster_data); 964*af68c51aSLan Tianyu free(q->cluster_cache); 9653ecac800SPekka Enberg free(q->refcount_table.rf_table); 9666c6f79b6SPrasad Joshi free(q->table.l1_table); 96786835cedSPrasad Joshi free(q->header); 96886835cedSPrasad Joshi free(q); 96972133dd2SAsias He 97072133dd2SAsias He return 0; 97186835cedSPrasad Joshi } 97286835cedSPrasad Joshi 973b1c84095SPekka Enberg static struct disk_image_operations qcow_disk_readonly_ops = { 974b1c84095SPekka Enberg .read_sector = qcow_read_sector, 975b1c84095SPekka Enberg .write_sector = qcow_nowrite_sector, 976b1c84095SPekka Enberg .close = qcow_disk_close, 977f10860caSPekka Enberg }; 978f10860caSPekka Enberg 979b1c84095SPekka Enberg static struct disk_image_operations qcow_disk_ops = { 980b1c84095SPekka Enberg .read_sector = qcow_read_sector, 981b1c84095SPekka Enberg .write_sector = qcow_write_sector, 982659f4186SPekka Enberg .flush = qcow_disk_flush, 983b1c84095SPekka Enberg .close = qcow_disk_close, 98486835cedSPrasad Joshi }; 98586835cedSPrasad Joshi 9863ecac800SPekka Enberg static int qcow_read_refcount_table(struct qcow *q) 9873ecac800SPekka Enberg { 9883ecac800SPekka Enberg struct qcow_header *header = q->header; 9893ecac800SPekka Enberg struct qcow_refcount_table *rft = &q->refcount_table; 9903ecac800SPekka Enberg 991*af68c51aSLan Tianyu rft->rf_size = (header->refcount_table_size * q->cluster_size) 992*af68c51aSLan Tianyu / sizeof(u64); 9933ecac800SPekka Enberg 9943ecac800SPekka Enberg rft->rf_table = calloc(rft->rf_size, sizeof(u64)); 9953ecac800SPekka Enberg if (!rft->rf_table) 9963ecac800SPekka Enberg return -1; 9973ecac800SPekka Enberg 9983ecac800SPekka Enberg rft->root = RB_ROOT; 9993ecac800SPekka Enberg INIT_LIST_HEAD(&rft->lru_list); 10003ecac800SPekka Enberg 10013ecac800SPekka Enberg return pread_in_full(q->fd, rft->rf_table, sizeof(u64) * rft->rf_size, header->refcount_table_offset); 10023ecac800SPekka Enberg } 10033ecac800SPekka Enberg 100486835cedSPrasad Joshi static int qcow_read_l1_table(struct qcow *q) 100586835cedSPrasad Joshi { 1006ad627d62SPekka Enberg struct qcow_header *header = q->header; 1007473aaa2dSPekka Enberg struct qcow_l1_table *table = &q->table; 100886835cedSPrasad Joshi 1009ad627d62SPekka Enberg table->table_size = header->l1_size; 101086835cedSPrasad Joshi 101100adcc1bSPrasad Joshi table->l1_table = calloc(table->table_size, sizeof(u64)); 101200adcc1bSPrasad Joshi if (!table->l1_table) 101386835cedSPrasad Joshi return -1; 101486835cedSPrasad Joshi 1015659f4186SPekka Enberg return pread_in_full(q->fd, table->l1_table, sizeof(u64) * table->table_size, header->l1_table_offset); 101686835cedSPrasad Joshi } 101786835cedSPrasad Joshi 1018ad627d62SPekka Enberg static void *qcow2_read_header(int fd) 101986835cedSPrasad Joshi { 1020ad627d62SPekka Enberg struct qcow2_header_disk f_header; 1021ad627d62SPekka Enberg struct qcow_header *header; 102286835cedSPrasad Joshi 1023ad627d62SPekka Enberg header = malloc(sizeof(struct qcow_header)); 102486835cedSPrasad Joshi if (!header) 102586835cedSPrasad Joshi return NULL; 102686835cedSPrasad Joshi 10270657f33dSPrasad Joshi if (pread_in_full(fd, &f_header, sizeof(struct qcow2_header_disk), 0) < 0) { 10280657f33dSPrasad Joshi free(header); 102986835cedSPrasad Joshi return NULL; 10300657f33dSPrasad Joshi } 103186835cedSPrasad Joshi 1032ad627d62SPekka Enberg be32_to_cpus(&f_header.magic); 1033ad627d62SPekka Enberg be32_to_cpus(&f_header.version); 1034ad627d62SPekka Enberg be64_to_cpus(&f_header.backing_file_offset); 1035ad627d62SPekka Enberg be32_to_cpus(&f_header.backing_file_size); 1036ad627d62SPekka Enberg be32_to_cpus(&f_header.cluster_bits); 1037ad627d62SPekka Enberg be64_to_cpus(&f_header.size); 1038ad627d62SPekka Enberg be32_to_cpus(&f_header.crypt_method); 1039ad627d62SPekka Enberg be32_to_cpus(&f_header.l1_size); 1040ad627d62SPekka Enberg be64_to_cpus(&f_header.l1_table_offset); 1041ad627d62SPekka Enberg be64_to_cpus(&f_header.refcount_table_offset); 1042ad627d62SPekka Enberg be32_to_cpus(&f_header.refcount_table_clusters); 1043ad627d62SPekka Enberg be32_to_cpus(&f_header.nb_snapshots); 1044ad627d62SPekka Enberg be64_to_cpus(&f_header.snapshots_offset); 1045ad627d62SPekka Enberg 1046ad627d62SPekka Enberg *header = (struct qcow_header) { 1047ad627d62SPekka Enberg .size = f_header.size, 1048ad627d62SPekka Enberg .l1_table_offset = f_header.l1_table_offset, 1049ad627d62SPekka Enberg .l1_size = f_header.l1_size, 1050ad627d62SPekka Enberg .cluster_bits = f_header.cluster_bits, 1051ad627d62SPekka Enberg .l2_bits = f_header.cluster_bits - 3, 10523ecac800SPekka Enberg .refcount_table_offset = f_header.refcount_table_offset, 10533ecac800SPekka Enberg .refcount_table_size = f_header.refcount_table_clusters, 1054ad627d62SPekka Enberg }; 1055ad627d62SPekka Enberg 1056ad627d62SPekka Enberg return header; 1057ad627d62SPekka Enberg } 1058ad627d62SPekka Enberg 1059f10860caSPekka Enberg static struct disk_image *qcow2_probe(int fd, bool readonly) 1060ad627d62SPekka Enberg { 1061ad627d62SPekka Enberg struct disk_image *disk_image; 10627b4eb530SPekka Enberg struct qcow_l1_table *l1t; 10637b4eb530SPekka Enberg struct qcow_header *h; 10647b4eb530SPekka Enberg struct qcow *q; 1065ad627d62SPekka Enberg 1066ad627d62SPekka Enberg q = calloc(1, sizeof(struct qcow)); 1067ad627d62SPekka Enberg if (!q) 1068*af68c51aSLan Tianyu return NULL; 1069ad627d62SPekka Enberg 1070c0799eb9SPekka Enberg mutex_init(&q->mutex); 1071ad627d62SPekka Enberg q->fd = fd; 10727b4eb530SPekka Enberg 10737b4eb530SPekka Enberg l1t = &q->table; 10747b4eb530SPekka Enberg 10757b4eb530SPekka Enberg l1t->root = RB_ROOT; 10767b4eb530SPekka Enberg INIT_LIST_HEAD(&l1t->lru_list); 1077ad627d62SPekka Enberg 1078ad627d62SPekka Enberg h = q->header = qcow2_read_header(fd); 1079ad627d62SPekka Enberg if (!h) 1080*af68c51aSLan Tianyu goto free_qcow; 1081*af68c51aSLan Tianyu 1082*af68c51aSLan Tianyu q->version = QCOW2_VERSION; 1083*af68c51aSLan Tianyu q->csize_shift = (62 - (q->header->cluster_bits - 8)); 1084*af68c51aSLan Tianyu q->csize_mask = (1 << (q->header->cluster_bits - 8)) - 1; 1085*af68c51aSLan Tianyu q->cluster_offset_mask = (1LL << q->csize_shift) - 1; 1086*af68c51aSLan Tianyu q->cluster_size = 1 << q->header->cluster_bits; 1087*af68c51aSLan Tianyu 1088*af68c51aSLan Tianyu q->cluster_data = malloc(q->cluster_size); 1089*af68c51aSLan Tianyu if (!q->cluster_data) { 1090*af68c51aSLan Tianyu pr_warning("cluster data malloc error!"); 1091*af68c51aSLan Tianyu goto free_header; 1092*af68c51aSLan Tianyu } 1093*af68c51aSLan Tianyu 1094*af68c51aSLan Tianyu q->cluster_cache = malloc(q->cluster_size); 1095*af68c51aSLan Tianyu if (!q->cluster_cache) { 1096*af68c51aSLan Tianyu pr_warning("cluster cache malloc error!"); 1097*af68c51aSLan Tianyu goto free_cluster_data; 1098*af68c51aSLan Tianyu } 1099ad627d62SPekka Enberg 1100ad627d62SPekka Enberg if (qcow_read_l1_table(q) < 0) 1101*af68c51aSLan Tianyu goto free_cluster_cache; 1102ad627d62SPekka Enberg 11033ecac800SPekka Enberg if (qcow_read_refcount_table(q) < 0) 1104*af68c51aSLan Tianyu goto free_l1_table; 11053ecac800SPekka Enberg 11067d22135fSAsias He /* 11077d22135fSAsias He * Do not use mmap use read/write instead 11087d22135fSAsias He */ 1109f10860caSPekka Enberg if (readonly) 1110b1c84095SPekka Enberg disk_image = disk_image__new(fd, h->size, &qcow_disk_readonly_ops, DISK_IMAGE_NOMMAP); 1111f10860caSPekka Enberg else 1112b1c84095SPekka Enberg disk_image = disk_image__new(fd, h->size, &qcow_disk_ops, DISK_IMAGE_NOMMAP); 1113f10860caSPekka Enberg 1114ad627d62SPekka Enberg if (!disk_image) 1115*af68c51aSLan Tianyu goto free_refcount_table; 1116ad627d62SPekka Enberg disk_image->priv = q; 1117ad627d62SPekka Enberg 1118ad627d62SPekka Enberg return disk_image; 1119ad627d62SPekka Enberg 1120*af68c51aSLan Tianyu free_refcount_table: 1121*af68c51aSLan Tianyu if (q->refcount_table.rf_table) 1122*af68c51aSLan Tianyu free(q->refcount_table.rf_table); 1123*af68c51aSLan Tianyu free_l1_table: 1124*af68c51aSLan Tianyu if (q->table.l1_table) 1125ad627d62SPekka Enberg free(q->table.l1_table); 1126*af68c51aSLan Tianyu free_cluster_cache: 1127*af68c51aSLan Tianyu if (q->cluster_cache) 1128*af68c51aSLan Tianyu free(q->cluster_cache); 1129*af68c51aSLan Tianyu free_cluster_data: 1130*af68c51aSLan Tianyu if (q->cluster_data) 1131*af68c51aSLan Tianyu free(q->cluster_data); 1132*af68c51aSLan Tianyu free_header: 1133*af68c51aSLan Tianyu if (q->header) 1134ad627d62SPekka Enberg free(q->header); 1135*af68c51aSLan Tianyu free_qcow: 1136*af68c51aSLan Tianyu if (q) 1137ad627d62SPekka Enberg free(q); 1138ad627d62SPekka Enberg 1139ad627d62SPekka Enberg return NULL; 1140ad627d62SPekka Enberg } 1141ad627d62SPekka Enberg 1142ad627d62SPekka Enberg static bool qcow2_check_image(int fd) 1143ad627d62SPekka Enberg { 1144ad627d62SPekka Enberg struct qcow2_header_disk f_header; 1145ad627d62SPekka Enberg 1146ad627d62SPekka Enberg if (pread_in_full(fd, &f_header, sizeof(struct qcow2_header_disk), 0) < 0) 1147ad627d62SPekka Enberg return false; 1148ad627d62SPekka Enberg 1149ad627d62SPekka Enberg be32_to_cpus(&f_header.magic); 1150ad627d62SPekka Enberg be32_to_cpus(&f_header.version); 1151ad627d62SPekka Enberg 1152ad627d62SPekka Enberg if (f_header.magic != QCOW_MAGIC) 1153ad627d62SPekka Enberg return false; 1154ad627d62SPekka Enberg 1155ad627d62SPekka Enberg if (f_header.version != QCOW2_VERSION) 1156ad627d62SPekka Enberg return false; 1157ad627d62SPekka Enberg 1158ad627d62SPekka Enberg return true; 1159ad627d62SPekka Enberg } 1160ad627d62SPekka Enberg 1161ad627d62SPekka Enberg static void *qcow1_read_header(int fd) 1162ad627d62SPekka Enberg { 1163ad627d62SPekka Enberg struct qcow1_header_disk f_header; 1164ad627d62SPekka Enberg struct qcow_header *header; 1165ad627d62SPekka Enberg 1166ad627d62SPekka Enberg header = malloc(sizeof(struct qcow_header)); 1167ad627d62SPekka Enberg if (!header) 1168ad627d62SPekka Enberg return NULL; 1169ad627d62SPekka Enberg 1170d39cefd2SSasha Levin if (pread_in_full(fd, &f_header, sizeof(struct qcow1_header_disk), 0) < 0) { 1171d39cefd2SSasha Levin free(header); 1172ad627d62SPekka Enberg return NULL; 1173d39cefd2SSasha Levin } 1174ad627d62SPekka Enberg 1175ad627d62SPekka Enberg be32_to_cpus(&f_header.magic); 1176ad627d62SPekka Enberg be32_to_cpus(&f_header.version); 1177ad627d62SPekka Enberg be64_to_cpus(&f_header.backing_file_offset); 1178ad627d62SPekka Enberg be32_to_cpus(&f_header.backing_file_size); 1179ad627d62SPekka Enberg be32_to_cpus(&f_header.mtime); 1180ad627d62SPekka Enberg be64_to_cpus(&f_header.size); 1181ad627d62SPekka Enberg be32_to_cpus(&f_header.crypt_method); 1182ad627d62SPekka Enberg be64_to_cpus(&f_header.l1_table_offset); 1183ad627d62SPekka Enberg 1184ad627d62SPekka Enberg *header = (struct qcow_header) { 1185ad627d62SPekka Enberg .size = f_header.size, 1186ad627d62SPekka Enberg .l1_table_offset = f_header.l1_table_offset, 1187ad627d62SPekka Enberg .l1_size = f_header.size / ((1 << f_header.l2_bits) * (1 << f_header.cluster_bits)), 1188ad627d62SPekka Enberg .cluster_bits = f_header.cluster_bits, 1189ad627d62SPekka Enberg .l2_bits = f_header.l2_bits, 1190ad627d62SPekka Enberg }; 119186835cedSPrasad Joshi 119286835cedSPrasad Joshi return header; 119386835cedSPrasad Joshi } 119486835cedSPrasad Joshi 1195f10860caSPekka Enberg static struct disk_image *qcow1_probe(int fd, bool readonly) 119686835cedSPrasad Joshi { 119786835cedSPrasad Joshi struct disk_image *disk_image; 11987b4eb530SPekka Enberg struct qcow_l1_table *l1t; 11997b4eb530SPekka Enberg struct qcow_header *h; 12007b4eb530SPekka Enberg struct qcow *q; 120186835cedSPrasad Joshi 120286835cedSPrasad Joshi q = calloc(1, sizeof(struct qcow)); 120386835cedSPrasad Joshi if (!q) 1204*af68c51aSLan Tianyu return NULL; 120586835cedSPrasad Joshi 1206c0799eb9SPekka Enberg mutex_init(&q->mutex); 120786835cedSPrasad Joshi q->fd = fd; 12087b4eb530SPekka Enberg 12097b4eb530SPekka Enberg l1t = &q->table; 12107b4eb530SPekka Enberg 12117b4eb530SPekka Enberg l1t->root = RB_ROOT; 12127b4eb530SPekka Enberg INIT_LIST_HEAD(&l1t->lru_list); 121386835cedSPrasad Joshi 121486835cedSPrasad Joshi h = q->header = qcow1_read_header(fd); 121586835cedSPrasad Joshi if (!h) 1216*af68c51aSLan Tianyu goto free_qcow; 1217*af68c51aSLan Tianyu 1218*af68c51aSLan Tianyu q->version = QCOW1_VERSION; 1219*af68c51aSLan Tianyu q->cluster_size = 1 << q->header->cluster_bits; 1220*af68c51aSLan Tianyu q->cluster_offset_mask = (1LL << (63 - q->header->cluster_bits)) - 1; 1221*af68c51aSLan Tianyu 1222*af68c51aSLan Tianyu q->cluster_data = malloc(q->cluster_size); 1223*af68c51aSLan Tianyu if (!q->cluster_data) { 1224*af68c51aSLan Tianyu pr_warning("cluster data malloc error!"); 1225*af68c51aSLan Tianyu goto free_header; 1226*af68c51aSLan Tianyu } 1227*af68c51aSLan Tianyu 1228*af68c51aSLan Tianyu q->cluster_cache = malloc(q->cluster_size); 1229*af68c51aSLan Tianyu if (!q->cluster_cache) { 1230*af68c51aSLan Tianyu pr_warning("cluster cache malloc error!"); 1231*af68c51aSLan Tianyu goto free_cluster_data; 1232*af68c51aSLan Tianyu } 123386835cedSPrasad Joshi 123486835cedSPrasad Joshi if (qcow_read_l1_table(q) < 0) 1235*af68c51aSLan Tianyu goto free_cluster_cache; 123686835cedSPrasad Joshi 12377d22135fSAsias He /* 12387d22135fSAsias He * Do not use mmap use read/write instead 12397d22135fSAsias He */ 1240f10860caSPekka Enberg if (readonly) 1241b1c84095SPekka Enberg disk_image = disk_image__new(fd, h->size, &qcow_disk_readonly_ops, DISK_IMAGE_NOMMAP); 1242f10860caSPekka Enberg else 1243b1c84095SPekka Enberg disk_image = disk_image__new(fd, h->size, &qcow_disk_ops, DISK_IMAGE_NOMMAP); 1244f10860caSPekka Enberg 124586835cedSPrasad Joshi if (!disk_image) 1246*af68c51aSLan Tianyu goto free_l1_table; 124786835cedSPrasad Joshi disk_image->priv = q; 124886835cedSPrasad Joshi 124986835cedSPrasad Joshi return disk_image; 125086835cedSPrasad Joshi 1251*af68c51aSLan Tianyu free_l1_table: 1252*af68c51aSLan Tianyu if (q->table.l1_table) 12536c6f79b6SPrasad Joshi free(q->table.l1_table); 1254*af68c51aSLan Tianyu free_cluster_cache: 1255*af68c51aSLan Tianyu if (q->cluster_cache) 1256*af68c51aSLan Tianyu free(q->cluster_cache); 1257*af68c51aSLan Tianyu free_cluster_data: 1258*af68c51aSLan Tianyu if (q->cluster_data) 1259*af68c51aSLan Tianyu free(q->cluster_data); 1260*af68c51aSLan Tianyu free_header: 1261*af68c51aSLan Tianyu if (q->header) 126286835cedSPrasad Joshi free(q->header); 1263*af68c51aSLan Tianyu free_qcow: 1264*af68c51aSLan Tianyu if (q) 126586835cedSPrasad Joshi free(q); 126686835cedSPrasad Joshi 126786835cedSPrasad Joshi return NULL; 126886835cedSPrasad Joshi } 126986835cedSPrasad Joshi 1270ad627d62SPekka Enberg static bool qcow1_check_image(int fd) 127186835cedSPrasad Joshi { 1272ad627d62SPekka Enberg struct qcow1_header_disk f_header; 127386835cedSPrasad Joshi 1274ad627d62SPekka Enberg if (pread_in_full(fd, &f_header, sizeof(struct qcow1_header_disk), 0) < 0) 1275ad627d62SPekka Enberg return false; 127686835cedSPrasad Joshi 1277ad627d62SPekka Enberg be32_to_cpus(&f_header.magic); 1278ad627d62SPekka Enberg be32_to_cpus(&f_header.version); 127986835cedSPrasad Joshi 1280ad627d62SPekka Enberg if (f_header.magic != QCOW_MAGIC) 1281ad627d62SPekka Enberg return false; 128286835cedSPrasad Joshi 1283ad627d62SPekka Enberg if (f_header.version != QCOW1_VERSION) 1284ad627d62SPekka Enberg return false; 128586835cedSPrasad Joshi 1286ad627d62SPekka Enberg return true; 128786835cedSPrasad Joshi } 128886835cedSPrasad Joshi 1289f10860caSPekka Enberg struct disk_image *qcow_probe(int fd, bool readonly) 129086835cedSPrasad Joshi { 1291ad627d62SPekka Enberg if (qcow1_check_image(fd)) 1292f10860caSPekka Enberg return qcow1_probe(fd, readonly); 1293ad627d62SPekka Enberg 1294ad627d62SPekka Enberg if (qcow2_check_image(fd)) 1295f10860caSPekka Enberg return qcow2_probe(fd, readonly); 1296ad627d62SPekka Enberg 1297ad627d62SPekka Enberg return NULL; 129886835cedSPrasad Joshi } 1299