#ifndef lint
static const char rcsid[] =
- "$Id: traverse.c,v 1.27 2001/03/20 09:14:58 stelian Exp $";
+ "$Id: traverse.c,v 1.31 2001/03/28 12:59:48 stelian Exp $";
#endif /* not lint */
#include <config.h>
static int searchdir __P((struct ext2_dir_entry *dp, int offset,
int blocksize, char *buf, void *private));
#else
-static int dirindir __P((ino_t ino, daddr_t blkno, int level, long *size));
-static void dmpindir __P((ino_t ino, daddr_t blk, int level, fsizeT *size));
-static int searchdir __P((ino_t ino, daddr_t blkno, long size, long filesize));
+static int dirindir __P((dump_ino_t ino, daddr_t blkno, int level, long *size));
+static void dmpindir __P((dump_ino_t ino, daddr_t blk, int level, fsizeT *size));
+static int searchdir __P((dump_ino_t ino, daddr_t blkno, long size, long filesize));
#endif
-static void mapfileino __P((ino_t ino, struct dinode const *dp, long *tapesize, int *dirskipped));
-static int exclude_ino __P((ino_t ino));
-extern ino_t iexclude_list[IEXCLUDE_MAXNUM]; /* the inode exclude list */
+static void mapfileino __P((dump_ino_t ino, struct dinode const *dp, long *tapesize, int *dirskipped));
+static int exclude_ino __P((dump_ino_t ino));
+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(journal_ino)) {
- iexclude_list[iexclude_num++] = journal_ino;
- msg("Added ext3 journal inode %d to exclude list\n",
- 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;
* This tests whether an inode is in the exclude list
*/
int
-exclude_ino(ino_t ino)
+exclude_ino(dump_ino_t ino)
{
/* 04-Feb-00 ILC */
if (iexclude_num) { /* if there are inodes in the exclude list */
* copy of the given inode, or be NULL (in which case it is fetched.)
*/
static void
-mapfileino(ino_t ino, struct dinode const *dp, long *tapesize, int *dirskipped)
+mapfileino(dump_ino_t ino, struct dinode const *dp, long *tapesize, int *dirskipped)
{
register int mode;
*/
#ifdef __linux__
int
-mapfiles(ino_t maxino, long *tapesize)
+mapfiles(dump_ino_t maxino, long *tapesize)
{
ext2_ino_t ino;
int anydirskipped = 0;
}
#else
int
-mapfiles(ino_t maxino, long *tapesize)
+mapfiles(dump_ino_t maxino, long *tapesize)
{
- register ino_t ino;
+ register dump_ino_t ino;
int anydirskipped = 0;
for (ino = ROOTINO; ino < maxino; ino++)
* the directories in the filesystem.
*/
int
-mapfilesfromdir(ino_t maxino, long *tapesize, char *directory)
+mapfilesfromdir(dump_ino_t maxino, long *tapesize, char *directory)
{
errcode_t retval;
struct mapfile_context mfc;
* pass using this algorithm.
*/
int
-mapdirs(ino_t maxino, long *tapesize)
+mapdirs(dump_ino_t maxino, long *tapesize)
{
register struct dinode *dp;
register int isdir;
register char *map;
- register ino_t ino;
+ register dump_ino_t ino;
#ifndef __linux__
register int i;
long filesize;
* require the directory to be dumped.
*/
static int
-dirindir(ino_t ino, daddr_t blkno, int ind_level, long *filesize)
+dirindir(dump_ino_t ino, daddr_t blkno, int ind_level, long *filesize)
{
int ret = 0;
register int i;
#else /* __linux__ */
static int
-searchdir(ino_t ino, daddr_t blkno, long size, long filesize)
+searchdir(dump_ino_t ino, daddr_t blkno, long size, long filesize)
{
register struct direct *dp;
register long loc, ret = 0;
#ifdef __linux__
struct block_context {
- ino_t ino;
+ ext2_ino_t ino;
int *buf;
int cnt;
int max;
* Dump the contents of an inode to tape.
*/
void
-dumpino(struct dinode *dp, ino_t ino)
+dumpino(struct dinode *dp, dump_ino_t ino)
{
unsigned long cnt;
fsizeT size;
bc.ino = ino;
bc.next_block = NDADDR;
- ext2fs_block_iterate2(fs, ino, 0, NULL, dumponeblock, (void *)&bc);
+ ext2fs_block_iterate2(fs, (ext2_ino_t)ino, 0, NULL, dumponeblock, (void *)&bc);
if (bc.cnt > 0) {
blksout (bc.buf, bc.cnt, bc.ino);
}
* Dumps a directory to tape after converting it to the BSD format
*/
void
-dumpdirino(struct dinode *dp, ino_t ino)
+dumpdirino(struct dinode *dp, dump_ino_t ino)
{
fsizeT size;
char buf[TP_BSIZE];
cdc.prev_offset = 0;
cdc.bs = MIN(DIRBLKSIZ, TP_BSIZE);
/* Do the conversion */
- retval = ext2fs_dir_iterate(fs, ino, 0, NULL, convert_dir, (void *)&cdc);
+ retval = ext2fs_dir_iterate(fs, (ext2_ino_t)ino, 0, NULL, convert_dir, (void *)&cdc);
if (retval) {
com_err(disk, retval, "while converting directory #%ld\n", (long)ino);
exit(X_ABORT);
* Read indirect blocks, and pass the data blocks to be dumped.
*/
static void
-dmpindir(ino_t ino, daddr_t blk, int ind_level, fsizeT *size)
+dmpindir(dump_ino_t ino, daddr_t blk, int ind_level, fsizeT *size)
{
int i, cnt;
#ifdef __linux__
* Collect up the data into tape record sized buffers and output them.
*/
void
-blksout(daddr_t *blkp, int frags, ino_t ino)
+blksout(daddr_t *blkp, int frags, dump_ino_t ino)
{
register daddr_t *bp;
int i, j, count, blks, tbperdb;
* Dump a map to the tape.
*/
void
-dumpmap(char *map, int type, ino_t ino)
+dumpmap(char *map, int type, dump_ino_t ino)
{
register int i;
char *cp;
#define int32_t __s32
#endif
void
-writeheader(ino_t ino)
+writeheader(dump_ino_t ino)
{
register int32_t sum, cnt, *lp;
#ifdef __linux__
struct dinode *
-getino(ino_t inum)
+getino(dump_ino_t inum)
{
static struct dinode dinode;
errcode_t err;
curino = inum;
- err = ext2fs_read_inode(fs, inum, (struct ext2_inode *) &dinode);
+ err = ext2fs_read_inode(fs, (ext2_ino_t)inum, (struct ext2_inode *) &dinode);
if (err) {
com_err(disk, err, "while reading inode #%ld\n", (long)inum);
exit(X_ABORT);
}
#else /* __linux__ */
struct dinode *
-getino(ino_t inum)
+getino(dump_ino_t inum)
{
static daddr_t minino, maxino;
static struct dinode inoblock[MAXINOPB];