+#ifndef EXT3_FEATURE_INCOMPAT_RECOVER
+#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004
+#endif
+#ifndef EXT3_FEATURE_INCOMPAT_JOURNAL_DEV
+#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008
+#endif
+
+#ifndef EXT2_LIB_FEATURE_INCOMPAT_SUPP
+#define EXT2_LIB_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_RECOVER | \
+ EXT2_FEATURE_INCOMPAT_FILETYPE)
+#endif
+
+int dump_fs_open(const char *disk, ext2_filsys *fs)
+{
+ int retval;
+
+ retval = ext2fs_open(disk, EXT2_FLAG_FORCE, 0, 0, unix_io_manager, fs);
+ if (!retval) {
+ struct ext2_super_block *es = (*fs)->super;
+ ext2_ino_t journal_ino = ext2_journal_ino(es);
+
+ if (es->s_feature_incompat & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV){
+ fprintf(stderr, "This an journal, not a filesystem!\n");
+ retval = EXT2_ET_UNSUPP_FEATURE;
+ ext2fs_close(*fs);
+ }
+ else if ((retval = es->s_feature_incompat &
+ ~(EXT2_LIB_FEATURE_INCOMPAT_SUPP |
+ EXT3_FEATURE_INCOMPAT_RECOVER))) {
+ fprintf(stderr,
+ "Unsupported feature(s) 0x%x in filesystem\n",
+ retval);
+ retval = EXT2_ET_UNSUPP_FEATURE;
+ ext2fs_close(*fs);
+ }
+ else if (es->s_feature_compat &
+ EXT3_FEATURE_COMPAT_HAS_JOURNAL &&
+ journal_ino &&
+ !exclude_ino((dump_ino_t)journal_ino)) {
+ iexclude_list[iexclude_num++] = (dump_ino_t)journal_ino;
+ msg("Added ext3 journal inode %d to exclude list\n",
+ journal_ino);
+ }
+ }
+ return retval;
+}