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 (at) 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 39 struct ext2_qcow2_hdr { 40 __u32 magic; 41 __u32 version; 42 43 __u64 backing_file_offset; 44 __u32 backing_file_size; 45 46 __u32 cluster_bits; 47 __u64 size; 48 __u32 crypt_method; 49 50 __u32 l1_size; 51 __u64 l1_table_offset; 52 53 __u64 refcount_table_offset; 54 __u32 refcount_table_clusters; 55 56 __u32 nb_snapshots; 57 __u64 snapshots_offset; 58 }; 59 60 typedef struct ext2_qcow2_l2_table L2_CACHE_HEAD; 61 62 struct ext2_qcow2_l2_table { 63 __u32 l1_index; 64 __u64 offset; 65 __u64 *data; 66 L2_CACHE_HEAD *next; 67 }; 68 69 struct ext2_qcow2_l2_cache { 70 L2_CACHE_HEAD *used_head; 71 L2_CACHE_HEAD *used_tail; 72 L2_CACHE_HEAD *free_head; 73 __u32 free; 74 __u32 count; 75 __u64 next_offset; 76 }; 77 78 struct ext2_qcow2_refcount { 79 __u64 *refcount_table; 80 __u64 refcount_table_offset; 81 __u64 refcount_block_offset; 82 83 __u32 refcount_table_clusters; 84 __u32 refcount_table_index; 85 __u32 refcount_block_index; 86 87 __u16 *refcount_block; 88 }; 89 90 struct ext2_qcow2_image { 91 int fd; 92 struct ext2_qcow2_hdr *hdr; 93 struct ext2_qcow2_l2_cache *l2_cache; 94 struct ext2_qcow2_refcount refcount; 95 __u32 cluster_size; 96 __u32 cluster_bits; 97 __u32 l1_size; 98 __u32 l2_size; 99 100 __u64 *l1_table; 101 __u64 l2_offset; 102 __u64 l1_offset; 103 __u64 image_size; 104 }; 105 106 /* Function prototypes */ 107 108 /* qcow2.c */ 109 110 /* Functions for converting qcow2 image into raw image */ 111 struct ext2_qcow2_hdr *qcow2_read_header(int); 112 int qcow2_write_raw_image(int, int, struct ext2_qcow2_hdr *); 113 114