ext2_filsys current_fs;
quota_ctx_t current_qctx;
ext2_ino_t root, cwd;
+int no_copy_xattrs;
static int debugfs_setup_tdb(const char *device_name, char *undo_file,
io_manager *io_ptr)
{
errcode_t retval = ENOMEM;
- char *tdb_dir = NULL, *tdb_file = NULL;
- char *dev_name, *tmp_name;
+ const char *tdb_dir = NULL;
+ char *tdb_file = NULL;
+ char *dev_name, *tmp_name;
/* (re)open a specific undo file */
if (undo_file && undo_file[0] != 0) {
}
}
- if (catastrophic && (open_flags & EXT2_FLAG_RW)) {
- com_err(device, 0,
- "opening read-only because of catastrophic mode");
- open_flags &= ~EXT2_FLAG_RW;
- }
if (catastrophic)
- open_flags |= EXT2_FLAG_SKIP_MMP;
+ open_flags |= EXT2_FLAG_SKIP_MMP | EXT2_FLAG_IGNORE_SB_ERRORS;
if (undo_file) {
retval = debugfs_setup_tdb(device, undo_file, &io_ptr);
try_open_again:
retval = ext2fs_open(device, open_flags, superblock, blocksize,
io_ptr, ¤t_fs);
- if (retval && !(open_flags & EXT2_FLAG_IGNORE_CSUM_ERRORS)) {
+ if (retval && (retval == EXT2_ET_SB_CSUM_INVALID) &&
+ !(open_flags & EXT2_FLAG_IGNORE_CSUM_ERRORS)) {
open_flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS;
printf("Checksum errors in superblock! Retrying...\n");
goto try_open_again;
}
if (retval) {
- com_err(device, retval, "while opening filesystem");
+ com_err(debug_prog_name, retval,
+ "while trying to open %s", device);
if (retval == EXT2_ET_BAD_MAGIC)
check_plausibility(device, CHECK_FS_EXIST, NULL);
current_fs = NULL;
if (catastrophic)
com_err(device, 0, "catastrophic mode - not reading inode or group bitmaps");
else {
- retval = ext2fs_read_inode_bitmap(current_fs);
- if (retval) {
- com_err(device, retval, "while reading inode bitmap");
- goto errout;
- }
- retval = ext2fs_read_block_bitmap(current_fs);
+ retval = ext2fs_read_bitmaps(current_fs);
if (retval) {
- com_err(device, retval, "while reading block bitmap");
+ com_err(device, retval,
+ "while reading allocation bitmaps");
goto errout;
}
}
if (is_large_inode && large_inode->i_extra_isize >= 32)
fprintf(out, " Project: %5d", large_inode->i_projid);
fputs(" Size: ", out);
- if (LINUX_S_ISREG(inode->i_mode))
+ if (LINUX_S_ISREG(inode->i_mode) || LINUX_S_ISDIR(inode->i_mode))
fprintf(out, "%llu\n", EXT2_I_SIZE(inode));
else
fprintf(out, "%d\n", inode->i_size);
goto usage;
st.st_rdev = makedev(major, minor);
- retval = do_mknod_internal(current_fs, cwd, argv[1], &st);
+ retval = do_mknod_internal(current_fs, cwd, argv[1],
+ st.st_mode, st.st_rdev);
if (retval)
com_err(argv[0], retval, 0);
}
e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)),
blk64_t ref_block EXT2FS_ATTR((unused)),
int ref_offset EXT2FS_ATTR((unused)),
- void *private EXT2FS_ATTR((unused)))
+ void *private)
{
- blk64_t block;
+ blk64_t block = *blocknr;
+ blk64_t *last_cluster = (blk64_t *)private;
+ blk64_t cluster = EXT2FS_B2C(fs, block);
+
+ if (cluster == *last_cluster)
+ return 0;
+
+ *last_cluster = cluster;
- block = *blocknr;
ext2fs_block_alloc_stats2(fs, block, -1);
return 0;
}
if (debugfs_write_inode(inode, &inode_buf, 0))
return;
if (ext2fs_inode_has_valid_blocks2(current_fs, &inode_buf)) {
+ blk64_t last_cluster = 0;
ext2fs_block_iterate3(current_fs, inode, BLOCK_FLAG_READ_ONLY,
- NULL, release_blocks_proc, NULL);
+ NULL, release_blocks_proc, &last_cluster);
}
printf("\n");
ext2fs_inode_alloc_stats2(current_fs, inode, -1,
void do_idump(int argc, char *argv[])
{
+ struct ext2_inode_large *inode;
ext2_ino_t ino;
unsigned char *buf;
errcode_t err;
- int isize;
+ unsigned int isize, size, offset = 0;
+ int c, mode = 0;
- if (common_args_process(argc, argv, 2, 2, argv[0],
- "<file>", 0))
+ reset_getopt();
+ while ((c = getopt (argc, argv, "bex")) != EOF) {
+ if (mode || c == '?') {
+ com_err(argv[0], 0,
+ "Usage: inode_dump [-b]|[-e] <file>");
+ return;
+ }
+ mode = c;
+ }
+ if (optind != argc-1)
return;
- ino = string_to_inode(argv[1]);
+
+ if (check_fs_open(argv[0]))
+ return;
+
+ ino = string_to_inode(argv[optind]);
if (!ino)
return;
goto err;
}
- do_byte_hexdump(stdout, buf, isize);
+ inode = (struct ext2_inode_large *) buf;
+ size = isize;
+ switch (mode) {
+ case 'b':
+ offset = ((char *) (&inode->i_block)) - ((char *) buf);
+ size = sizeof(inode->i_block);
+ break;
+ case 'x':
+ case 'e':
+ if (size <= EXT2_GOOD_OLD_INODE_SIZE) {
+ com_err(argv[0], 0, "No extra space in inode");
+ goto err;
+ }
+ offset = EXT2_GOOD_OLD_INODE_SIZE + inode->i_extra_isize;
+ if (offset > size)
+ goto err;
+ size -= offset;
+ break;
+ }
+ if (mode == 'x')
+ raw_inode_xattr_dump(stdout, buf + offset, size);
+ else
+ do_byte_hexdump(stdout, buf + offset, size);
err:
ext2fs_free_mem(&buf);
}
fprintf(stdout, "device_name: %s\n", mmp_s->mmp_bdevname);
fprintf(stdout, "magic: 0x%x\n", mmp_s->mmp_magic);
fprintf(stdout, "checksum: 0x%08x\n", mmp_s->mmp_checksum);
- fprintf(stdout, "MMP is unsupported, please recompile with "
- "--enable-mmp\n");
}
#else
void do_dump_mmp(int argc EXT2FS_ATTR((unused)),