115 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * qcow2.h --- structures and function prototypes for qcow2.c to generate
 | |
|  * qcow2 formatted disk images.  This format is used originally by QEMU
 | |
|  * for virtual machines, and stores the filesystem data on disk in a
 | |
|  * packed format to avoid creating sparse image files that need lots of
 | |
|  * seeking to read and write.
 | |
|  *
 | |
|  * The qcow2 format supports zlib compression, but that is not yet
 | |
|  * implemented.
 | |
|  *
 | |
|  * It is possible to directly mount a qcow2 image using qemu-nbd:
 | |
|  *
 | |
|  * [root]# modprobe nbd max_part=63
 | |
|  * [root]# qemu-nbd -c /dev/nbd0 image.img
 | |
|  * [root]# mount /dev/nbd0p1 /mnt/qemu
 | |
|  *
 | |
|  * Format details at http://people.gnome.org/~markmc/qcow-image-format.html
 | |
|  *
 | |
|  * Copyright (C) 2010 Red Hat, Inc., Lukas Czerner <lczerner@redhat.com>
 | |
|  *
 | |
|  * %Begin-Header%
 | |
|  * This file may be redistributed under the terms of the GNU Public
 | |
|  * License.
 | |
|  * %End-Header%
 | |
|  */
 | |
| 
 | |
| /* Number of l2 tables in memory before writeback */
 | |
| #define L2_CACHE_PREALLOC	512
 | |
| 
 | |
| 
 | |
| #define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb)
 | |
| #define QCOW_VERSION		2
 | |
| #define QCOW_OFLAG_COPIED	(1ULL << 63)
 | |
| #define QCOW_OFLAG_COMPRESSED	(1ULL << 62)
 | |
| 
 | |
| #define QCOW_COMPRESSED		1
 | |
| #define QCOW_ENCRYPTED		2
 | |
| #define QCOW_CORRUPTED		3
 | |
| 
 | |
| struct ext2_qcow2_hdr {
 | |
| 	__u32	magic;
 | |
| 	__u32	version;
 | |
| 
 | |
| 	__u64	backing_file_offset;
 | |
| 	__u32	backing_file_size;
 | |
| 
 | |
| 	__u32	cluster_bits;
 | |
| 	__u64	size;
 | |
| 	__u32	crypt_method;
 | |
| 
 | |
| 	__u32	l1_size;
 | |
| 	__u64	l1_table_offset;
 | |
| 
 | |
| 	__u64	refcount_table_offset;
 | |
| 	__u32	refcount_table_clusters;
 | |
| 
 | |
| 	__u32	nb_snapshots;
 | |
| 	__u64	snapshots_offset;
 | |
| };
 | |
| 
 | |
| typedef struct ext2_qcow2_l2_table L2_CACHE_HEAD;
 | |
| 
 | |
| struct ext2_qcow2_l2_table {
 | |
| 	__u32		l1_index;
 | |
| 	__u64		offset;
 | |
| 	__u64		*data;
 | |
| 	L2_CACHE_HEAD	*next;
 | |
| };
 | |
| 
 | |
| struct ext2_qcow2_l2_cache {
 | |
| 	L2_CACHE_HEAD	*used_head;
 | |
| 	L2_CACHE_HEAD	*used_tail;
 | |
| 	L2_CACHE_HEAD	*free_head;
 | |
| 	__u32		free;
 | |
| 	__u32		count;
 | |
| 	__u64		next_offset;
 | |
| };
 | |
| 
 | |
| struct ext2_qcow2_refcount {
 | |
| 	__u64	*refcount_table;
 | |
| 	__u64	refcount_table_offset;
 | |
| 	__u64	refcount_block_offset;
 | |
| 
 | |
| 	__u32	refcount_table_clusters;
 | |
| 	__u32	refcount_table_index;
 | |
| 	__u32	refcount_block_index;
 | |
| 
 | |
| 	__u16	*refcount_block;
 | |
| };
 | |
| 
 | |
| struct ext2_qcow2_image {
 | |
| 	int	fd;
 | |
| 	struct	ext2_qcow2_hdr		*hdr;
 | |
| 	struct	ext2_qcow2_l2_cache	*l2_cache;
 | |
| 	struct	ext2_qcow2_refcount	refcount;
 | |
| 	__u32	cluster_size;
 | |
| 	__u32	cluster_bits;
 | |
| 	__u32	l1_size;
 | |
| 	__u32	l2_size;
 | |
| 
 | |
| 	__u64	*l1_table;
 | |
| 	__u64	l2_offset;
 | |
| 	__u64	l1_offset;
 | |
| 	__u64	image_size;
 | |
| };
 | |
| 
 | |
| /* Function prototypes */
 | |
| 
 | |
| /* qcow2.c */
 | |
| 
 | |
| /* Functions for converting qcow2 image into raw image */
 | |
| struct ext2_qcow2_hdr *qcow2_read_header(int);
 | |
| int qcow2_write_raw_image(int, int, struct ext2_qcow2_hdr *);
 | |
| 
 |