tags 516820 +pending
thanks

I found the problem; the following patch should fix things, and I have
this checked into the e2fsprogs SCM.

                                                - Ted

commit 606638906a0229323d1b2871fdb0d45ea0e7ff62
Author: Theodore Ts'o <ty...@mit.edu>
Date:   Thu May 28 23:40:18 2009 -0400

    e2fsck: Go back to the original superblock if the backup sb is invalid
    
    In the case where the block group descriptors appear corrupt, e2fsck
    will try to use the backup superblock.  However, it could be that the
    backup superblock itself is completely corrupted, in which e2fsck
    should go back to the original superblock instead of refusing to fix
    the file system.
    
    Addresses-Debian-Bug: #516820
    
    Signed-off-by: "Theodore Ts'o" <ty...@mit.edu>

diff --git a/e2fsck/unix.c b/e2fsck/unix.c
index 3e684ae..ffcdcc6 100644
--- a/e2fsck/unix.c
+++ b/e2fsck/unix.c
@@ -890,6 +890,38 @@ sscanf_err:
        exit (1);
 }
 
+static errcode_t try_open_fs(e2fsck_t ctx, int flags, io_manager io_ptr,
+                            ext2_filsys *ret_fs)
+{
+       errcode_t retval;
+
+       *ret_fs = NULL;
+       if (ctx->superblock && ctx->blocksize) {
+               retval = ext2fs_open2(ctx->filesystem_name, ctx->io_options,
+                                     flags, ctx->superblock, ctx->blocksize,
+                                     io_ptr, ret_fs);
+       } else if (ctx->superblock) {
+               int blocksize;
+               for (blocksize = EXT2_MIN_BLOCK_SIZE;
+                    blocksize <= EXT2_MAX_BLOCK_SIZE; blocksize *= 2) {
+                       if (*ret_fs) {
+                               ext2fs_free(*ret_fs);
+                               *ret_fs = NULL;
+                       }
+                       retval = ext2fs_open2(ctx->filesystem_name,
+                                             ctx->io_options, flags,
+                                             ctx->superblock, blocksize,
+                                             io_ptr, ret_fs);
+                       if (!retval)
+                               break;
+               }
+       } else
+               retval = ext2fs_open2(ctx->filesystem_name, ctx->io_options,
+                                     flags, 0, 0, io_ptr, ret_fs);
+       return retval;
+}
+
+
 static const char *my_ver_string = E2FSPROGS_VERSION;
 static const char *my_ver_date = E2FSPROGS_DATE;
 
@@ -903,6 +935,7 @@ int main (int argc, char *argv[])
        const char      *lib_ver_date;
        int             my_ver, lib_ver;
        e2fsck_t        ctx;
+       blk_t           orig_superblock;
        struct problem_context pctx;
        int flags, run_result;
        int journal_size;
@@ -974,26 +1007,8 @@ restart:
        if ((ctx->mount_flags & EXT2_MF_MOUNTED) == 0)
                flags |= EXT2_FLAG_EXCLUSIVE;
 
-       if (ctx->superblock && ctx->blocksize) {
-               retval = ext2fs_open2(ctx->filesystem_name, ctx->io_options,
-                                     flags, ctx->superblock, ctx->blocksize,
-                                     io_ptr, &fs);
-       } else if (ctx->superblock) {
-               int blocksize;
-               for (blocksize = EXT2_MIN_BLOCK_SIZE;
-                    blocksize <= EXT2_MAX_BLOCK_SIZE; blocksize *= 2) {
-                       if (fs)
-                               ext2fs_free(fs);
-                       retval = ext2fs_open2(ctx->filesystem_name,
-                                             ctx->io_options, flags,
-                                             ctx->superblock, blocksize,
-                                             io_ptr, &fs);
-                       if (!retval)
-                               break;
-               }
-       } else
-               retval = ext2fs_open2(ctx->filesystem_name, ctx->io_options,
-                                     flags, 0, 0, io_ptr, &fs);
+       retval = try_open_fs(ctx, flags, io_ptr, &fs);
+
        if (!ctx->superblock && !(ctx->options & E2F_OPT_PREEN) &&
            !(ctx->flags & E2F_FLAG_SB_SPECIFIED) &&
            ((retval == EXT2_ET_BAD_MAGIC) ||
@@ -1008,11 +1023,20 @@ restart:
                               ctx->program_name,
                               retval ? _("Superblock invalid,") :
                               _("Group descriptors look bad..."));
+                       orig_superblock = ctx->superblock;
                        get_backup_sb(ctx, fs, ctx->filesystem_name, io_ptr);
                        if (fs)
                                ext2fs_close(fs);
                        orig_retval = retval;
-                       goto restart;
+                       retval = try_open_fs(ctx, flags, io_ptr, &fs);
+                       if ((orig_retval == 0) && retval != 0) {
+                               com_err(ctx->program_name, retval,
+                                       "when using the backup blocks");
+                               printf(_("%s: going back to original "
+                                        "superblock\n"), ctx->program_name);
+                               ctx->superblock = orig_superblock;
+                               retval = try_open_fs(ctx, flags, io_ptr, &fs);
+                       }
                }
        }
        if (((retval == EXT2_ET_UNSUPP_FEATURE) ||



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to