2 * e2image.c --- Program which writes an image file backing up
3 * critical metadata for the filesystem.
5 * Copyright 2000, 2001 by Theodore Ts'o.
8 * This file may be redistributed under the terms of the GNU Public
13 #define _LARGEFILE_SOURCE
14 #define _LARGEFILE64_SOURCE
36 #include <sys/types.h>
40 #include "ext2fs/ext2_fs.h"
41 #include "ext2fs/ext2fs.h"
42 #include "et/com_err.h"
43 #include "uuid/uuid.h"
45 #include "ext2fs/e2image.h"
46 #include "ext2fs/qcow2.h"
48 #include "../version.h"
49 #include "nls-enable.h"
50 #include "plausible.h"
52 #define QCOW_OFLAG_COPIED (1LL << 63)
53 #define NO_BLK ((blk64_t) -1)
57 #define E2IMAGE_QCOW2 2
60 #define E2IMAGE_INSTALL_FLAG 1
61 #define E2IMAGE_SCRAMBLE_FLAG 2
62 #define E2IMAGE_IS_QCOW2_FLAG 4
63 #define E2IMAGE_CHECK_ZERO_FLAG 8
65 static const char * program_name = "e2image";
66 static char * device_name = NULL;
68 static char output_is_blk;
70 /* writing to blk device: don't skip zeroed blocks */
71 static blk64_t source_offset, dest_offset;
72 static char move_mode;
73 static char show_progress;
74 static char *check_buf;
75 static int skipped_blocks;
77 static blk64_t align_offset(blk64_t offset, unsigned int n)
79 return (offset + n - 1) & ~((blk64_t) n - 1);
82 static int get_bits_from_size(size_t size)
90 /* Not a power of two */
100 static void usage(void)
102 fprintf(stderr, _("Usage: %s [ -r|Q ] [ -fr ] device image-file\n"),
104 fprintf(stderr, _(" %s -I device image-file\n"), program_name);
105 fprintf(stderr, _(" %s -ra [ -cfnp ] [ -o src_offset ] "
106 "[ -O dest_offset ] src_fs [ dest_fs ]\n"),
111 static ext2_loff_t seek_relative(int fd, int offset)
113 ext2_loff_t ret = ext2fs_llseek(fd, offset, SEEK_CUR);
115 perror("seek_relative");
121 static ext2_loff_t seek_set(int fd, ext2_loff_t offset)
123 ext2_loff_t ret = ext2fs_llseek(fd, offset, SEEK_SET);
132 * Returns true if the block we are about to write is identical to
133 * what is already on the disk.
135 static int check_block(int fd, void *buf, void *cbuf, int blocksize)
138 int count = blocksize, ret;
144 ret = read(fd, cp, count);
146 perror("check_block");
152 ret = memcmp(buf, cbuf, blocksize);
153 seek_relative(fd, -blocksize);
154 return (ret == 0) ? 1 : 0;
157 static void generic_write(int fd, void *buf, int blocksize, blk64_t block)
159 int count, free_buf = 0;
167 err = ext2fs_get_arrayzero(1, blocksize, &buf);
169 com_err(program_name, err, "%s",
170 _("while allocating buffer"));
175 printf(_("Writing block %llu\n"), (unsigned long long) block);
177 seek_relative(fd, blocksize);
178 goto free_and_return;
180 count = write(fd, buf, blocksize);
181 if (count != blocksize) {
188 com_err(program_name, err,
189 _("error writing block %llu"), block);
191 com_err(program_name, err, "%s",
192 _("error in generic_write()"));
198 ext2fs_free_mem(&buf);
201 static void write_header(int fd, void *hdr, int hdr_size, int wrt_size)
207 if (hdr_size > wrt_size) {
208 fprintf(stderr, "%s",
209 _("Error: header size is bigger than wrt_size\n"));
212 ret = ext2fs_get_mem(wrt_size, &header_buf);
214 fputs(_("Couldn't allocate header buffer\n"), stderr);
219 memset(header_buf, 0, wrt_size);
222 memcpy(header_buf, hdr, hdr_size);
224 generic_write(fd, header_buf, wrt_size, NO_BLK);
226 ext2fs_free_mem(&header_buf);
229 static void write_image_file(ext2_filsys fs, int fd)
231 struct ext2_image_hdr hdr;
235 write_header(fd, NULL, sizeof(struct ext2_image_hdr), fs->blocksize);
236 memset(&hdr, 0, sizeof(struct ext2_image_hdr));
238 hdr.offset_super = seek_relative(fd, 0);
239 retval = ext2fs_image_super_write(fs, fd, 0);
241 com_err(program_name, retval, "%s",
242 _("while writing superblock"));
246 hdr.offset_inode = seek_relative(fd, 0);
247 retval = ext2fs_image_inode_write(fs, fd,
248 (fd != 1) ? IMAGER_FLAG_SPARSEWRITE : 0);
250 com_err(program_name, retval, "%s",
251 _("while writing inode table"));
255 hdr.offset_blockmap = seek_relative(fd, 0);
256 retval = ext2fs_image_bitmap_write(fs, fd, 0);
258 com_err(program_name, retval, "%s",
259 _("while writing block bitmap"));
263 hdr.offset_inodemap = seek_relative(fd, 0);
264 retval = ext2fs_image_bitmap_write(fs, fd, IMAGER_FLAG_INODEMAP);
266 com_err(program_name, retval, "%s",
267 _("while writing inode bitmap"));
271 hdr.magic_number = EXT2_ET_MAGIC_E2IMAGE;
272 strcpy(hdr.magic_descriptor, "Ext2 Image 1.0");
273 gethostname(hdr.fs_hostname, sizeof(hdr.fs_hostname));
274 strncpy(hdr.fs_device_name, device_name, sizeof(hdr.fs_device_name)-1);
275 hdr.fs_device_name[sizeof(hdr.fs_device_name) - 1] = 0;
276 hdr.fs_blocksize = fs->blocksize;
278 if (stat(device_name, &st) == 0)
279 hdr.fs_device = st.st_rdev;
281 if (fstat(fd, &st) == 0) {
282 hdr.image_device = st.st_dev;
283 hdr.image_inode = st.st_ino;
285 memcpy(hdr.fs_uuid, fs->super->s_uuid, sizeof(hdr.fs_uuid));
287 hdr.image_time = time(0);
288 write_header(fd, &hdr, sizeof(struct ext2_image_hdr), fs->blocksize);
292 * These set of functions are used to write a RAW image file.
294 static ext2fs_block_bitmap meta_block_map;
295 static ext2fs_block_bitmap scramble_block_map; /* Directory blocks to be scrambled */
296 static blk64_t meta_blocks_count;
298 struct process_block_struct {
304 * These subroutines short circuits ext2fs_get_blocks and
305 * ext2fs_check_directory; we use them since we already have the inode
306 * structure, so there's no point in letting the ext2fs library read
309 static ino_t stashed_ino = 0;
310 static struct ext2_inode *stashed_inode;
312 static errcode_t meta_get_blocks(ext2_filsys fs EXT2FS_ATTR((unused)),
318 if ((ino != stashed_ino) || !stashed_inode)
319 return EXT2_ET_CALLBACK_NOTHANDLED;
321 for (i=0; i < EXT2_N_BLOCKS; i++)
322 blocks[i] = stashed_inode->i_block[i];
326 static errcode_t meta_check_directory(ext2_filsys fs EXT2FS_ATTR((unused)),
329 if ((ino != stashed_ino) || !stashed_inode)
330 return EXT2_ET_CALLBACK_NOTHANDLED;
332 if (!LINUX_S_ISDIR(stashed_inode->i_mode))
333 return EXT2_ET_NO_DIRECTORY;
337 static errcode_t meta_read_inode(ext2_filsys fs EXT2FS_ATTR((unused)),
339 struct ext2_inode *inode)
341 if ((ino != stashed_ino) || !stashed_inode)
342 return EXT2_ET_CALLBACK_NOTHANDLED;
343 *inode = *stashed_inode;
347 static void use_inode_shortcuts(ext2_filsys fs, int use_shortcuts)
350 fs->get_blocks = meta_get_blocks;
351 fs->check_directory = meta_check_directory;
352 fs->read_inode = meta_read_inode;
356 fs->check_directory = 0;
361 static int process_dir_block(ext2_filsys fs EXT2FS_ATTR((unused)),
363 e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)),
364 blk64_t ref_block EXT2FS_ATTR((unused)),
365 int ref_offset EXT2FS_ATTR((unused)),
366 void *priv_data EXT2FS_ATTR((unused)))
368 struct process_block_struct *p;
370 p = (struct process_block_struct *) priv_data;
372 ext2fs_mark_block_bitmap2(meta_block_map, *block_nr);
374 if (scramble_block_map && p->is_dir && blockcnt >= 0)
375 ext2fs_mark_block_bitmap2(scramble_block_map, *block_nr);
379 static int process_file_block(ext2_filsys fs EXT2FS_ATTR((unused)),
381 e2_blkcnt_t blockcnt,
382 blk64_t ref_block EXT2FS_ATTR((unused)),
383 int ref_offset EXT2FS_ATTR((unused)),
384 void *priv_data EXT2FS_ATTR((unused)))
386 if (blockcnt < 0 || all_data) {
387 ext2fs_mark_block_bitmap2(meta_block_map, *block_nr);
393 static void mark_table_blocks(ext2_filsys fs)
395 blk64_t first_block, b;
398 first_block = fs->super->s_first_data_block;
400 * Mark primary superblock
402 ext2fs_mark_block_bitmap2(meta_block_map, first_block);
406 * Mark the primary superblock descriptors
408 for (j = 0; j < fs->desc_blocks; j++) {
409 ext2fs_mark_block_bitmap2(meta_block_map,
410 ext2fs_descriptor_block_loc2(fs, first_block, j));
412 meta_blocks_count += fs->desc_blocks;
414 for (i = 0; i < fs->group_desc_count; i++) {
416 * Mark the blocks used for the inode table
418 if ((output_is_blk ||
419 !ext2fs_bg_flags_test(fs, i, EXT2_BG_INODE_UNINIT)) &&
420 ext2fs_inode_table_loc(fs, i)) {
421 unsigned int end = (unsigned) fs->inode_blocks_per_group;
422 /* skip unused blocks */
423 if (!output_is_blk && ext2fs_has_group_desc_csum(fs))
424 end -= (ext2fs_bg_itable_unused(fs, i) /
425 EXT2_INODES_PER_BLOCK(fs->super));
426 for (j = 0, b = ext2fs_inode_table_loc(fs, i);
429 ext2fs_mark_block_bitmap2(meta_block_map, b);
435 * Mark block used for the block bitmap
437 if (!ext2fs_bg_flags_test(fs, i, EXT2_BG_BLOCK_UNINIT) &&
438 ext2fs_block_bitmap_loc(fs, i)) {
439 ext2fs_mark_block_bitmap2(meta_block_map,
440 ext2fs_block_bitmap_loc(fs, i));
445 * Mark block used for the inode bitmap
447 if (!ext2fs_bg_flags_test(fs, i, EXT2_BG_INODE_UNINIT) &&
448 ext2fs_inode_bitmap_loc(fs, i)) {
449 ext2fs_mark_block_bitmap2(meta_block_map,
450 ext2fs_inode_bitmap_loc(fs, i));
457 * This function returns 1 if the specified block is all zeros
459 static int check_zero_block(char *buf, int blocksize)
462 int left = blocksize;
474 static int name_id[256];
476 #define EXT4_MAX_REC_LEN ((1<<16)-1)
478 static void scramble_dir_block(ext2_filsys fs, blk64_t blk, char *buf)
481 struct ext2_dir_entry_2 *dirent;
482 unsigned int rec_len;
485 end = buf + fs->blocksize;
486 for (p = buf; p < end-8; p += rec_len) {
487 dirent = (struct ext2_dir_entry_2 *) p;
488 rec_len = dirent->rec_len;
489 #ifdef WORDS_BIGENDIAN
490 rec_len = ext2fs_swab16(rec_len);
492 if (rec_len == EXT4_MAX_REC_LEN || rec_len == 0)
493 rec_len = fs->blocksize;
495 rec_len = (rec_len & 65532) | ((rec_len & 3) << 16);
497 printf("rec_len = %d, name_len = %d\n", rec_len, dirent->name_len);
499 if (rec_len < 8 || (rec_len % 4) ||
501 printf(_("Corrupt directory block %llu: "
502 "bad rec_len (%d)\n"),
503 (unsigned long long) blk, rec_len);
505 (void) ext2fs_set_rec_len(fs, rec_len,
506 (struct ext2_dir_entry *) dirent);
507 #ifdef WORDS_BIGENDIAN
508 dirent->rec_len = ext2fs_swab16(dirent->rec_len);
512 if (dirent->name_len + 8U > rec_len) {
513 printf(_("Corrupt directory block %llu: "
514 "bad name_len (%d)\n"),
515 (unsigned long long) blk, dirent->name_len);
516 dirent->name_len = rec_len - 8;
520 len = rec_len - dirent->name_len - 8;
522 memset(cp+dirent->name_len, 0, len);
523 if (dirent->name_len==1 && cp[0] == '.')
525 if (dirent->name_len==2 && cp[0] == '.' && cp[1] == '.')
528 memset(cp, 'A', dirent->name_len);
529 len = dirent->name_len;
531 while ((len > 0) && (id > 0)) {
540 static char got_sigint;
542 static void sigint_handler(int unused EXT2FS_ATTR((unused)))
545 signal (SIGINT, SIG_DFL);
548 #define calc_percent(a, b) ((int) ((100.0 * (((float) (a)) / \
549 ((float) (b)))) + 0.5))
550 #define calc_rate(t, b, d) (((float)(t) / ((1024 * 1024) / (b))) / (d))
552 static int print_progress(blk64_t num, blk64_t total)
554 return fprintf(stderr, _("%llu / %llu blocks (%d%%)"), num, total,
555 calc_percent(num, total));
558 static void output_meta_data_blocks(ext2_filsys fs, int fd, int flags)
562 char *buf, *zero_buf;
565 blk64_t distance = 0;
566 blk64_t end = ext2fs_blocks_count(fs->super);
567 time_t last_update = 0;
568 time_t start_time = 0;
569 blk64_t total_written = 0;
572 retval = ext2fs_get_mem(fs->blocksize, &buf);
574 com_err(program_name, retval, "%s",
575 _("while allocating buffer"));
578 retval = ext2fs_get_memzero(fs->blocksize, &zero_buf);
580 com_err(program_name, retval, "%s",
581 _("while allocating buffer"));
585 fprintf(stderr, "%s", _("Copying "));
586 bscount = print_progress(total_written, meta_blocks_count);
588 last_update = time(NULL);
589 start_time = time(NULL);
591 /* when doing an in place move to the right, you can't start
592 at the beginning or you will overwrite data, so instead
593 divide the fs up into distance size chunks and write them
595 if (move_mode && dest_offset > source_offset) {
596 distance = (dest_offset - source_offset) / fs->blocksize;
597 if (distance < ext2fs_blocks_count(fs->super))
598 start = ext2fs_blocks_count(fs->super) - distance;
601 signal (SIGINT, sigint_handler);
604 seek_set(fd, (start * fs->blocksize) + dest_offset);
605 for (blk = start; blk < end; blk++) {
608 /* moving to the right */
609 if (distance >= ext2fs_blocks_count(fs->super)||
610 start == ext2fs_blocks_count(fs->super) -
612 kill(getpid(), SIGINT);
614 /* moving to the left */
615 if (blk < (source_offset - dest_offset) /
617 kill(getpid(), SIGINT);
621 fprintf(stderr, "%s",
622 _("Stopping now will destroy the filesystem, "
623 "interrupt again if you are sure\n"));
625 fprintf(stderr, "%s", _("Copying "));
626 bscount = print_progress(total_written,
633 if (show_progress && last_update != time(NULL)) {
635 last_update = time(NULL);
638 bscount = print_progress(total_written,
640 duration = time(NULL) - start_time;
641 if (duration > 5 && total_written) {
642 time_t est = (duration * meta_blocks_count /
643 total_written) - duration;
645 strftime(buff, 30, "%T", gmtime(&est));
648 _(" %s remaining at %.2f MB/s"),
649 buff, calc_rate(total_written,
655 if ((blk >= fs->super->s_first_data_block) &&
656 ext2fs_test_block_bitmap2(meta_block_map, blk)) {
657 retval = io_channel_read_blk64(fs->io, blk, 1, buf);
659 com_err(program_name, retval,
660 _("error reading block %llu"), blk);
663 if (scramble_block_map &&
664 ext2fs_test_block_bitmap2(scramble_block_map, blk))
665 scramble_dir_block(fs, blk, buf);
666 if ((flags & E2IMAGE_CHECK_ZERO_FLAG) &&
667 check_zero_block(buf, fs->blocksize))
670 seek_relative(fd, sparse);
672 if (check_block(fd, buf, check_buf, fs->blocksize)) {
673 seek_relative(fd, fs->blocksize);
676 generic_write(fd, buf, fs->blocksize, blk);
681 generic_write(fd, zero_buf,
685 sparse += fs->blocksize;
686 if (sparse > 1024*1024) {
687 seek_relative(fd, 1024*1024);
692 if (distance && start) {
693 if (start < distance) {
699 if (end < distance) {
700 /* past overlap, do rest in one go */
708 signal (SIGINT, SIG_DFL);
710 time_t duration = time(NULL) - start_time;
713 strftime(buff, 30, "%T", gmtime(&duration));
714 fprintf(stderr, _("Copied %llu / %llu blocks (%d%%) in %s "),
715 total_written, meta_blocks_count,
716 calc_percent(total_written, meta_blocks_count), buff);
718 fprintf(stderr, _("at %.2f MB/s"),
719 calc_rate(total_written, fs->blocksize, duration));
720 fputs(" \n", stderr);
722 #ifdef HAVE_FTRUNCATE64
726 offset = seek_set(fd,
727 fs->blocksize * ext2fs_blocks_count(fs->super) + dest_offset);
729 offset = seek_relative(fd, sparse);
731 if (ftruncate64(fd, offset) < 0) {
732 seek_relative(fd, -1);
733 generic_write(fd, zero_buf, 1, NO_BLK);
737 if (sparse && !distance) {
738 seek_relative(fd, sparse-1);
739 generic_write(fd, zero_buf, 1, NO_BLK);
742 ext2fs_free_mem(&zero_buf);
743 ext2fs_free_mem(&buf);
746 static void init_l1_table(struct ext2_qcow2_image *image)
751 ret = ext2fs_get_arrayzero(image->l1_size, sizeof(__u64), &l1_table);
753 com_err(program_name, ret, "%s",
754 _("while allocating l1 table"));
758 image->l1_table = l1_table;
761 static void init_l2_cache(struct ext2_qcow2_image *image)
763 unsigned int count, i;
764 struct ext2_qcow2_l2_cache *cache;
765 struct ext2_qcow2_l2_table *table;
768 ret = ext2fs_get_arrayzero(1, sizeof(struct ext2_qcow2_l2_cache),
773 count = (image->l1_size > L2_CACHE_PREALLOC) ? L2_CACHE_PREALLOC :
776 cache->count = count;
778 cache->next_offset = image->l2_offset;
780 for (i = 0; i < count; i++) {
781 ret = ext2fs_get_arrayzero(1,
782 sizeof(struct ext2_qcow2_l2_table), &table);
786 ret = ext2fs_get_arrayzero(image->l2_size,
787 sizeof(__u64), &table->data);
791 table->next = cache->free_head;
792 cache->free_head = table;
795 image->l2_cache = cache;
799 com_err(program_name, ret, "%s", _("while allocating l2 cache"));
803 static void put_l2_cache(struct ext2_qcow2_image *image)
805 struct ext2_qcow2_l2_cache *cache = image->l2_cache;
806 struct ext2_qcow2_l2_table *tmp, *table;
811 table = cache->free_head;
812 cache->free_head = NULL;
817 ext2fs_free_mem(&tmp->data);
818 ext2fs_free_mem(&tmp);
821 if (cache->free != cache->count) {
822 fprintf(stderr, "%s", _("Warning: There are still tables in "
823 "the cache while putting the cache, "
824 "data will be lost so the image may "
826 table = cache->used_head;
827 cache->used_head = NULL;
831 ext2fs_free_mem(&cache);
834 static int init_refcount(struct ext2_qcow2_image *img, blk64_t table_offset)
836 struct ext2_qcow2_refcount *ref;
837 blk64_t table_clusters;
840 ref = &(img->refcount);
843 * One refcount block addresses 2048 clusters, one refcount table
844 * addresses cluster/sizeof(__u64) refcount blocks, and we need
845 * to address meta_blocks_count clusters + qcow2 metadata clusters
848 table_clusters = meta_blocks_count + (table_offset >>
850 table_clusters >>= (img->cluster_bits + 6 - 1);
851 table_clusters = (table_clusters == 0) ? 1 : table_clusters;
853 ref->refcount_table_offset = table_offset;
854 ref->refcount_table_clusters = table_clusters;
855 ref->refcount_table_index = 0;
856 ref->refcount_block_index = 0;
858 /* Allocate refcount table */
859 ret = ext2fs_get_arrayzero(ref->refcount_table_clusters,
860 img->cluster_size, &ref->refcount_table);
864 /* Allocate refcount block */
865 ret = ext2fs_get_arrayzero(1, img->cluster_size, &ref->refcount_block);
867 ext2fs_free_mem(&ref->refcount_table);
872 static int initialize_qcow2_image(int fd, ext2_filsys fs,
873 struct ext2_qcow2_image *image)
875 struct ext2_qcow2_hdr *header;
876 blk64_t total_size, offset;
877 int shift, l2_bits, header_size, l1_size, ret;
878 int cluster_bits = get_bits_from_size(fs->blocksize);
879 struct ext2_super_block *sb = fs->super;
881 /* Allocate header */
882 ret = ext2fs_get_memzero(sizeof(struct ext2_qcow2_hdr), &header);
886 total_size = ext2fs_blocks_count(sb) << cluster_bits;
887 image->cluster_size = fs->blocksize;
888 image->l2_size = 1 << (cluster_bits - 3);
889 image->cluster_bits = cluster_bits;
892 header->magic = ext2fs_cpu_to_be32(QCOW_MAGIC);
893 header->version = ext2fs_cpu_to_be32(QCOW_VERSION);
894 header->size = ext2fs_cpu_to_be64(total_size);
895 header->cluster_bits = ext2fs_cpu_to_be32(cluster_bits);
897 header_size = (sizeof(struct ext2_qcow2_hdr) + 7) & ~7;
898 offset = align_offset(header_size, image->cluster_size);
900 header->l1_table_offset = ext2fs_cpu_to_be64(offset);
901 image->l1_offset = offset;
903 l2_bits = cluster_bits - 3;
904 shift = cluster_bits + l2_bits;
905 l1_size = ((total_size + (1LL << shift) - 1) >> shift);
906 header->l1_size = ext2fs_cpu_to_be32(l1_size);
907 image->l1_size = l1_size;
909 /* Make space for L1 table */
910 offset += align_offset(l1_size * sizeof(blk64_t), image->cluster_size);
912 /* Initialize refcounting */
913 ret = init_refcount(image, offset);
915 ext2fs_free_mem(&header);
918 header->refcount_table_offset = ext2fs_cpu_to_be64(offset);
919 header->refcount_table_clusters =
920 ext2fs_cpu_to_be32(image->refcount.refcount_table_clusters);
921 offset += image->cluster_size;
922 offset += image->refcount.refcount_table_clusters <<
925 /* Make space for L2 tables */
926 image->l2_offset = offset;
927 offset += image->cluster_size;
929 /* Make space for first refcount block */
930 image->refcount.refcount_block_offset = offset;
933 /* Initialize l1 and l2 tables */
934 init_l1_table(image);
935 init_l2_cache(image);
940 static void free_qcow2_image(struct ext2_qcow2_image *img)
946 ext2fs_free_mem(&img->hdr);
949 ext2fs_free_mem(&img->l1_table);
951 if (img->refcount.refcount_table)
952 ext2fs_free_mem(&img->refcount.refcount_table);
953 if (img->refcount.refcount_block)
954 ext2fs_free_mem(&img->refcount.refcount_block);
958 ext2fs_free_mem(&img);
962 * Put table from used list (used_head) into free list (free_head).
963 * l2_table is used to return pointer to the next used table (used_head).
965 static void put_used_table(struct ext2_qcow2_image *img,
966 struct ext2_qcow2_l2_table **l2_table)
968 struct ext2_qcow2_l2_cache *cache = img->l2_cache;
969 struct ext2_qcow2_l2_table *table;
971 table = cache->used_head;
972 cache->used_head = table->next;
976 cache->used_tail = NULL;
978 /* Clean the table for case we will need to use it again */
979 memset(table->data, 0, img->cluster_size);
980 table->next = cache->free_head;
981 cache->free_head = table;
985 *l2_table = cache->used_head;
988 static void flush_l2_cache(struct ext2_qcow2_image *image)
992 struct ext2_qcow2_l2_cache *cache = image->l2_cache;
993 struct ext2_qcow2_l2_table *table = cache->used_head;
996 /* Store current position */
997 offset = seek_relative(fd, 0);
1000 while (cache->free < cache->count) {
1001 if (seek != table->offset) {
1002 seek_set(fd, table->offset);
1003 seek = table->offset;
1006 generic_write(fd, (char *)table->data, image->cluster_size,
1008 put_used_table(image, &table);
1009 seek += image->cluster_size;
1012 /* Restore previous position */
1013 seek_set(fd, offset);
1017 * Get first free table (from free_head) and put it into tail of used list
1019 * l2_table is used to return pointer to moved table.
1020 * Returns 1 if the cache is full, 0 otherwise.
1022 static void get_free_table(struct ext2_qcow2_image *image,
1023 struct ext2_qcow2_l2_table **l2_table)
1025 struct ext2_qcow2_l2_table *table;
1026 struct ext2_qcow2_l2_cache *cache = image->l2_cache;
1028 if (0 == cache->free)
1029 flush_l2_cache(image);
1031 table = cache->free_head;
1033 cache->free_head = table->next;
1035 if (cache->used_tail)
1036 cache->used_tail->next = table;
1038 /* First item in the used list */
1039 cache->used_head = table;
1041 cache->used_tail = table;
1047 static int add_l2_item(struct ext2_qcow2_image *img, blk64_t blk,
1048 blk64_t data, blk64_t next)
1050 struct ext2_qcow2_l2_cache *cache = img->l2_cache;
1051 struct ext2_qcow2_l2_table *table = cache->used_tail;
1052 blk64_t l1_index = blk / img->l2_size;
1053 blk64_t l2_index = blk & (img->l2_size - 1);
1057 * Need to create new table if it does not exist,
1060 if (!table || (table->l1_index != l1_index)) {
1061 get_free_table(img, &table);
1062 table->l1_index = l1_index;
1063 table->offset = cache->next_offset;
1064 cache->next_offset = next;
1065 img->l1_table[l1_index] =
1066 ext2fs_cpu_to_be64(table->offset | QCOW_OFLAG_COPIED);
1070 table->data[l2_index] = ext2fs_cpu_to_be64(data | QCOW_OFLAG_COPIED);
1074 static int update_refcount(int fd, struct ext2_qcow2_image *img,
1075 blk64_t offset, blk64_t rfblk_pos)
1077 struct ext2_qcow2_refcount *ref;
1081 ref = &(img->refcount);
1082 table_index = offset >> (2 * img->cluster_bits - 1);
1085 * Need to create new refcount block when the offset addresses
1086 * another item in the refcount table
1088 if (table_index != ref->refcount_table_index) {
1090 seek_set(fd, ref->refcount_block_offset);
1092 generic_write(fd, (char *)ref->refcount_block,
1093 img->cluster_size, NO_BLK);
1094 memset(ref->refcount_block, 0, img->cluster_size);
1096 ref->refcount_table[ref->refcount_table_index] =
1097 ext2fs_cpu_to_be64(ref->refcount_block_offset);
1098 ref->refcount_block_offset = rfblk_pos;
1099 ref->refcount_block_index = 0;
1100 ref->refcount_table_index = table_index;
1105 * We are relying on the fact that we are creating the qcow2
1106 * image sequentially, hence we will always allocate refcount
1107 * block items sequentialy.
1109 ref->refcount_block[ref->refcount_block_index] = ext2fs_cpu_to_be16(1);
1110 ref->refcount_block_index++;
1114 static int sync_refcount(int fd, struct ext2_qcow2_image *img)
1116 struct ext2_qcow2_refcount *ref;
1118 ref = &(img->refcount);
1120 ref->refcount_table[ref->refcount_table_index] =
1121 ext2fs_cpu_to_be64(ref->refcount_block_offset);
1122 seek_set(fd, ref->refcount_table_offset);
1123 generic_write(fd, (char *)ref->refcount_table,
1124 ref->refcount_table_clusters << img->cluster_bits, NO_BLK);
1126 seek_set(fd, ref->refcount_block_offset);
1127 generic_write(fd, (char *)ref->refcount_block, img->cluster_size,
1132 static void output_qcow2_meta_data_blocks(ext2_filsys fs, int fd)
1135 blk64_t blk, offset, size, end;
1137 struct ext2_qcow2_image *img;
1138 unsigned int header_size;
1140 /* allocate struct ext2_qcow2_image */
1141 retval = ext2fs_get_mem(sizeof(struct ext2_qcow2_image), &img);
1143 com_err(program_name, retval, "%s",
1144 _("while allocating ext2_qcow2_image"));
1148 retval = initialize_qcow2_image(fd, fs, img);
1150 com_err(program_name, retval, "%s",
1151 _("while initializing ext2_qcow2_image"));
1154 header_size = align_offset(sizeof(struct ext2_qcow2_hdr),
1156 write_header(fd, img->hdr, sizeof(struct ext2_qcow2_hdr), header_size);
1158 /* Refcount all qcow2 related metadata up to refcount_block_offset */
1159 end = img->refcount.refcount_block_offset;
1161 blk = end + img->cluster_size;
1162 for (offset = 0; offset <= end; offset += img->cluster_size) {
1163 if (update_refcount(fd, img, offset, blk)) {
1164 blk += img->cluster_size;
1166 * If we create new refcount block, we need to refcount
1169 end += img->cluster_size;
1172 seek_set(fd, offset);
1174 retval = ext2fs_get_mem(fs->blocksize, &buf);
1176 com_err(program_name, retval, "%s",
1177 _("while allocating buffer"));
1180 /* Write qcow2 data blocks */
1181 for (blk = 0; blk < ext2fs_blocks_count(fs->super); blk++) {
1182 if ((blk >= fs->super->s_first_data_block) &&
1183 ext2fs_test_block_bitmap2(meta_block_map, blk)) {
1184 retval = io_channel_read_blk64(fs->io, blk, 1, buf);
1186 com_err(program_name, retval,
1187 _("error reading block %llu"), blk);
1190 if (scramble_block_map &&
1191 ext2fs_test_block_bitmap2(scramble_block_map, blk))
1192 scramble_dir_block(fs, blk, buf);
1193 if (check_zero_block(buf, fs->blocksize))
1196 if (update_refcount(fd, img, offset, offset)) {
1197 /* Make space for another refcount block */
1198 offset += img->cluster_size;
1199 seek_set(fd, offset);
1201 * We have created the new refcount block, this
1202 * means that we need to refcount it as well.
1203 * So the previous update_refcount refcounted
1204 * the block itself and now we are going to
1205 * create refcount for data. New refcount
1206 * block should not be created!
1208 if (update_refcount(fd, img, offset, offset)) {
1209 fprintf(stderr, "%s",
1210 _("Programming error: multiple "
1211 "sequential refcount blocks "
1217 generic_write(fd, buf, fs->blocksize, blk);
1219 if (add_l2_item(img, blk, offset,
1220 offset + img->cluster_size)) {
1221 offset += img->cluster_size;
1222 if (update_refcount(fd, img, offset,
1223 offset + img->cluster_size)) {
1224 offset += img->cluster_size;
1225 if (update_refcount(fd, img, offset,
1227 fprintf(stderr, "%s",
1228 _("Programming error: multiple sequential refcount "
1229 "blocks created!\n"));
1233 offset += img->cluster_size;
1234 seek_set(fd, offset);
1238 offset += img->cluster_size;
1241 update_refcount(fd, img, offset, offset);
1242 flush_l2_cache(img);
1243 sync_refcount(fd, img);
1246 seek_set(fd, img->l1_offset);
1247 size = img->l1_size * sizeof(__u64);
1248 generic_write(fd, (char *)img->l1_table, size, NO_BLK);
1250 ext2fs_free_mem(&buf);
1251 free_qcow2_image(img);
1254 static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags)
1256 struct process_block_struct pb;
1257 struct ext2_inode inode;
1258 ext2_inode_scan scan;
1263 meta_blocks_count = 0;
1264 retval = ext2fs_allocate_block_bitmap(fs, _("in-use block map"),
1267 com_err(program_name, retval, "%s",
1268 _("while allocating block bitmap"));
1272 if (flags & E2IMAGE_SCRAMBLE_FLAG) {
1273 retval = ext2fs_allocate_block_bitmap(fs, "scramble block map",
1274 &scramble_block_map);
1276 com_err(program_name, retval, "%s",
1277 _("while allocating scramble block bitmap"));
1282 mark_table_blocks(fs);
1284 printf("%s", _("Scanning inodes...\n"));
1286 retval = ext2fs_open_inode_scan(fs, 0, &scan);
1288 com_err(program_name, retval, "%s",
1289 _("while opening inode scan"));
1293 retval = ext2fs_get_mem(fs->blocksize * 3, &block_buf);
1295 com_err(program_name, 0, "%s",
1296 _("Can't allocate block buffer"));
1300 use_inode_shortcuts(fs, 1);
1301 stashed_inode = &inode;
1303 retval = ext2fs_get_next_inode(scan, &ino, &inode);
1304 if (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE)
1307 com_err(program_name, retval, "%s",
1308 _("while getting next inode"));
1313 if (!inode.i_links_count)
1315 if (ext2fs_file_acl_block(fs, &inode)) {
1316 ext2fs_mark_block_bitmap2(meta_block_map,
1317 ext2fs_file_acl_block(fs, &inode));
1318 meta_blocks_count++;
1320 if (!ext2fs_inode_has_valid_blocks2(fs, &inode))
1325 pb.is_dir = LINUX_S_ISDIR(inode.i_mode);
1326 if (LINUX_S_ISDIR(inode.i_mode) ||
1327 (LINUX_S_ISLNK(inode.i_mode) &&
1328 ext2fs_inode_has_valid_blocks2(fs, &inode)) ||
1329 ino == fs->super->s_journal_inum) {
1330 retval = ext2fs_block_iterate3(fs, ino,
1331 BLOCK_FLAG_READ_ONLY, block_buf,
1332 process_dir_block, &pb);
1334 com_err(program_name, retval,
1335 _("while iterating over inode %u"),
1340 if ((inode.i_flags & EXT4_EXTENTS_FL) ||
1341 inode.i_block[EXT2_IND_BLOCK] ||
1342 inode.i_block[EXT2_DIND_BLOCK] ||
1343 inode.i_block[EXT2_TIND_BLOCK] || all_data) {
1344 retval = ext2fs_block_iterate3(fs,
1345 ino, BLOCK_FLAG_READ_ONLY, block_buf,
1346 process_file_block, &pb);
1348 com_err(program_name, retval,
1349 _("while iterating over inode %u"), ino);
1355 use_inode_shortcuts(fs, 0);
1357 if (type & E2IMAGE_QCOW2)
1358 output_qcow2_meta_data_blocks(fs, fd);
1360 output_meta_data_blocks(fs, fd, flags);
1362 ext2fs_free_mem(&block_buf);
1363 ext2fs_close_inode_scan(scan);
1364 ext2fs_free_block_bitmap(meta_block_map);
1365 if (type & E2IMAGE_SCRAMBLE_FLAG)
1366 ext2fs_free_block_bitmap(scramble_block_map);
1369 static void install_image(char *device, char *image_fn, int type)
1373 int open_flag = EXT2_FLAG_IMAGE_FILE | EXT2_FLAG_64BITS;
1379 com_err(program_name, 0, "%s",
1380 _("Raw and qcow2 images cannot be installed"));
1384 #ifdef CONFIG_TESTIO_DEBUG
1385 if (getenv("TEST_IO_FLAGS") || getenv("TEST_IO_BLOCK")) {
1386 io_ptr = test_io_manager;
1387 test_io_backing_manager = unix_io_manager;
1390 io_ptr = unix_io_manager;
1392 retval = ext2fs_open (image_fn, open_flag, 0, 0,
1395 com_err(program_name, retval, _("while trying to open %s"),
1400 retval = ext2fs_read_bitmaps (fs);
1402 com_err(program_name, retval, "%s", _("error reading bitmaps"));
1406 fd = ext2fs_open_file(image_fn, O_RDONLY, 0);
1412 retval = io_ptr->open(device, IO_FLAG_RW, &io);
1414 com_err(device, 0, "%s", _("while opening device file"));
1418 ext2fs_rewrite_to_io(fs, io);
1420 seek_set(fd, fs->image_header->offset_inode);
1422 retval = ext2fs_image_inode_read(fs, fd, 0);
1424 com_err(image_fn, 0, "%s",
1425 _("while restoring the image table"));
1430 ext2fs_close_free(&fs);
1433 static struct ext2_qcow2_hdr *check_qcow2_image(int *fd, char *name)
1436 *fd = ext2fs_open_file(name, O_RDONLY, 0600);
1440 return qcow2_read_header(*fd);
1443 int main (int argc, char ** argv)
1448 char *image_fn, offset_opt[64];
1449 struct ext2_qcow2_hdr *header = NULL;
1450 int open_flag = EXT2_FLAG_64BITS;
1453 int mount_flags = 0;
1457 int ignore_rw_mount = 0;
1462 setlocale(LC_MESSAGES, "");
1463 setlocale(LC_CTYPE, "");
1464 bindtextdomain(NLS_CAT_NAME, LOCALEDIR);
1465 textdomain(NLS_CAT_NAME);
1466 set_com_err_gettext(gettext);
1468 fprintf (stderr, "e2image %s (%s)\n", E2FSPROGS_VERSION,
1471 program_name = *argv;
1472 add_error_table(&et_ext2_error_table);
1473 while ((c = getopt(argc, argv, "nrsIQafo:O:pc")) != EOF)
1476 flags |= E2IMAGE_INSTALL_FLAG;
1481 img_type |= E2IMAGE_QCOW2;
1486 img_type |= E2IMAGE_RAW;
1489 flags |= E2IMAGE_SCRAMBLE_FLAG;
1495 ignore_rw_mount = 1;
1501 source_offset = strtoull(optarg, NULL, 0);
1504 dest_offset = strtoull(optarg, NULL, 0);
1515 if (optind == argc - 1 &&
1516 (source_offset || dest_offset))
1518 else if (optind != argc - 2 )
1521 if (all_data && !img_type) {
1522 com_err(program_name, 0, "%s", _("-a option can only be used "
1523 "with raw or QCOW2 images."));
1526 if ((source_offset || dest_offset) && img_type != E2IMAGE_RAW) {
1527 com_err(program_name, 0, "%s",
1528 _("Offsets are only allowed with raw images."));
1531 if (move_mode && img_type != E2IMAGE_RAW) {
1532 com_err(program_name, 0, "%s",
1533 _("Move mode is only allowed with raw images."));
1536 if (move_mode && !all_data) {
1537 com_err(program_name, 0, "%s",
1538 _("Move mode requires all data mode."));
1541 device_name = argv[optind];
1543 image_fn = device_name;
1544 else image_fn = argv[optind+1];
1546 retval = ext2fs_check_if_mounted(device_name, &mount_flags);
1548 com_err(program_name, retval, "%s", _("checking if mounted"));
1552 if (img_type && !ignore_rw_mount &&
1553 (mount_flags & EXT2_MF_MOUNTED) &&
1554 !(mount_flags & EXT2_MF_READONLY)) {
1555 fprintf(stderr, "%s", _("\nRunning e2image on a R/W mounted "
1556 "filesystem can result in an\n"
1557 "inconsistent image which will not be useful "
1558 "for debugging purposes.\n"
1559 "Use -f option if you really want to do that.\n"));
1563 if (flags & E2IMAGE_INSTALL_FLAG) {
1564 install_image(device_name, image_fn, img_type);
1568 if (img_type & E2IMAGE_RAW) {
1569 header = check_qcow2_image(&qcow2_fd, device_name);
1571 flags |= E2IMAGE_IS_QCOW2_FLAG;
1575 sprintf(offset_opt, "offset=%llu", source_offset);
1576 retval = ext2fs_open2(device_name, offset_opt, open_flag, 0, 0,
1577 unix_io_manager, &fs);
1579 com_err (program_name, retval, _("while trying to open %s"),
1581 fputs(_("Couldn't find valid filesystem superblock.\n"), stdout);
1582 if (retval == EXT2_ET_BAD_MAGIC)
1583 check_plausibility(device_name, CHECK_FS_EXIST, NULL);
1588 if (strcmp(image_fn, "-") == 0)
1591 int o_flags = O_CREAT|O_RDWR;
1593 if (img_type != E2IMAGE_RAW)
1595 if (access(image_fn, F_OK) != 0)
1596 flags |= E2IMAGE_CHECK_ZERO_FLAG;
1597 fd = ext2fs_open_file(image_fn, o_flags, 0600);
1599 com_err(program_name, errno,
1600 _("while trying to open %s"), image_fn);
1605 seek_set(fd, dest_offset);
1607 if ((img_type & E2IMAGE_QCOW2) && (fd == 1)) {
1608 com_err(program_name, 0, "%s",
1609 _("QCOW2 image can not be written to the stdout!\n"));
1613 if (fstat(fd, &st)) {
1614 com_err(program_name, 0, "%s",
1615 _("Can not stat output\n"));
1618 if (S_ISBLK(st.st_mode))
1621 if (flags & E2IMAGE_IS_QCOW2_FLAG) {
1622 ret = qcow2_write_raw_image(qcow2_fd, fd, header);
1624 if (ret == -QCOW_COMPRESSED)
1625 fprintf(stderr, _("Image (%s) is compressed\n"),
1627 if (ret == -QCOW_ENCRYPTED)
1628 fprintf(stderr, _("Image (%s) is encrypted\n"),
1630 com_err(program_name, ret,
1631 _("while trying to convert qcow2 image"
1632 " (%s) into raw image (%s)"),
1633 device_name, image_fn);
1639 if (img_type != E2IMAGE_RAW) {
1640 fprintf(stderr, "%s", _("The -c option only supported "
1645 fprintf(stderr, "%s", _("The -c option not supported "
1646 "when writing to stdout\n"));
1649 retval = ext2fs_get_mem(fs->blocksize, &check_buf);
1651 com_err(program_name, retval, "%s",
1652 _("while allocating check_buf"));
1656 if (show_progress && (img_type != E2IMAGE_RAW)) {
1657 fprintf(stderr, "%s",
1658 _("The -p option only supported in raw mode\n"));
1662 write_raw_image_file(fs, fd, img_type, flags);
1664 write_image_file(fs, fd);
1666 ext2fs_close_free(&fs);
1668 printf(_("%d blocks already contained the data to be copied\n"),
1676 remove_error_table(&et_ext2_error_table);