]> git.ipfire.org Git - thirdparty/e2fsprogs.git/blob - lib/ext2fs/qcow2.h
e2image, libext2fs: check for corrupted qcow2 image
[thirdparty/e2fsprogs.git] / lib / ext2fs / qcow2.h
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