1 /* 2 * qcow2.h --- structures and function prototypes for qcow2.c to generate 3 * qcow2 formatted disk images. This format is used originally by QEMU 4 * for virtual machines, and stores the filesystem data on disk in a 5 * packed format to avoid creating sparse image files that need lots of 6 * seeking to read and write. 7 * 8 * The qcow2 format supports zlib compression, but that is not yet 9 * implemented. 10 * 11 * It is possible to directly mount a qcow2 image using qemu-nbd: 12 * 13 * [root]# modprobe nbd max_part=63 14 * [root]# qemu-nbd -c /dev/nbd0 image.img 15 * [root]# mount /dev/nbd0p1 /mnt/qemu 16 * 17 * Format details at http://people.gnome.org/~markmc/qcow-image-format.html 18 * 19 * Copyright (C) 2010 Red Hat, Inc., Lukas Czerner <lczerner@redhat.com> 20 * 21 * %Begin-Header% 22 * This file may be redistributed under the terms of the GNU Public 23 * License. 24 * %End-Header% 25 */ 26 27 /* Number of l2 tables in memory before writeback */ 28 #define L2_CACHE_PREALLOC 512 29 30 31 #define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb) 32 #define QCOW_VERSION 2 33 #define QCOW_OFLAG_COPIED (1LL << 63) 34 #define QCOW_OFLAG_COMPRESSED (1LL << 62) 35 36 #define QCOW_COMPRESSED 1 37 #define QCOW_ENCRYPTED 2 38 #define QCOW_CORRUPTED 3 39 40 struct ext2_qcow2_hdr { 41 __u32 magic; 42 __u32 version; 43 44 __u64 backing_file_offset; 45 __u32 backing_file_size; 46 47 __u32 cluster_bits; 48 __u64 size; 49 __u32 crypt_method; 50 51 __u32 l1_size; 52 __u64 l1_table_offset; 53 54 __u64 refcount_table_offset; 55 __u32 refcount_table_clusters; 56 57 __u32 nb_snapshots; 58 __u64 snapshots_offset; 59 }; 60 61 typedef struct ext2_qcow2_l2_table L2_CACHE_HEAD; 62 63 struct ext2_qcow2_l2_table { 64 __u32 l1_index; 65 __u64 offset; 66 __u64 *data; 67 L2_CACHE_HEAD *next; 68 }; 69 70 struct ext2_qcow2_l2_cache { 71 L2_CACHE_HEAD *used_head; 72 L2_CACHE_HEAD *used_tail; 73 L2_CACHE_HEAD *free_head; 74 __u32 free; 75 __u32 count; 76 __u64 next_offset; 77 }; 78 79 struct ext2_qcow2_refcount { 80 __u64 *refcount_table; 81 __u64 refcount_table_offset; 82 __u64 refcount_block_offset; 83 84 __u32 refcount_table_clusters; 85 __u32 refcount_table_index; 86 __u32 refcount_block_index; 87 88 __u16 *refcount_block; 89 }; 90 91 struct ext2_qcow2_image { 92 int fd; 93 struct ext2_qcow2_hdr *hdr; 94 struct ext2_qcow2_l2_cache *l2_cache; 95 struct ext2_qcow2_refcount refcount; 96 __u32 cluster_size; 97 __u32 cluster_bits; 98 __u32 l1_size; 99 __u32 l2_size; 100 101 __u64 *l1_table; 102 __u64 l2_offset; 103 __u64 l1_offset; 104 __u64 image_size; 105 }; 106 107 /* Function prototypes */ 108 109 /* qcow2.c */ 110 111 /* Functions for converting qcow2 image into raw image */ 112 struct ext2_qcow2_hdr *qcow2_read_header(int); 113 int qcow2_write_raw_image(int, int, struct ext2_qcow2_hdr *); 114 115