X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Ftraverse.c;h=5833da7a4cdf8739b35d528b4ef528f74d1ac336;hb=d6967896bc4e18f9b4359a2ef5be5c0f1bcc456a;hp=c4e739c30bced74fd7237df7f27e3f62f800a613;hpb=ec387a1267f4cac7625cd5b6d1c1f080d39085b3;p=dump.git diff --git a/dump/traverse.c b/dump/traverse.c index c4e739c..5833da7 100644 --- a/dump/traverse.c +++ b/dump/traverse.c @@ -2,8 +2,8 @@ * Ported to Linux's Second Extended File System as part of the * dump and restore backup suit * Remy Card , 1994-1997 - * Stelian Pop , 1999 - * + * Stelian Pop , 1999-2000 + * Stelian Pop - AlcĂ´ve , 2000 */ /*- @@ -37,10 +37,14 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $Id: traverse.c,v 1.5 1999/10/11 13:31:11 stelian Exp $ */ +#ifndef lint +static const char rcsid[] = + "$Id: traverse.c,v 1.25 2000/12/21 11:14:54 stelian Exp $"; +#endif /* not lint */ + +#include #include #include #ifdef __linux__ @@ -82,21 +86,58 @@ #define HASDUMPEDFILE 0x1 #define HASSUBDIRS 0x2 +#ifdef __linux__ +typedef u_quad_t fsizeT; +#else #ifdef FS_44INODEFMT typedef quad_t fsizeT; #else typedef long fsizeT; #endif +#endif #ifdef __linux__ static int searchdir __P((struct ext2_dir_entry *dp, int offset, int blocksize, char *buf, void *private)); -loff_t llseek (int fd, loff_t offset, int origin); #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)); #endif +static void mapfileino __P((ino_t ino, struct dinode const *dp, long *tapesize, int *dirskipped)); +static int exclude_ino __P((ino_t ino)); + +/* #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 */ +#ifdef EXT3_FEATURE_INCOMPAT_RECOVER +#define FORCE_OPEN EXT2_FLAG_FORCE +#else +#define FORCE_OPEN 0 +#endif + +int dump_fs_open(const char *disk, ext2_filsys *fs) +{ + int retval; + struct ext2fs_sb *s; + + retval = ext2fs_open(disk, FORCE_OPEN, 0, 0, unix_io_manager, fs); +#if defined(EXT2_LIB_FEATURE_COMPAT_SUPP) && defined(EXT2_LIB_FEATURE_INCOMPAT_SUPP) && defined(EXT2_LIB_FEATURE_RO_COMPAT_SUPP) && defined(EXT2_ET_UNSUPP_FEATURE) && defined(EXT2_ET_RO_UNSUPP_FEATURE) + if (!retval) { + s = (struct ext2fs_sb *) (*fs)->super; + if ((s->s_feature_compat & ~EXT2_LIB_FEATURE_COMPAT_SUPP) || +#ifdef EXT3_FEATURE_INCOMPAT_RECOVER + (s->s_feature_incompat & ~(EXT3_FEATURE_INCOMPAT_RECOVER | EXT2_LIB_FEATURE_INCOMPAT_SUPP))) { +#else + (s->s_feature_incompat & ~EXT2_LIB_FEATURE_INCOMPAT_SUPP)) { +#endif + retval = EXT2_ET_UNSUPP_FEATURE; + } + else if (s->s_feature_ro_compat & ~EXT2_LIB_FEATURE_RO_COMPAT_SUPP) { + retval = EXT2_ET_RO_UNSUPP_FEATURE; + } + } +#endif /* defined && defined && defined... */ + return retval; +} /* * This is an estimation of the number of TP_BSIZE blocks in the file. @@ -106,9 +147,10 @@ static int searchdir __P((ino_t ino, daddr_t blkno, long size, long filesize)); * hence the estimate may be high. */ long -blockest(struct dinode *dp) +blockest(struct dinode const *dp) { long blkest, sizeest; + u_quad_t i_size; /* * dp->di_size is the size of the file in bytes. @@ -124,19 +166,20 @@ blockest(struct dinode *dp) * dump blocks (sizeest vs. blkest in the indirect block * calculation). */ - blkest = howmany(dbtob(dp->di_blocks), TP_BSIZE); - sizeest = howmany(dp->di_size, TP_BSIZE); + blkest = howmany((u_quad_t)dp->di_blocks*fs->blocksize, TP_BSIZE); + i_size = dp->di_size + ((u_quad_t) dp->di_size_high << 32); + sizeest = howmany(i_size, TP_BSIZE); if (blkest > sizeest) blkest = sizeest; #ifdef __linux__ - if (dp->di_size > fs->blocksize * NDADDR) { + if (i_size > fs->blocksize * NDADDR) { /* calculate the number of indirect blocks on the dump tape */ blkest += howmany(sizeest - NDADDR * fs->blocksize / TP_BSIZE, - TP_NINDIR); + NINDIR(sblock) * EXT2_FRAGS_PER_BLOCK(fs->super)); } #else - if (dp->di_size > sblock->fs_bsize * NDADDR) { + if (i_size > sblock->fs_bsize * NDADDR) { /* calculate the number of indirect blocks on the dump tape */ blkest += howmany(sizeest - NDADDR * sblock->fs_bsize / TP_BSIZE, @@ -146,19 +189,88 @@ blockest(struct dinode *dp) return (blkest + 1); } +extern ino_t iexclude_list[IEXCLUDE_MAXNUM]; /* the inode exclude list */ +extern int iexclude_num; /* number of elements in the list */ + +/* + * This tests whether an inode is in the exclude list + */ +int +exclude_ino(ino_t ino) +{ + /* 04-Feb-00 ILC */ + if (iexclude_num) { /* if there are inodes in the exclude list */ + int idx; /* then check this inode against it */ + for (idx = 0; idx < iexclude_num; idx++) + if (ino == iexclude_list[idx]) + return 1; + } + return 0; +} + /* Auxiliary macro to pick up files changed since previous dump. */ #define CHANGEDSINCE(dp, t) \ ((dp)->di_mtime >= (t) || (dp)->di_ctime >= (t)) -/* The WANTTODUMP macro decides whether a file should be dumped. */ +/* The NODUMP_FLAG macro tests if a file has the nodump flag. */ #ifdef UF_NODUMP -#define WANTTODUMP(dp) \ - (CHANGEDSINCE(dp, spcl.c_ddate) && \ - (nonodump || ((dp)->di_flags & UF_NODUMP) != UF_NODUMP)) +#define NODUMP_FLAG(dp) (!nonodump && (((dp)->di_flags & UF_NODUMP) == UF_NODUMP)) #else -#define WANTTODUMP(dp) CHANGEDSINCE(dp, spcl.c_ddate) +#define NODUMP_FLAG(dp) 0 #endif +/* The WANTTODUMP macro decides whether a file should be dumped. */ +#define WANTTODUMP(dp, ino) \ + (CHANGEDSINCE(dp, spcl.c_ddate) && \ + (!NODUMP_FLAG(dp)) && \ + (!exclude_ino(ino))) + +/* + * Determine if given inode should be dumped. "dp" must either point to a + * 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) +{ + register int mode; + + /* + * Skip inode if we've already marked it for dumping + */ + if (TSTINO(ino, usedinomap)) + return; + if (!dp) + dp = getino(ino); + if ((mode = (dp->di_mode & IFMT)) == 0) + return; +#ifdef __linux__ + if (dp->di_nlink == 0 || dp->di_dtime != 0) + return; +#endif + /* + * Put all dirs in dumpdirmap, inodes that are to be dumped in the + * used map. All inode but dirs who have the nodump attribute go + * to the usedinomap. + */ + SETINO(ino, usedinomap); + + if (mode == IFDIR) + SETINO(ino, dumpdirmap); + if (WANTTODUMP(dp, ino)) { + SETINO(ino, dumpinomap); + if (mode != IFREG && mode != IFDIR && mode != IFLNK) + *tapesize += 1; + else + *tapesize += blockest(dp); + return; + } + if (mode == IFDIR) { + if ( NODUMP_FLAG(dp) || exclude_ino(ino) ) + CLRINO(ino, usedinomap); + *dirskipped = 1; + } +} + /* * Dump pass 1. * @@ -166,36 +278,60 @@ blockest(struct dinode *dp) * that have been modified since the previous dump time. Also, find all * the directories in the filesystem. */ +#ifdef __linux__ int mapfiles(ino_t maxino, long *tapesize) { - register int mode; - register ino_t ino; - register struct dinode *dp; + ino_t ino; int anydirskipped = 0; + ext2_inode_scan scan; + errcode_t err; + struct ext2_inode inode; - for (ino = ROOTINO; ino < maxino; ino++) { - dp = getino(ino); - if ((mode = (dp->di_mode & IFMT)) == 0) - continue; -#ifdef __linux__ - if (dp->di_nlink == 0 || dp->di_dtime != 0) - continue; -#endif - SETINO(ino, usedinomap); - if (mode == IFDIR) - SETINO(ino, dumpdirmap); - if (WANTTODUMP(dp)) { - SETINO(ino, dumpinomap); - if (mode != IFREG && mode != IFDIR && mode != IFLNK) - *tapesize += 1; - else - *tapesize += blockest(dp); + /* + * We use libext2fs's inode scanning routines, which are particularly + * robust. (Note that getino cannot return an error.) + */ + err = ext2fs_open_inode_scan(fs, 0, &scan); + if (err) { + com_err(disk, err, "while opening inodes\n"); + exit(X_ABORT); + } + for (;;) { + err = ext2fs_get_next_inode(scan, &ino, &inode); + if (err == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE) continue; + if (err) { + com_err(disk, err, "while scanning inode #%ld\n", + (long)ino); + exit(X_ABORT); } - if (mode == IFDIR) - anydirskipped = 1; + if (ino == 0) + break; + + curino = ino; + mapfileino(ino, (struct dinode const *)&inode, tapesize, + &anydirskipped); } + ext2fs_close_inode_scan(scan); + + /* + * Restore gets very upset if the root is not dumped, + * so ensure that it always is dumped. + */ + SETINO(ROOTINO, dumpinomap); + return (anydirskipped); +} +#else +int +mapfiles(ino_t maxino, long *tapesize) +{ + register ino_t ino; + int anydirskipped = 0; + + for (ino = ROOTINO; ino < maxino; ino++) + mapfileino(ino, tapesize, &anydirskipped); + /* * Restore gets very upset if the root is not dumped, * so ensure that it always is dumped. @@ -203,47 +339,38 @@ mapfiles(ino_t maxino, long *tapesize) SETINO(ROOTINO, dumpinomap); return (anydirskipped); } +#endif /* __linux__ */ #ifdef __linux__ struct mapfile_context { long *tapesize; - int anydirskipped; + int *anydirskipped; }; static int mapfilesindir(struct ext2_dir_entry *dirent, int offset, int blocksize, char *buf, void *private) { - register struct dinode *dp; + register struct dinode const *dp; register int mode; - ino_t ino; errcode_t retval; struct mapfile_context *mfc; + ino_t ino; ino = dirent->inode; mfc = (struct mapfile_context *)private; - dp = getino(ino); - if ((mode = (dp->di_mode & IFMT)) != 0 && - dp->di_nlink != 0 && dp->di_dtime == 0) { - SETINO(ino, usedinomap); - if (mode == IFDIR) - SETINO(ino, dumpdirmap); - if (WANTTODUMP(dp)) { - SETINO(ino, dumpinomap); - if (mode != IFREG && mode != IFDIR && mode != IFLNK) - *mfc->tapesize += 1; - else - *mfc->tapesize += blockest(dp); - } - if (mode == IFDIR) { - mfc->anydirskipped = 1; - if ((dirent->name[0] != '.' || dirent->name_len != 1) && - (dirent->name[0] != '.' || dirent->name[1] != '.' || - dirent->name_len != 2)) { - retval = ext2fs_dir_iterate(fs, ino, 0, NULL, - mapfilesindir, private); - if (retval) - return retval; - } + dp = getino(dirent->inode); + + mapfileino(dirent->inode, dp, mfc->tapesize, mfc->anydirskipped); + + mode = dp->di_mode & IFMT; + if (mode == IFDIR && dp->di_nlink != 0 && dp->di_dtime == 0) { + if ((dirent->name[0] != '.' || ( dirent->name_len & 0xFF ) != 1) && + (dirent->name[0] != '.' || dirent->name[1] != '.' || + ( dirent->name_len & 0xFF ) != 2)) { + retval = ext2fs_dir_iterate(fs, ino, 0, NULL, + mapfilesindir, private); + if (retval) + return retval; } } return 0; @@ -263,7 +390,7 @@ mapfilesfromdir(ino_t maxino, long *tapesize, char *directory) struct mapfile_context mfc; ino_t dir_ino; char dir_name [MAXPATHLEN]; - int i; + int i, anydirskipped = 0; /* * Mark every directory in the path as being dumped @@ -279,8 +406,7 @@ mapfilesfromdir(ino_t maxino, long *tapesize, char *directory) dir_name); exit(X_ABORT); } -/* SETINO(dir_ino, dumpinomap); */ - SETINO(dir_ino, dumpdirmap); + mapfileino(dir_ino, 0, tapesize, &anydirskipped); } } /* @@ -291,11 +417,10 @@ mapfilesfromdir(ino_t maxino, long *tapesize, char *directory) com_err(disk, retval, "while translating %s", directory); exit(X_ABORT); } -/* SETINO(dir_ino, dumpinomap); */ - SETINO(dir_ino, dumpdirmap); + mapfileino(dir_ino, 0, tapesize, &anydirskipped); mfc.tapesize = tapesize; - mfc.anydirskipped = 0; + mfc.anydirskipped = &anydirskipped; retval = ext2fs_dir_iterate(fs, dir_ino, 0, NULL, mapfilesindir, (void *)&mfc); @@ -303,16 +428,28 @@ mapfilesfromdir(ino_t maxino, long *tapesize, char *directory) com_err(disk, retval, "while mapping files in %s", directory); exit(X_ABORT); } + /* + * Ensure that the root inode actually appears in the file list + * for a subdir + */ + mapfileino(ROOTINO, 0, tapesize, &anydirskipped); /* * Restore gets very upset if the root is not dumped, * so ensure that it always is dumped. */ -/* SETINO(ROOTINO, dumpinomap); */ - SETINO(ROOTINO, dumpdirmap); - return (mfc.anydirskipped); + SETINO(ROOTINO, dumpinomap); + return anydirskipped; } #endif +#ifdef __linux__ +struct mapdirs_context { + int *ret; + int nodump; + long *tapesize; +}; +#endif + /* * Dump pass 2. * @@ -335,8 +472,10 @@ mapdirs(ino_t maxino, long *tapesize) #ifndef __linux__ register int i; long filesize; +#else + struct mapdirs_context mdc; #endif - int ret, change = 0; + int ret, change = 0, nodump; isdir = 0; /* XXX just to get gcc to shut up */ for (map = dumpdirmap, ino = 1; ino < maxino; ino++) { @@ -344,12 +483,24 @@ mapdirs(ino_t maxino, long *tapesize) isdir = *map++; else isdir >>= 1; - if ((isdir & 1) == 0 || TSTINO(ino, dumpinomap)) + /* + * If dir has been removed from the used map, it's either + * because it had the nodump flag, or it herited it from + * its parent. A directory can't be in dumpinomap if not + * in usedinomap, but we have to go through it anyway + * to propagate the nodump attribute. + */ + nodump = (TSTINO(ino, usedinomap) == 0); + if ((isdir & 1) == 0 || + (TSTINO(ino, dumpinomap) && nodump == 0)) continue; dp = getino(ino); #ifdef __linux__ ret = 0; - ext2fs_dir_iterate(fs, ino, 0, NULL, searchdir, (void *) &ret); + mdc.ret = &ret; + mdc.nodump = nodump; + mdc.tapesize = tapesize; + ext2fs_dir_iterate(fs, ino, 0, NULL, searchdir, (void *) &mdc); #else /* __linux__ */ filesize = dp->di_size; for (ret = 0, i = 0; filesize > 0 && i < NDADDR; i++) { @@ -374,7 +525,11 @@ mapdirs(ino_t maxino, long *tapesize) change = 1; continue; } - if ((ret & HASSUBDIRS) == 0) { + if (nodump) { + if (ret & HASSUBDIRS) + change = 1; /* subdirs have inherited nodump */ + CLRINO(ino, dumpdirmap); + } else if ((ret & HASSUBDIRS) == 0) { if (!TSTINO(ino, dumpinomap)) { CLRINO(ino, dumpdirmap); change = 1; @@ -430,25 +585,46 @@ dirindir(ino_t ino, daddr_t blkno, int ind_level, long *filesize) static int searchdir(struct ext2_dir_entry *dp, int offset, int blocksize, char *buf, void *private) { - int *ret = (int *) private; + struct mapdirs_context *mdc; + int *ret; + long *tapesize; + struct dinode *ip; + + mdc = (struct mapdirs_context *)private; + ret = mdc->ret; + tapesize = mdc->tapesize; if (dp->inode == 0) return 0; if (dp->name[0] == '.') { - if (dp->name_len == 1) + if (( dp->name_len & 0xFF ) == 1) return 0; - if (dp->name[1] == '.' && dp->name_len == 2) + if (dp->name[1] == '.' && ( dp->name_len & 0xFF ) == 2) return 0; } - if (TSTINO(dp->inode, dumpinomap)) { - *ret |= HASDUMPEDFILE; - if (*ret & HASSUBDIRS) - return DIRENT_ABORT; - } - if (TSTINO(dp->inode, dumpdirmap)) { - *ret |= HASSUBDIRS; - if (*ret & HASDUMPEDFILE) - return DIRENT_ABORT; + if (mdc->nodump) { + ip = getino(dp->inode); + if (TSTINO(dp->inode, dumpinomap)) { + CLRINO(dp->inode, dumpinomap); + CLRINO(dp->inode, usedinomap); + *tapesize -= blockest(ip); + } + /* Add dir back to the dir map, to propagate nodump */ + if ((ip->di_mode & IFMT) == IFDIR) { + SETINO(dp->inode, dumpdirmap); + *ret |= HASSUBDIRS; + } + } else { + if (TSTINO(dp->inode, dumpinomap)) { + *ret |= HASDUMPEDFILE; + if (*ret & HASSUBDIRS) + return DIRENT_ABORT; + } + if (TSTINO(dp->inode, dumpdirmap)) { + *ret |= HASSUBDIRS; + if (*ret & HASDUMPEDFILE) + return DIRENT_ABORT; + } } return 0; } @@ -509,7 +685,8 @@ struct block_context { * Dump a block to the tape */ static int -dumponeblock(ext2_filsys fs, blk_t *blocknr, int blockcnt, void *private) +dumponeblock(ext2_filsys fs, blk_t *blocknr, e2_blkcnt_t blockcnt, + blk_t ref_block, int ref_offset, void * private) { struct block_context *p; int i; @@ -542,7 +719,7 @@ dumponeblock(ext2_filsys fs, blk_t *blocknr, int blockcnt, void *private) void dumpino(struct dinode *dp, ino_t ino) { - int cnt; + unsigned long cnt; fsizeT size; char buf[TP_BSIZE]; struct old_bsd_inode obi; @@ -551,6 +728,7 @@ dumpino(struct dinode *dp, ino_t ino) #else int ind_level; #endif + u_quad_t i_size = dp->di_size + ((u_quad_t) dp->di_size_high << 32); if (newtape) { newtape = 0; @@ -562,7 +740,7 @@ dumpino(struct dinode *dp, ino_t ino) obi.di_mode = dp->di_mode; obi.di_uid = dp->di_uid; obi.di_gid = dp->di_gid; - obi.di_qsize.v = (u_quad_t)dp->di_size; + obi.di_qsize.v = i_size; obi.di_atime = dp->di_atime; obi.di_mtime = dp->di_mtime; obi.di_ctime = dp->di_ctime; @@ -571,8 +749,8 @@ dumpino(struct dinode *dp, ino_t ino) obi.di_flags = dp->di_flags; obi.di_gen = dp->di_gen; memmove(&obi.di_db, &dp->di_db, (NDADDR + NIADDR) * sizeof(daddr_t)); - if (dp->di_file_acl || dp->di_dir_acl) - warn("ACLs in inode #%ld won't be dumped", ino); + if (dp->di_file_acl) + warn("ACLs in inode #%ld won't be dumped", (long)ino); memmove(&spcl.c_dinode, &obi, sizeof(obi)); #else /* __linux__ */ spcl.c_dinode = *dp; @@ -598,8 +776,8 @@ dumpino(struct dinode *dp, ino_t ino) * Check for short symbolic link. */ #ifdef __linux__ - if (dp->di_size > 0 && - dp->di_size < EXT2_N_BLOCKS * sizeof (daddr_t)) { + if (i_size > 0 && + i_size < EXT2_N_BLOCKS * sizeof (daddr_t)) { spcl.c_addr[0] = 1; spcl.c_count = 1; writeheader(ino); @@ -627,7 +805,7 @@ dumpino(struct dinode *dp, ino_t ino) case S_IFDIR: #endif case S_IFREG: - if (dp->di_size > 0) + if (i_size) break; /* fall through */ @@ -642,16 +820,16 @@ dumpino(struct dinode *dp, ino_t ino) msg("Warning: undefined file type 0%o\n", dp->di_mode & IFMT); return; } - if (dp->di_size > NDADDR * sblock->fs_bsize) + if (i_size > NDADDR * sblock->fs_bsize) #ifdef __linux__ cnt = NDADDR * EXT2_FRAGS_PER_BLOCK(fs->super); #else cnt = NDADDR * sblock->fs_frag; #endif else - cnt = howmany(dp->di_size, sblock->fs_fsize); + cnt = howmany(i_size, sblock->fs_fsize); blksout(&dp->di_db[0], cnt, ino); - if ((size = dp->di_size - NDADDR * sblock->fs_bsize) <= 0) + if ((quad_t) (size = i_size - NDADDR * sblock->fs_bsize) <= 0) return; #ifdef __linux__ bc.max = NINDIR(sblock) * EXT2_FRAGS_PER_BLOCK(fs->super); @@ -660,10 +838,11 @@ dumpino(struct dinode *dp, ino_t ino) bc.ino = ino; bc.next_block = NDADDR; - ext2fs_block_iterate (fs, ino, 0, NULL, dumponeblock, (void *)&bc); + ext2fs_block_iterate2(fs, ino, 0, NULL, dumponeblock, (void *)&bc); if (bc.cnt > 0) { blksout (bc.buf, bc.cnt, bc.ino); } + free(bc.buf); #else for (ind_level = 0; ind_level < NIADDR; ind_level++) { dmpindir(ino, dp->di_ib[ind_level], ind_level, &size); @@ -692,24 +871,23 @@ static int convert_dir(struct ext2_dir_entry *dirent, int offset, int blocksize, char *buf, void *private) { struct convert_dir_context *p; - struct direct *dp; + struct olddirect *dp; int reclen; p = (struct convert_dir_context *)private; - reclen = EXT2_DIR_REC_LEN(dirent->name_len + 1); + reclen = EXT2_DIR_REC_LEN((dirent->name_len & 0xFF) + 1); if (((p->offset + reclen - 1) / p->bs) != (p->offset / p->bs)) { - dp = (struct direct *)(p->buf + p->prev_offset); + dp = (struct olddirect *)(p->buf + p->prev_offset); dp->d_reclen += p->bs - (p->offset % p->bs); p->offset += p->bs - (p->offset % p->bs); } - dp = (struct direct *)(p->buf + p->offset); + dp = (struct olddirect *)(p->buf + p->offset); dp->d_ino = dirent->inode; dp->d_reclen = reclen; - dp->d_type = 0; - dp->d_namlen = dirent->name_len; - strncpy(dp->d_name, dirent->name, dirent->name_len); + dp->d_namlen = dirent->name_len & 0xFF; + strncpy(dp->d_name, dirent->name, dp->d_namlen); dp->d_name[dp->d_namlen] = '\0'; p->prev_offset = p->offset; p->offset += reclen; @@ -754,7 +932,7 @@ dumpdirino(struct dinode *dp, ino_t ino) /* Do the conversion */ retval = ext2fs_dir_iterate(fs, ino, 0, NULL, convert_dir, (void *)&cdc); if (retval) { - com_err(disk, retval, "while converting directory #%ld\n", ino); + com_err(disk, retval, "while converting directory #%ld\n", (long)ino); exit(X_ABORT); } /* Fix the last entry */ @@ -780,8 +958,8 @@ dumpdirino(struct dinode *dp, ino_t ino) obi.di_flags = dp->di_flags; obi.di_gen = dp->di_gen; memmove(&obi.di_db, &dp->di_db, (NDADDR + NIADDR) * sizeof(daddr_t)); - if (dp->di_file_acl || dp->di_dir_acl) - warn("ACLs in inode #%ld won't be dumped", ino); + if (dp->di_file_acl) + warn("ACLs in inode #%ld won't be dumped", (long)ino); memmove(&spcl.c_dinode, &obi, sizeof(obi)); #else /* __linux__ */ spcl.c_dinode = *dp; @@ -971,9 +1149,14 @@ struct dinode * getino(ino_t inum) { static struct dinode dinode; + errcode_t err; curino = inum; - ext2fs_read_inode(fs, inum, (struct ext2_inode *) &dinode); + err = ext2fs_read_inode(fs, inum, (struct ext2_inode *) &dinode); + if (err) { + com_err(disk, err, "while reading inode #%ld\n", (long)inum); + exit(X_ABORT); + } return &dinode; } #else /* __linux__ */ @@ -1011,8 +1194,8 @@ bread(daddr_t blkno, char *buf, int size) loop: #ifdef __linux__ - if (llseek(diskfd, ((ext2_loff_t)blkno << dev_bshift), 0) != - ((ext2_loff_t)blkno << dev_bshift)) + if (ext2fs_llseek(diskfd, (((ext2_loff_t)blkno) << dev_bshift), 0) != + (((ext2_loff_t)blkno) << dev_bshift)) #else if (lseek(diskfd, ((off_t)blkno << dev_bshift), 0) != ((off_t)blkno << dev_bshift)) @@ -1057,8 +1240,8 @@ loop: memset(buf, 0, size); for (i = 0; i < size; i += dev_bsize, buf += dev_bsize, blkno++) { #ifdef __linux__ - if (llseek(diskfd, ((ext2_loff_t)blkno << dev_bshift), 0) != - ((ext2_loff_t)blkno << dev_bshift)) + if (ext2fs_llseek(diskfd, (((ext2_loff_t)blkno) << dev_bshift), 0) != + (((ext2_loff_t)blkno) << dev_bshift)) #else if (lseek(diskfd, ((off_t)blkno << dev_bshift), 0) != ((off_t)blkno << dev_bshift))