15f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V/*
25f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V * e2undo.c - Replay an undo log onto an ext2/3/4 filesystem
35f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V *
45f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V * Copyright IBM Corporation, 2007
55f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
65f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V *
75f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V * %Begin-Header%
85f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V * This file may be redistributed under the terms of the GNU Public
95f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V * License.
105f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V * %End-Header%
115f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V */
125f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
135f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#include <stdio.h>
145f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#include <stdlib.h>
155f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#ifdef HAVE_GETOPT_H
165f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#include <getopt.h>
175f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#endif
185f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#include <fcntl.h>
195f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#if HAVE_ERRNO_H
205f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#include <errno.h>
215f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#endif
225f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#include "ext2fs/tdb.h"
235f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#include "ext2fs/ext2fs.h"
245f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#include "nls-enable.h"
255f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
26e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic unsigned char mtime_key[] = "filesystem MTIME";
27e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic unsigned char uuid_key[] = "filesystem UUID";
28e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic unsigned char blksize_key[] = "filesystem BLKSIZE";
295f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
30e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char *prg_name;
3138dd11f5953eef5d24f977801857d5df3e817de2Theodore Ts'o
32e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic void usage(void)
335f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V{
345f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	fprintf(stderr,
355f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		_("Usage: %s <transaction file> <filesystem>\n"), prg_name);
365f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	exit(1);
375f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V}
385f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
395f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.Vstatic int check_filesystem(TDB_CONTEXT *tdb, io_channel channel)
405f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V{
415f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	__u32   s_mtime;
425f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	__u8    s_uuid[16];
435f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	errcode_t retval;
445f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	TDB_DATA tdb_key, tdb_data;
455f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	struct ext2_super_block super;
465f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
475f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	io_channel_set_blksize(channel, SUPERBLOCK_OFFSET);
48e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	retval = io_channel_read_blk64(channel, 1, -SUPERBLOCK_SIZE, &super);
495f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (retval) {
50e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		com_err(prg_name, retval,
51e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			"%s", _("Failed to read the file system data \n"));
525f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		return retval;
535f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
545f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
555f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_key.dptr = mtime_key;
565f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_key.dsize = sizeof(mtime_key);
575f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_data = tdb_fetch(tdb, tdb_key);
585f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (!tdb_data.dptr) {
595f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		retval = EXT2_ET_TDB_SUCCESS + tdb_error(tdb);
6038dd11f5953eef5d24f977801857d5df3e817de2Theodore Ts'o		com_err(prg_name, retval,
615f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			_("Failed tdb_fetch %s\n"), tdb_errorstr(tdb));
625f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		return retval;
635f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
645f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
655f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	s_mtime = *(__u32 *)tdb_data.dptr;
665f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (super.s_mtime != s_mtime) {
675f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
6838dd11f5953eef5d24f977801857d5df3e817de2Theodore Ts'o		com_err(prg_name, 0,
695f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			_("The file system Mount time didn't match %u\n"),
705f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			s_mtime);
715f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
725f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		return  -1;
735f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
745f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
755f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
765f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_key.dptr = uuid_key;
775f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_key.dsize = sizeof(uuid_key);
785f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_data = tdb_fetch(tdb, tdb_key);
795f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (!tdb_data.dptr) {
805f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		retval = EXT2_ET_TDB_SUCCESS + tdb_error(tdb);
8138dd11f5953eef5d24f977801857d5df3e817de2Theodore Ts'o		com_err(prg_name, retval,
825f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			_("Failed tdb_fetch %s\n"), tdb_errorstr(tdb));
835f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		return retval;
845f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
855f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	memcpy(s_uuid, tdb_data.dptr, sizeof(s_uuid));
865f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (memcmp(s_uuid, super.s_uuid, sizeof(s_uuid))) {
87e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		com_err(prg_name, 0, "%s",
885f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			_("The file system UUID didn't match \n"));
895f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		return -1;
905f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
915f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
925f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	return 0;
935f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V}
945f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
955f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.Vstatic int set_blk_size(TDB_CONTEXT *tdb, io_channel channel)
965f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V{
975f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	int block_size;
985f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	errcode_t retval;
995f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	TDB_DATA tdb_key, tdb_data;
1005f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1015f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_key.dptr = blksize_key;
1025f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_key.dsize = sizeof(blksize_key);
1035f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_data = tdb_fetch(tdb, tdb_key);
1045f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (!tdb_data.dptr) {
1055f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		retval = EXT2_ET_TDB_SUCCESS + tdb_error(tdb);
10638dd11f5953eef5d24f977801857d5df3e817de2Theodore Ts'o		com_err(prg_name, retval,
1075f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			_("Failed tdb_fetch %s\n"), tdb_errorstr(tdb));
1085f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		return retval;
1095f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
1105f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1115f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	block_size = *(int *)tdb_data.dptr;
1125f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#ifdef DEBUG
1135f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	printf("Block size %d\n", block_size);
1145f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V#endif
1155f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	io_channel_set_blksize(channel, block_size);
1165f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1175f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	return 0;
1185f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V}
1195f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1205f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.Vint main(int argc, char *argv[])
1215f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V{
1225f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	int c,force = 0;
1235f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	TDB_CONTEXT *tdb;
1245f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	TDB_DATA key, data;
1255f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	io_channel channel;
1265f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	errcode_t retval;
1275f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	int  mount_flags;
128e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	blk64_t  blk_num;
12938dd11f5953eef5d24f977801857d5df3e817de2Theodore Ts'o	char *device_name, *tdb_file;
1305f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	io_manager manager = unix_io_manager;
1315f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
13211d4f30fe19fe543c8ba52cc6033e57a38a82e2aTheodore Ts'o#ifdef ENABLE_NLS
13311d4f30fe19fe543c8ba52cc6033e57a38a82e2aTheodore Ts'o	setlocale(LC_MESSAGES, "");
13411d4f30fe19fe543c8ba52cc6033e57a38a82e2aTheodore Ts'o	setlocale(LC_CTYPE, "");
13511d4f30fe19fe543c8ba52cc6033e57a38a82e2aTheodore Ts'o	bindtextdomain(NLS_CAT_NAME, LOCALEDIR);
13611d4f30fe19fe543c8ba52cc6033e57a38a82e2aTheodore Ts'o	textdomain(NLS_CAT_NAME);
137e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	set_com_err_gettext(gettext);
13811d4f30fe19fe543c8ba52cc6033e57a38a82e2aTheodore Ts'o#endif
1391d4a493fa213a61bd46f2e55ae5712bc8332a034Theodore Ts'o	add_error_table(&et_ext2_error_table);
14011d4f30fe19fe543c8ba52cc6033e57a38a82e2aTheodore Ts'o
1415f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	prg_name = argv[0];
1425f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	while((c = getopt(argc, argv, "f")) != EOF) {
1435f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		switch (c) {
1445f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			case 'f':
1455f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V				force = 1;
1465f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V				break;
1475f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			default:
148e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall				usage();
1495f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		}
1505f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
1515f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
152e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	if (argc != optind + 2)
153e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		usage();
1545f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1555f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_file = argv[optind];
1565f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	device_name = argv[optind+1];
1575f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1585f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb = tdb_open(tdb_file, 0, 0, O_RDONLY, 0600);
1595f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1605f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (!tdb) {
1615f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		com_err(prg_name, errno,
1625f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V				_("Failed tdb_open %s\n"), tdb_file);
1635f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		exit(1);
1645f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
1655f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1665f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	retval = ext2fs_check_if_mounted(device_name, &mount_flags);
1675f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (retval) {
1685f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		com_err(prg_name, retval, _("Error while determining whether "
1695f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V				"%s is mounted.\n"), device_name);
1705f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		exit(1);
1715f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
1725f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1735f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (mount_flags & EXT2_MF_MOUNTED) {
174e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		com_err(prg_name, retval, "%s", _("e2undo should only be run "
175e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall						"on unmounted file system\n"));
1765f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		exit(1);
1775f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
1785f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1795f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	retval = manager->open(device_name,
1805f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V				IO_FLAG_EXCLUSIVE | IO_FLAG_RW,  &channel);
1815f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (retval) {
1825f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		com_err(prg_name, retval,
1835f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V				_("Failed to open %s\n"), device_name);
1845f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		exit(1);
1855f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
1865f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1875f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (!force && check_filesystem(tdb, channel)) {
1885f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		exit(1);
1895f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
1905f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1915f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	if (set_blk_size(tdb, channel)) {
1925f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		exit(1);
1935f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
1945f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
1955f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	for (key = tdb_firstkey(tdb); key.dptr; key = tdb_nextkey(tdb, key)) {
1965f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		if (!strcmp((char *) key.dptr, (char *) mtime_key) ||
1975f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		    !strcmp((char *) key.dptr, (char *) uuid_key) ||
1985f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		    !strcmp((char *) key.dptr, (char *) blksize_key)) {
1995f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			continue;
2005f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		}
2015f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
2025f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		data = tdb_fetch(tdb, key);
2035f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		if (!data.dptr) {
2045f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			com_err(prg_name, 0,
2055f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V				_("Failed tdb_fetch %s\n"), tdb_errorstr(tdb));
2065f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			exit(1);
2075f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		}
208e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		blk_num = *(blk64_t *)key.dptr;
209e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		printf(_("Replayed transaction of size %zd at location %llu\n"),
2105f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V							data.dsize, blk_num);
211e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		retval = io_channel_write_blk64(channel, blk_num,
2125f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V						-data.dsize, data.dptr);
2135f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		if (retval == -1) {
2145f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			com_err(prg_name, retval,
2155f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V					_("Failed write %s\n"),
2165f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V					strerror(errno));
2175f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V			exit(1);
2185f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V		}
2195f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	}
2205f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	io_channel_close(channel);
2215f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V	tdb_close(tdb);
2225f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V
22379e62409b3a247e258d9e9206484ed8f193a183eEric Sandeen	return 0;
2245f8a5ae6b8f7c273d678cbdaf56ec35cdb1b3587Aneesh Kumar K.V}
225