#ifndef lint
static const char rcsid[] =
- "$Id: traverse.c,v 1.28 2001/03/20 10:02:48 stelian Exp $";
+ "$Id: traverse.c,v 1.32 2001/04/10 13:42:22 stelian Exp $";
#endif /* not lint */
#include <config.h>
extern dump_ino_t iexclude_list[IEXCLUDE_MAXNUM]; /* the inode exclude list */
extern int iexclude_num; /* number of elements in list */
-/* Temporary fix waiting for Andreas fixes... */
-#ifdef HAS_EXT2FS_EXT2_FS
+#ifdef HAVE_EXT2_JOURNAL_INUM
#define ext2_journal_ino(sb) (sb->s_journal_inum)
#else
-#define ext2_ino_t __u32
#define ext2_journal_ino(sb) (*((__u32 *)sb + 0x38))
#endif
+#ifndef HAVE_EXT2_INO_T
+typedef ino_t ext2_ino_t;
+#endif
#ifndef EXT3_FEATURE_COMPAT_HAS_JOURNAL
#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
#define EXT2_LIB_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_RECOVER | \
EXT2_FEATURE_INCOMPAT_FILETYPE)
#endif
+#ifndef EXT2_RESIZE_INO
+#define EXT2_RESIZE_INO 7
+#endif
int dump_fs_open(const char *disk, ext2_filsys *fs)
{
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);
+ dump_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 (es->s_feature_compat &
+ 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);
+ journal_ino && !exclude_ino(journal_ino)) {
+ iexclude_list[iexclude_num++] = journal_ino;
+ msg("Exclude ext3 journal inode %u\n",
+ journal_ino);
+ }
+ if (!exclude_ino(EXT2_RESIZE_INO))
+ iexclude_list[iexclude_num++] = EXT2_RESIZE_INO;
}
}
return retval;
}
#endif /* __linux__ */
+#ifdef __linux__
+int
+maponefile(dump_ino_t maxino, long *tapesize, char *directory)
+{
+ errcode_t retval;
+ ext2_ino_t dir_ino;
+ char dir_name [MAXPATHLEN];
+ int i, anydirskipped = 0;
+
+ /*
+ * Mark every directory in the path as being dumped
+ */
+ for (i = 0; i < strlen (directory); i++) {
+ if (directory[i] == '/') {
+ strncpy (dir_name, directory, i);
+ dir_name[i] = '\0';
+ retval = ext2fs_namei(fs, ROOTINO, ROOTINO,
+ dir_name, &dir_ino);
+ if (retval) {
+ com_err(disk, retval,
+ "while translating %s", dir_name);
+ exit(X_ABORT);
+ }
+ mapfileino((dump_ino_t) dir_ino, 0,
+ tapesize, &anydirskipped);
+ }
+ }
+ /*
+ * Mark the final directory
+ */
+ retval = ext2fs_namei(fs, ROOTINO, ROOTINO, directory, &dir_ino);
+ if (retval) {
+ com_err(disk, retval, "while translating %s", directory);
+ exit(X_ABORT);
+ }
+ mapfileino((dump_ino_t)dir_ino, 0, tapesize, &anydirskipped);
+
+ mapfileino(ROOTINO, 0, tapesize, &anydirskipped);
+
+ /*
+ * Restore gets very upset if the root is not dumped,
+ * so ensure that it always is dumped.
+ */
+ SETINO(ROOTINO, dumpdirmap);
+ return anydirskipped;
+}
+#endif /* __linux__ */
+
#ifdef __linux__
struct mapfile_context {
long *tapesize;