Whamcloud - gitweb
LU-4017 e2fsprogs: always read full inode structure
[tools/e2fsprogs.git] / e2fsck / iscan.c
index 6501e1f..5190caa 100644 (file)
@@ -3,6 +3,7 @@
  * anything else)
  */
 
+#include "config.h"
 #include <string.h>
 #include <fcntl.h>
 #include <ctype.h>
@@ -15,9 +16,6 @@
 #ifdef HAVE_ERRNO_H
 #include <errno.h>
 #endif
-#ifdef HAVE_MNTENT_H
-#include <mntent.h>
-#endif
 #include <sys/ioctl.h>
 #ifdef HAVE_MALLOC_H
 #include <malloc.h>
@@ -51,7 +49,7 @@ static void usage(void)
 static void PRS(int argc, char *argv[])
 {
        int             flush = 0;
-       char            c;
+       int             c;
 #ifdef MTRACE
        extern void     *mallwatch;
 #endif
@@ -60,7 +58,7 @@ static void PRS(int argc, char *argv[])
        setbuf(stdout, NULL);
        setbuf(stderr, NULL);
        initialize_ext2_error_table();
-       
+
        if (argc && *argv)
                program_name = *argv;
        while ((c = getopt (argc, argv, "FI")) != EOF)
@@ -91,17 +89,19 @@ static void PRS(int argc, char *argv[])
                close(fd);
        }
 }
-                                       
+
 int main (int argc, char *argv[])
 {
        errcode_t       retval = 0;
        int             exit_value = FSCK_OK;
        ext2_filsys     fs;
        ext2_ino_t      ino;
-       int     num_inodes = 0;
-       struct ext2_inode inode;
+       __u32   num_inodes = 0;
+       struct ext2_inode *inode = NULL;
+       int             inode_size;
+       int             ret = 0;
        ext2_inode_scan scan;
-       
+
        init_resource_track(&global_rtrack);
 
        PRS(argc, argv);
@@ -109,33 +109,46 @@ int main (int argc, char *argv[])
        retval = ext2fs_open(device_name, 0,
                             0, 0, unix_io_manager, &fs);
        if (retval) {
-               com_err(program_name, retval, _("while trying to open %s"),
+               com_err(program_name, retval, _("while trying to open '%s'"),
                        device_name);
                exit(1);
        }
 
        ehandler_init(fs->io);
-       
+
        retval = ext2fs_open_inode_scan(fs, inode_buffer_blocks, &scan);
        if (retval) {
                com_err(program_name, retval, _("while opening inode scan"));
+               ext2fs_close_free(&fs);
+               exit(1);
+       }
+
+       inode_size = EXT2_INODE_SIZE(current_fs->super);
+       retval = ext2fs_get_mem(inode_size, &inode);
+       if (retval) {
+               ext2fs_close_inode_scan(&scan);
+               ext2fs_close_free(&fs);
                exit(1);
        }
 
        while (1) {
-               retval = ext2fs_get_next_inode(scan, &ino, &inode);
+               retval = ext2fs_get_next_inode_full(scan, &ino,
+                                               inode, inode_size);
                if (retval) {
                        com_err(program_name, retval,
                                _("while getting next inode"));
+                       ext2fs_close_inode_scan(&scan);
+                       ext2fs_close_free(&fs);
+                       ext2fs_free_mem(&inode);
                        exit(1);
                }
                if (ino == 0)
                        break;
                num_inodes++;
        }
-       
+       ext2fs_free_mem(&inode);
        print_resource_track(NULL, &global_rtrack);
-       printf(_("%d inodes scanned.\n"), num_inodes);
-       
+       printf(_("%u inodes scanned.\n"), num_inodes);
+
        exit(0);
 }