------------------------------------------
-fix up get_backup_sb, so that it doesn't choose something bogus if
-fs->super->.... is ridiculous
-
-----------------------------------
-
Maybe a bug in debugfs v.1.14:
if a file has more than one hardlink, only the first filename is shown when
using command
check_if_mounted() should check to see if the file is in /proc/swaps,
to avoid mkfs's or checking a active swap partition.
-----------------------------------------------------------------
-
-Add a check in configure.in on Linux systems making sure that
-/usr/include/linux and /usr/include/asm exist. Otherwise you can have
-some very obscure errors!
-
-----------------------------------------------------------------
Debugfs's link command should set the file type information
2001-12-23 Theodore Tso <tytso@valinux.com>
+ * util.c (get_backup_sb): This function now searches for the
+ backup superblock by iterating over possible blocksizes
+ instead of defaulting a guess of 8193 if the superblock
+ isn't available.
+
+ * message.c (expand_percent_expression), unix.c (main): Pass in
+ new parameters to get_backup_sb. Also, in unix.c, use the
+ blocksize paramter in the e2fsck context structure instead
+ of using a static variable, since get_backup_sb wants to
+ be able to set the blocksize paramter.
+
+ * e2fsck.h: Update function prototype for get_backup_sb; also add
+ the blocksize parameter to the e2fsck context structure.
+
* Makefile.in, jfs_user.h: Move linux/jbd.h to
ext2fs/kernel-jbd.h, to avoid using the system header
file version of hbd.h when using diet glibc (since it
int options;
blk_t use_superblock; /* sb requested by user */
blk_t superblock; /* sb used to open fs */
+ int blocksize; /* blocksize */
blk_t num_blocks; /* Total number of blocks */
#ifdef HAVE_SETJMP_H
#ifdef MTRACE
extern void mtrace_print(char *mesg);
#endif
-extern blk_t get_backup_sb(ext2_filsys fs);
+extern blk_t get_backup_sb(e2fsck_t ctx, ext2_filsys fs,
+ const char *name, io_manager manager);
extern int ext2_file_type(unsigned int mode);
/* unix.c */
print_pathname(fs, ctx->dir, ctx->ino);
break;
case 'S':
- printf("%d", get_backup_sb(fs));
+ printf("%d", get_backup_sb(NULL, fs, NULL, NULL));
break;
case 's':
printf("%s", ctx->str ? ctx->str : "NULL");
#include "../version.h"
/* Command line options */
-static int blocksize = 0;
static int swapfs = 0;
static int normalize_swapfs = 0;
static int cflag = 0; /* check disk */
ctx->flags |= E2F_FLAG_SB_SPECIFIED;
break;
case 'B':
- blocksize = atoi(optarg);
+ ctx->blocksize = atoi(optarg);
break;
case 'I':
ctx->inode_buffer_blocks = atoi(optarg);
if ((ctx->options & E2F_OPT_READONLY) == 0)
flags |= EXT2_FLAG_RW;
- if (ctx->superblock && blocksize) {
+ if (ctx->superblock && ctx->blocksize) {
retval = ext2fs_open(ctx->filesystem_name, flags,
- ctx->superblock, blocksize, io_ptr, &fs);
+ ctx->superblock, ctx->blocksize,
+ io_ptr, &fs);
} else if (ctx->superblock) {
for (i=0; possible_block_sizes[i]; i++) {
retval = ext2fs_open(ctx->filesystem_name, flags,
printf(_("%s trying backup blocks...\n"),
retval ? _("Couldn't find ext2 superblock,") :
_("Group descriptors look bad..."));
- ctx->superblock = get_backup_sb(fs);
+ get_backup_sb(ctx, fs, ctx->filesystem_name, io_ptr);
if (fs)
ext2fs_close(fs);
goto restart;
}
#endif
-blk_t get_backup_sb(ext2_filsys fs)
+blk_t get_backup_sb(e2fsck_t ctx, ext2_filsys fs, const char *name,
+ io_manager manager)
{
- if (!fs || !fs->super)
- return 8193;
- return fs->super->s_blocks_per_group + fs->super->s_first_data_block;
+ struct ext2_super_block *sb;
+ io_channel io = NULL;
+ void *buf;
+ int blocksize;
+ blk_t superblock, ret_sb = 8193;
+
+ if (fs && fs->super) {
+ ret_sb = (fs->super->s_blocks_per_group +
+ fs->super->s_first_data_block);
+ if (ctx) {
+ ctx->superblock = ret_sb;
+ ctx->blocksize = fs->blocksize;
+ }
+ return ret_sb;
+ }
+
+ if (ctx) {
+ if (ctx->blocksize) {
+ ret_sb = ctx->blocksize * 8;
+ if (ctx->blocksize == 1024)
+ ret_sb++;
+ ctx->superblock = ret_sb;
+ return ret_sb;
+ }
+ ctx->superblock = ret_sb;
+ ctx->blocksize = 1024;
+ }
+
+ if (!name || !manager)
+ goto cleanup;
+
+ if (manager->open(name, 0, &io) != 0)
+ goto cleanup;
+
+ if (ext2fs_get_mem(SUPERBLOCK_SIZE, &buf))
+ goto cleanup;
+ sb = (struct ext2_super_block *) buf;
+
+ for (blocksize=1024; blocksize <= 8192 ; blocksize = blocksize*2) {
+ superblock = blocksize*8;
+ if (blocksize == 1024)
+ superblock++;
+ io_channel_set_blksize(io, blocksize);
+ if (io_channel_read_blk(io, superblock,
+ -SUPERBLOCK_SIZE, buf))
+ continue;
+#ifdef EXT2FS_ENABLE_SWAPFS
+ if (sb->s_magic == ext2fs_swab16(EXT2_SUPER_MAGIC))
+ ext2fs_swap_super(sb);
+#endif
+ if (sb->s_magic == EXT2_SUPER_MAGIC) {
+ ret_sb = ctx->superblock = superblock;
+ ctx->blocksize = blocksize;
+ break;
+ }
+ }
+
+cleanup:
+ if (io)
+ io_channel_close(io);
+ if (buf)
+ ext2fs_free_mem(&buf);
+ return (ret_sb);
}
/*