Whamcloud - gitweb
e2fsck: allow to fix some superblock corruptions
[tools/e2fsprogs.git] / lib / ext2fs / read_bb_file.c
index 40c34ee..8d1ad1a 100644 (file)
@@ -4,11 +4,12 @@
  * Copyright (C) 1994, 1995, 2000 Theodore Ts'o.
  *
  * %Begin-Header%
- * This file may be redistributed under the terms of the GNU Public
- * License.
+ * This file may be redistributed under the terms of the GNU Library
+ * General Public License, version 2.
  * %End-Header%
  */
 
+#include "config.h"
 #include <stdio.h>
 #include <string.h>
 #if HAVE_UNISTD_H
@@ -29,7 +30,7 @@
 /*
  * Reads a list of bad blocks from  a FILE *
  */
-errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, 
+errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
                               ext2_badblocks_list *bb_list,
                               void *priv_data,
                               void (*invalid)(ext2_filsys fs,
@@ -38,7 +39,7 @@ errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
                                               void *priv_data))
 {
        errcode_t       retval;
-       blk_t           blockno;
+       blk64_t         blockno;
        int             count;
        char            buf[128];
 
@@ -54,12 +55,15 @@ errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
        while (!feof (f)) {
                if (fgets(buf, sizeof(buf), f) == NULL)
                        break;
-               count = sscanf(buf, "%u", &blockno);
+               count = sscanf(buf, "%llu", &blockno);
                if (count <= 0)
                        continue;
+               /* Badblocks isn't going to be updated for 64bit */
+               if (blockno >> 32)
+                       return EOVERFLOW;
                if (fs &&
                    ((blockno < fs->super->s_first_data_block) ||
-                   (blockno >= fs->super->s_blocks_count))) {
+                    (blockno >= ext2fs_blocks_count(fs->super)))) {
                        if (invalid)
                                (invalid)(fs, blockno, buf, priv_data);
                        continue;
@@ -71,26 +75,34 @@ errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
        return 0;
 }
 
+struct compat_struct {
+       void (*invalid)(ext2_filsys, blk_t);
+};
+
 static void call_compat_invalid(ext2_filsys fs, blk_t blk,
-                               char *badstr EXT2FS_ATTR((unused)), 
+                               char *badstr EXT2FS_ATTR((unused)),
                                void *priv_data)
 {
-       void (*invalid)(ext2_filsys, blk_t);
+       struct compat_struct *st;
 
-       invalid = (void (*)(ext2_filsys, blk_t)) priv_data;
-       if (invalid)
-               invalid(fs, blk);
+       st = (struct compat_struct *) priv_data;
+       if (st->invalid)
+               (st->invalid)(fs, blk);
 }
 
 
 /*
  * Reads a list of bad blocks from  a FILE *
  */
-errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, 
+errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
                              ext2_badblocks_list *bb_list,
                              void (*invalid)(ext2_filsys fs, blk_t blk))
 {
-       return ext2fs_read_bb_FILE2(fs, f, bb_list, (void *) invalid,
+       struct compat_struct st;
+
+       st.invalid = invalid;
+
+       return ext2fs_read_bb_FILE2(fs, f, bb_list, &st,
                                    call_compat_invalid);
 }