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