diff --git a/sbin/fsck/bswap.c b/sbin/fsck/bswap.c new file mode 100644 index 000000000000..eb30f6c8d171 --- /dev/null +++ b/sbin/fsck/bswap.c @@ -0,0 +1,47 @@ +/* $NetBSD: bswap.c,v 1.1 1997/10/09 13:19:32 bouyer Exp $ */ + +/* + * Written by Manuel Bouyer . + * Public domain. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char *rcsid = "$NetBSD: bswap.c,v 1.1 1997/10/09 13:19:32 bouyer Exp $"; +#endif + +#include + +#undef bswap64 + +#ifndef bswap16 +u_int16_t +bswap16(x) + u_int16_t x; +{ + return ((x << 8) & 0xff00) | ((x >> 8) & 0x00ff); +} +#endif + +#ifndef bswap32 +u_int32_t +bswap32(x) + u_int32_t x; +{ + return ((x << 24) & 0xff000000 ) | + ((x << 8) & 0x00ff0000 ) | + ((x >> 8) & 0x0000ff00 ) | + ((x >> 24) & 0x000000ff ); +} +#endif + +u_int64_t +bswap64(x) + u_int64_t x; +{ + u_int32_t *p = (u_int32_t*)&x; + u_int32_t t; + t = bswap32(p[0]); + p[0] = bswap32(p[1]); + p[1] = t; + return x; +} diff --git a/sbin/fsck_ext2fs/Makefile b/sbin/fsck_ext2fs/Makefile index b50ac73d53fe..ff10786fa87b 100644 --- a/sbin/fsck_ext2fs/Makefile +++ b/sbin/fsck_ext2fs/Makefile @@ -1,10 +1,10 @@ -# $NetBSD: Makefile,v 1.2 1997/06/16 08:10:35 bouyer Exp $ +# $NetBSD: Makefile,v 1.3 1997/10/09 13:19:33 bouyer Exp $ # @(#)Makefile 8.1 (Berkeley) 6/5/93 PROG= fsck_ext2fs MAN= fsck_ext2fs.8 SRCS= dir.c inode.c main.c pass1.c pass1b.c pass2.c pass3.c pass4.c \ - pass5.c fsutil.c setup.c utilities.c# ext2fs_subr.c + pass5.c fsutil.c setup.c utilities.c bswap.c .PATH: ${.CURDIR}/../../sys/ufs/ext2fs ${.CURDIR}/../fsck CFLAGS+= -I${.CURDIR}/../fsck diff --git a/sbin/fsck_ext2fs/dir.c b/sbin/fsck_ext2fs/dir.c index d0d00ea46c46..db92de37121b 100644 --- a/sbin/fsck_ext2fs/dir.c +++ b/sbin/fsck_ext2fs/dir.c @@ -1,4 +1,4 @@ -/* $NetBSD: dir.c,v 1.2 1997/09/14 14:27:23 lukem Exp $ */ +/* $NetBSD: dir.c,v 1.3 1997/10/09 13:19:34 bouyer Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. @@ -39,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)dir.c 8.5 (Berkeley) 12/8/94"; #else -__RCSID("$NetBSD: dir.c,v 1.2 1997/09/14 14:27:23 lukem Exp $"); +__RCSID("$NetBSD: dir.c,v 1.3 1997/10/09 13:19:34 bouyer Exp $"); #endif #endif /* not lint */ @@ -144,7 +144,7 @@ dirscan(idesc) } idesc->id_loc = 0; for (dp = fsck_readdir(idesc); dp != NULL; dp = fsck_readdir(idesc)) { - dsize = dp->e2d_reclen; + dsize = fs2h16(dp->e2d_reclen); memcpy(dbuf, dp, (size_t)dsize); idesc->id_dirp = (struct ext2fs_direct *)dbuf; if ((n = (*idesc->id_func)(idesc)) & ALTERED) { @@ -186,7 +186,7 @@ fsck_readdir(idesc) fix = dofix(idesc, "DIRECTORY CORRUPTED"); bp = getdirblk(idesc->id_blkno, blksiz); dp = (struct ext2fs_direct *)(bp->b_un.b_buf + idesc->id_loc); - dp->e2d_reclen = sblock.e2fs_bsize; + dp->e2d_reclen = h2fs16(sblock.e2fs_bsize); dp->e2d_ino = 0; dp->e2d_namlen = 0; dp->e2d_name[0] = '\0'; @@ -201,8 +201,8 @@ dpok: return NULL; dploc = idesc->id_loc; dp = (struct ext2fs_direct *)(bp->b_un.b_buf + dploc); - idesc->id_loc += dp->e2d_reclen; - idesc->id_filesize -= dp->e2d_reclen; + idesc->id_loc += fs2h16(dp->e2d_reclen); + idesc->id_filesize -= fs2h16(dp->e2d_reclen); if ((idesc->id_loc % sblock.e2fs_bsize) == 0) return (dp); ndp = (struct ext2fs_direct *)(bp->b_un.b_buf + idesc->id_loc); @@ -216,7 +216,7 @@ dpok: fix = dofix(idesc, "DIRECTORY CORRUPTED"); bp = getdirblk(idesc->id_blkno, blksiz); dp = (struct ext2fs_direct *)(bp->b_un.b_buf + dploc); - dp->e2d_reclen += size; + dp->e2d_reclen = h2fs16(fs2h16(dp->e2d_reclen) + size); if (fix) dirty(bp); } @@ -234,20 +234,21 @@ dircheck(idesc, dp) { int size; char *cp; - u_char namlen; int spaceleft; + u_int16_t namlen; + u_int16_t reclen = fs2h16(dp->e2d_reclen); spaceleft = sblock.e2fs_bsize - (idesc->id_loc % sblock.e2fs_bsize); - if (dp->e2d_ino > maxino || - dp->e2d_reclen == 0 || - dp->e2d_reclen > spaceleft || - (dp->e2d_reclen & 0x3) != 0) + if (fs2h32(dp->e2d_ino) > maxino || + reclen == 0 || + reclen > spaceleft || + (reclen & 0x3) != 0) return (0); if (dp->e2d_ino == 0) return (1); - size = EXT2FS_DIRSIZ(dp->e2d_namlen); - namlen = dp->e2d_namlen; - if (dp->e2d_reclen < size || + namlen = fs2h16(dp->e2d_namlen); + size = EXT2FS_DIRSIZ(namlen); + if (reclen < size || idesc->id_filesize < size || namlen > EXT2FS_MAXNAMLEN) return (0); @@ -285,7 +286,7 @@ fileerror(cwd, ino, errmesg) dp = ginode(ino); if (ftypeok(dp)) pfatal("%s=%s\n", - (dp->e2di_mode & IFMT) == IFDIR ? "DIR" : "FILE", pathbuf); + (fs2h16(dp->e2di_mode) & IFMT) == IFDIR ? "DIR" : "FILE", pathbuf); else pfatal("NAME=%s\n", pathbuf); } @@ -298,15 +299,15 @@ adjust(idesc, lcnt) struct ext2fs_dinode *dp; dp = ginode(idesc->id_number); - if (dp->e2di_nlink == lcnt) { + if (fs2h16(dp->e2di_nlink) == lcnt) { if (linkup(idesc->id_number, (ino_t)0) == 0) clri(idesc, "UNREF", 0); } else { pwarn("LINK COUNT %s", (lfdir == idesc->id_number) ? lfname : - ((dp->e2di_mode & IFMT) == IFDIR ? "DIR" : "FILE")); + ((fs2h16(dp->e2di_mode) & IFMT) == IFDIR ? "DIR" : "FILE")); pinode(idesc->id_number); printf(" COUNT %d SHOULD BE %d", - dp->e2di_nlink, dp->e2di_nlink - lcnt); + fs2h16(dp->e2di_nlink), fs2h16(dp->e2di_nlink) - lcnt); if (preen) { if (lcnt < 0) { printf("\n"); @@ -315,7 +316,7 @@ adjust(idesc, lcnt) printf(" (ADJUSTED)\n"); } if (preen || reply("ADJUST") == 1) { - dp->e2di_nlink -= lcnt; + dp->e2di_nlink = h2fs16(fs2h16(dp->e2di_nlink) - lcnt); inodirty(); } } @@ -329,21 +330,21 @@ mkentry(idesc) struct ext2fs_direct newent; int newlen, oldlen; - newent.e2d_namlen = strlen(idesc->id_name); - newlen = EXT2FS_DIRSIZ(newent.e2d_namlen); + newent.e2d_namlen = h2fs16(strlen(idesc->id_name)); + newlen = EXT2FS_DIRSIZ(fs2h16(newent.e2d_namlen)); if (dirp->e2d_ino != 0) - oldlen = EXT2FS_DIRSIZ(dirp->e2d_namlen); + oldlen = EXT2FS_DIRSIZ(fs2h16(dirp->e2d_namlen)); else oldlen = 0; - if (dirp->e2d_reclen - oldlen < newlen) + if (fs2h16(dirp->e2d_reclen) - oldlen < newlen) return (KEEPON); - newent.e2d_reclen = dirp->e2d_reclen - oldlen; - dirp->e2d_reclen = oldlen; + newent.e2d_reclen = h2fs16(fs2h16(dirp->e2d_reclen) - oldlen); + dirp->e2d_reclen = h2fs16(oldlen); dirp = (struct ext2fs_direct *)(((char *)dirp) + oldlen); - dirp->e2d_ino = idesc->id_parent; /* ino to be entered is in id_parent */ + dirp->e2d_ino = h2fs32(idesc->id_parent); /* ino to be entered is in id_parent */ dirp->e2d_reclen = newent.e2d_reclen; dirp->e2d_namlen = newent.e2d_namlen; - memcpy(dirp->e2d_name, idesc->id_name, (size_t)dirp->e2d_namlen); + memcpy(dirp->e2d_name, idesc->id_name, (size_t)fs2h16(dirp->e2d_namlen)); return (ALTERED|STOP); } @@ -352,11 +353,12 @@ chgino(idesc) struct inodesc *idesc; { struct ext2fs_direct *dirp = idesc->id_dirp; + u_int16_t namlen = fs2h16(dirp->e2d_namlen); - if (strlen(idesc->id_name) != dirp->e2d_namlen || - strncmp(dirp->e2d_name, idesc->id_name, (int)dirp->e2d_namlen)) + if (strlen(idesc->id_name) != namlen || + strncmp(dirp->e2d_name, idesc->id_name, (int)namlen)) return (KEEPON); - dirp->e2d_ino = idesc->id_parent; + dirp->e2d_ino = h2fs32(idesc->id_parent); return (ALTERED|STOP); } @@ -373,10 +375,10 @@ linkup(orphan, parentdir) memset(&idesc, 0, sizeof(struct inodesc)); dp = ginode(orphan); - lostdir = (dp->e2di_mode & IFMT) == IFDIR; + lostdir = (fs2h16(dp->e2di_mode) & IFMT) == IFDIR; pwarn("UNREF %s ", lostdir ? "DIR" : "FILE"); pinode(orphan); - if (preen && dp->e2di_size == 0) + if (preen && fs2h32(dp->e2di_size) == 0) return (0); if (preen) printf(" (RECONNECTED)\n"); @@ -415,7 +417,7 @@ linkup(orphan, parentdir) } } dp = ginode(lfdir); - if ((dp->e2di_mode & IFMT) != IFDIR) { + if ((fs2h16(dp->e2di_mode) & IFMT) != IFDIR) { pfatal("lost+found IS NOT A DIRECTORY"); if (reply("REALLOCATE") == 0) return (0); @@ -452,7 +454,7 @@ linkup(orphan, parentdir) parentdir != (ino_t)-1) (void)makeentry(orphan, lfdir, ".."); dp = ginode(lfdir); - dp->e2di_nlink++; + dp->e2di_nlink = h2fs16(fs2h16(dp->e2di_nlink) +1); inodirty(); lncntp[lfdir]++; pwarn("DIR I=%u CONNECTED. ", orphan); @@ -509,8 +511,9 @@ makeentry(parent, ino, name) idesc.id_fix = DONTKNOW; idesc.id_name = name; dp = ginode(parent); - if (dp->e2di_size % sblock.e2fs_bsize) { - dp->e2di_size = roundup(dp->e2di_size, sblock.e2fs_bsize); + if (fs2h32(dp->e2di_size) % sblock.e2fs_bsize) { + dp->e2di_size = + h2fs32(roundup(fs2h32(dp->e2di_size), sblock.e2fs_bsize)); inodirty(); } if ((ckinode(dp, &idesc) & ALTERED) != 0) @@ -532,24 +535,24 @@ expanddir(dp, name) { daddr_t lastbn, newblk; struct bufarea *bp; - char *cp, *firstblk; + char *firstblk; if ((firstblk = malloc(sblock.e2fs_bsize)) == NULL) { fprintf(stderr, "out of memory"); exit(8); } - lastbn = lblkno(&sblock, dp->e2di_size); - if (lastbn >= NDADDR - 1 || dp->e2di_blocks[lastbn] == 0 || - dp->e2di_size == 0) + lastbn = lblkno(&sblock, fs2h32(dp->e2di_size)); + if (lastbn >= NDADDR - 1 || fs2h32(dp->e2di_blocks[lastbn]) == 0 || + fs2h32(dp->e2di_size) == 0) return (0); if ((newblk = allocblk()) == 0) return (0); dp->e2di_blocks[lastbn + 1] = dp->e2di_blocks[lastbn]; - dp->e2di_blocks[lastbn] = newblk; - dp->e2di_size += sblock.e2fs_bsize; - dp->e2di_nblock += 1; - bp = getdirblk(dp->e2di_blocks[lastbn + 1], + dp->e2di_blocks[lastbn] = h2fs32(newblk); + dp->e2di_size = h2fs32(fs2h32(dp->e2di_size) + sblock.e2fs_bsize); + dp->e2di_nblock = h2fs32(fs2h32(dp->e2di_nblock) + 1); + bp = getdirblk(fs2h32(dp->e2di_blocks[lastbn + 1]), sblock.e2fs_bsize); if (bp->b_errs) goto bad; @@ -558,16 +561,12 @@ expanddir(dp, name) if (bp->b_errs) goto bad; memcpy(bp->b_un.b_buf, firstblk, sblock.e2fs_bsize); - emptydir.dot_reclen = sblock.e2fs_bsize; - for (cp = &bp->b_un.b_buf[sblock.e2fs_bsize]; - cp < &bp->b_un.b_buf[sblock.e2fs_bsize]; - cp += sblock.e2fs_bsize) - memcpy(cp, &emptydir, sizeof emptydir); dirty(bp); - bp = getdirblk(dp->e2di_blocks[lastbn + 1], + bp = getdirblk(fs2h32(dp->e2di_blocks[lastbn + 1]), sblock.e2fs_bsize); if (bp->b_errs) goto bad; + emptydir.dot_reclen = h2fs16(sblock.e2fs_bsize); memcpy(bp->b_un.b_buf, &emptydir, sizeof emptydir); pwarn("NO SPACE LEFT IN %s", name); if (preen) @@ -580,8 +579,8 @@ expanddir(dp, name) bad: dp->e2di_blocks[lastbn] = dp->e2di_blocks[lastbn + 1]; dp->e2di_blocks[lastbn + 1] = 0; - dp->e2di_size -= sblock.e2fs_bsize; - dp->e2di_nblock -= sblock.e2fs_bsize; + dp->e2di_size = h2fs32(fs2h32(dp->e2di_size) - sblock.e2fs_bsize); + dp->e2di_nblock = h2fs32(fs2h32(dp->e2di_nblock) - 1); freeblk(newblk); return (0); } @@ -595,34 +594,30 @@ allocdir(parent, request, mode) int mode; { ino_t ino; - char *cp; struct ext2fs_dinode *dp; struct bufarea *bp; struct ext2fs_dirtemplate *dirp; ino = allocino(request, IFDIR|mode); - dirhead.dot_reclen = 12; /* XXX */ - dirhead.dotdot_reclen = sblock.e2fs_bsize - 12; /* XXX */ + dirhead.dot_reclen = h2fs16(12); /* XXX */ + dirhead.dotdot_reclen = h2fs16(sblock.e2fs_bsize - 12); /* XXX */ + dirhead.dot_namlen = h2fs16(1); + dirhead.dotdot_namlen = h2fs16(2); dirp = &dirhead; - dirp->dot_ino = ino; - dirp->dotdot_ino = parent; + dirp->dot_ino = h2fs32(ino); + dirp->dotdot_ino = h2fs32(parent); dp = ginode(ino); - bp = getdirblk(dp->e2di_blocks[0], sblock.e2fs_bsize); + bp = getdirblk(fs2h32(dp->e2di_blocks[0]), sblock.e2fs_bsize); if (bp->b_errs) { freeino(ino); return (0); } - emptydir.dot_reclen = sblock.e2fs_bsize; memcpy(bp->b_un.b_buf, dirp, sizeof(struct ext2fs_dirtemplate)); - for (cp = &bp->b_un.b_buf[sblock.e2fs_bsize]; - cp < &bp->b_un.b_buf[sblock.e2fs_bsize]; - cp += sblock.e2fs_bsize) - memcpy(cp, &emptydir, sizeof emptydir); dirty(bp); - dp->e2di_nlink = 2; + dp->e2di_nlink = h2fs16(2); inodirty(); if (ino == EXT2_ROOTINO) { - lncntp[ino] = dp->e2di_nlink; + lncntp[ino] = fs2h16(dp->e2di_nlink); cacheino(dp, ino); return(ino); } @@ -633,11 +628,11 @@ allocdir(parent, request, mode) cacheino(dp, ino); statemap[ino] = statemap[parent]; if (statemap[ino] == DSTATE) { - lncntp[ino] = dp->e2di_nlink; + lncntp[ino] = fs2h16(dp->e2di_nlink); lncntp[parent]++; } dp = ginode(parent); - dp->e2di_nlink++; + dp->e2di_nlink = h2fs16(fs2h16(dp->e2di_nlink) + 1); inodirty(); return (ino); } @@ -653,7 +648,7 @@ freedir(ino, parent) if (ino != parent) { dp = ginode(parent); - dp->e2di_nlink--; + dp->e2di_nlink = h2fs16(fs2h16(dp->e2di_nlink) - 1); inodirty(); } freeino(ino); diff --git a/sbin/fsck_ext2fs/fsck.h b/sbin/fsck_ext2fs/fsck.h index 5ab6f165604c..dc0c4a2a481e 100644 --- a/sbin/fsck_ext2fs/fsck.h +++ b/sbin/fsck_ext2fs/fsck.h @@ -1,4 +1,4 @@ -/* $NetBSD: fsck.h,v 1.1 1997/06/11 11:21:47 bouyer Exp $ */ +/* $NetBSD: fsck.h,v 1.2 1997/10/09 13:19:35 bouyer Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. @@ -65,7 +65,7 @@ struct bufarea { union { char *b_buf; /* buffer space */ daddr_t *b_indir; /* indirect block */ - struct m_ext2fs *b_fs; /* super block */ + struct ext2fs *b_fs; /* super block */ struct ext2_gd *b_cgd; /* cylinder group descriptor */ struct ext2fs_dinode *b_dinode; /* inode block */ } b_un; @@ -77,9 +77,11 @@ struct bufarea { #define MINBUFS 5 /* minimum number of buffers required */ struct bufarea bufhead; /* head of list of other blks in filesys */ struct bufarea sblk; /* file system superblock */ +struct bufarea asblk; /* first alternate superblock */ struct bufarea *pdirbp; /* current directory contents */ struct bufarea *pbp; /* current inode block */ struct bufarea *getdatablk __P((daddr_t, long)); +struct m_ext2fs sblock; #define dirty(bp) (bp)->b_dirty = 1 #define initbarea(bp) \ @@ -87,10 +89,7 @@ struct bufarea *getdatablk __P((daddr_t, long)); (bp)->b_bno = (daddr_t)-1; \ (bp)->b_flags = 0; -#define sbdirty() sblk.b_dirty = 1 -#define cgdirty() cgblk.b_dirty = 1 -#define sblock (*sblk.b_un.b_fs) -#define cgrp (*cgblk.b_un.b_cg) +#define sbdirty() copyback_sb(&sblk); sblk.b_dirty = 1 enum fixstate {DONTKNOW, NOFIX, FIX, IGNORE}; @@ -211,3 +210,4 @@ struct ext2fs_dinode *ginode __P((ino_t)); struct inoinfo *getinoinfo __P((ino_t)); void getblk __P((struct bufarea *, daddr_t, long)); ino_t allocino __P((ino_t, int)); +void copyback_sb __P((struct bufarea*)); diff --git a/sbin/fsck_ext2fs/inode.c b/sbin/fsck_ext2fs/inode.c index b4bc26683ed3..50d3a8183fe3 100644 --- a/sbin/fsck_ext2fs/inode.c +++ b/sbin/fsck_ext2fs/inode.c @@ -1,4 +1,4 @@ -/* $NetBSD: inode.c,v 1.2 1997/09/14 14:27:24 lukem Exp $ */ +/* $NetBSD: inode.c,v 1.3 1997/10/09 13:19:36 bouyer Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. @@ -39,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)inode.c 8.5 (Berkeley) 2/8/95"; #else -__RCSID("$NetBSD: inode.c,v 1.2 1997/09/14 14:27:24 lukem Exp $"); +__RCSID("$NetBSD: inode.c,v 1.3 1997/10/09 13:19:36 bouyer Exp $"); #endif #endif /* not lint */ @@ -61,6 +61,16 @@ __RCSID("$NetBSD: inode.c,v 1.2 1997/09/14 14:27:24 lukem Exp $"); #include "fsutil.h" #include "extern.h" +/* + * CG is stored in fs byte order in memory, so we can't use ino_to_fsba + * here. + */ + +#define fsck_ino_to_fsba(fs, x) \ + (fs2h32((fs)->e2fs_gd[ino_to_cg(fs, x)].ext2bgd_i_tables) + \ + (((x)-1) % (fs)->e2fs.e2fs_ipg)/(fs)->e2fs_ipb) + + static ino_t startinum; static int iblock __P((struct inodesc *, long, u_int64_t)); @@ -80,13 +90,13 @@ ckinode(dp, idesc) if (idesc->id_fix != IGNORE) idesc->id_fix = DONTKNOW; idesc->id_entryno = 0; - idesc->id_filesize = dp->e2di_size; - mode = dp->e2di_mode & IFMT; + idesc->id_filesize = fs2h32(dp->e2di_size); + mode = fs2h16(dp->e2di_mode) & IFMT; if (mode == IFBLK || mode == IFCHR || (mode == IFLNK && - (dp->e2di_size < EXT2_MAXSYMLINKLEN))) + (fs2h32(dp->e2di_size) < EXT2_MAXSYMLINKLEN))) return (KEEPON); dino = *dp; - ndb = howmany(dino.e2di_size, sblock.e2fs_bsize); + ndb = howmany(fs2h32(dino.e2di_size), sblock.e2fs_bsize); for (ap = &dino.e2di_blocks[0]; ap < &dino.e2di_blocks[NDADDR]; ap++,ndb--) { idesc->id_numfrags = 1; @@ -99,8 +109,8 @@ ckinode(dp, idesc) pathbuf); if (reply("ADJUST LENGTH") == 1) { dp = ginode(idesc->id_number); - dp->e2di_size = (ap - &dino.e2di_blocks[0]) * - sblock.e2fs_bsize; + dp->e2di_size = h2fs32((ap - &dino.e2di_blocks[0]) * + sblock.e2fs_bsize); printf( "YOU MUST RERUN FSCK AFTERWARDS\n"); rerun = 1; @@ -109,7 +119,7 @@ ckinode(dp, idesc) } continue; } - idesc->id_blkno = *ap; + idesc->id_blkno = fs2h32(*ap); if (idesc->id_type == ADDR) ret = (*idesc->id_func)(idesc); else @@ -118,11 +128,11 @@ ckinode(dp, idesc) return (ret); } idesc->id_numfrags = 1; - remsize = dino.e2di_size - sblock.e2fs_bsize * NDADDR; + remsize = fs2h32(dino.e2di_size) - sblock.e2fs_bsize * NDADDR; sizepb = sblock.e2fs_bsize; for (ap = &dino.e2di_blocks[NDADDR], n = 1; n <= NIADDR; ap++, n++) { if (*ap) { - idesc->id_blkno = *ap; + idesc->id_blkno = fs2h32(*ap); ret = iblock(idesc, n, remsize); if (ret & STOP) return (ret); @@ -135,7 +145,7 @@ ckinode(dp, idesc) pathbuf); if (reply("ADJUST LENGTH") == 1) { dp = ginode(idesc->id_number); - dp->e2di_size -= remsize; + dp->e2di_size = h2fs32(fs2h32(dp->e2di_size) - remsize); remsize = 0; printf( "YOU MUST RERUN FSCK AFTERWARDS\n"); @@ -200,7 +210,7 @@ iblock(idesc, ilevel, isize) aplim = &bp->b_un.b_indir[nif]; for (ap = bp->b_un.b_indir; ap < aplim; ap++) { if (*ap) { - idesc->id_blkno = *ap; + idesc->id_blkno = fs2h32(*ap); if (ilevel == 0) n = (*func)(idesc); else @@ -218,7 +228,7 @@ iblock(idesc, ilevel, isize) pathbuf); if (reply("ADJUST LENGTH") == 1) { dp = ginode(idesc->id_number); - dp->e2di_size -= isize; + dp->e2di_size = h2fs32(fs2h32(dp->e2di_size) - isize); isize = 0; printf( "YOU MUST RERUN FSCK AFTERWARDS\n"); @@ -294,7 +304,7 @@ ginode(inumber) errexit("bad inode number %d to ginode\n", inumber); if (startinum == 0 || inumber < startinum || inumber >= startinum + sblock.e2fs_ipb) { - iblk = ino_to_fsba(&sblock, inumber); + iblk = fsck_ino_to_fsba(&sblock, inumber); if (pbp != 0) pbp->b_flags &= ~B_INUSE; pbp = getdatablk(iblk, sblock.e2fs_bsize); @@ -323,7 +333,7 @@ getnextinode(inumber) errexit("bad inode number %d to nextinode\n", inumber); if (inumber >= lastinum) { readcnt++; - dblk = fsbtodb(&sblock, ino_to_fsba(&sblock, lastinum)); + dblk = fsbtodb(&sblock, fsck_ino_to_fsba(&sblock, lastinum)); if (readcnt % readpercg == 0) { size = partialsize; lastinum += partialcnt; @@ -389,7 +399,7 @@ cacheino(dp, inumber) struct inoinfo **inpp; unsigned int blks; - blks = howmany(dp->e2di_size, sblock.e2fs_bsize); + blks = howmany(fs2h32(dp->e2di_size), sblock.e2fs_bsize); if (blks > NDADDR) blks = NDADDR + NIADDR; inp = (struct inoinfo *) @@ -406,7 +416,7 @@ cacheino(dp, inumber) inp->i_parent = (ino_t)0; inp->i_dotdot = (ino_t)0; inp->i_number = inumber; - inp->i_isize = dp->e2di_size; + inp->i_isize = fs2h32(dp->e2di_size); inp->i_numblks = blks * sizeof(daddr_t); memcpy(&inp->i_blks[0], &dp->e2di_blocks[0], (size_t)inp->i_numblks); if (inplast == listmax) { @@ -491,11 +501,12 @@ findname(idesc) struct inodesc *idesc; { struct ext2fs_direct *dirp = idesc->id_dirp; + u_int16_t namlen = fs2h16(dirp->e2d_namlen); - if (dirp->e2d_ino != idesc->id_parent) + if (fs2h32(dirp->e2d_ino) != idesc->id_parent) return (KEEPON); - memcpy(idesc->id_name, dirp->e2d_name, (size_t)dirp->e2d_namlen); - idesc->id_name[dirp->e2d_namlen] = '\0'; + memcpy(idesc->id_name, dirp->e2d_name, (size_t)namlen); + idesc->id_name[namlen] = '\0'; return (STOP|FOUND); } @@ -504,13 +515,14 @@ findino(idesc) struct inodesc *idesc; { struct ext2fs_direct *dirp = idesc->id_dirp; + u_int32_t ino = fs2h32(dirp->e2d_ino); - if (dirp->e2d_ino == 0) + if (ino == 0) return (KEEPON); if (strcmp(dirp->e2d_name, idesc->id_name) == 0 && - (dirp->e2d_ino == EXT2_ROOTINO || dirp->e2d_ino >= EXT2_FIRSTINO) - && dirp->e2d_ino <= maxino) { - idesc->id_parent = dirp->e2d_ino; + (ino == EXT2_ROOTINO || ino >= EXT2_FIRSTINO) + && ino <= maxino) { + idesc->id_parent = ino; return (STOP|FOUND); } return (KEEPON); @@ -535,12 +547,12 @@ pinode(ino) printf("%s ", pw->pw_name); else #endif - printf("%u ", (unsigned)dp->e2di_uid); - printf("MODE=%o\n", dp->e2di_mode); + printf("%u ", (unsigned)fs2h16(dp->e2di_uid)); + printf("MODE=%o\n", fs2h16(dp->e2di_mode)); if (preen) printf("%s: ", cdevname()); - printf("SIZE=%u ", dp->e2di_size); - t = dp->e2di_mtime; + printf("SIZE=%u ", fs2h32(dp->e2di_size)); + t = fs2h32(dp->e2di_mtime); p = ctime(&t); printf("MTIME=%12.12s %4.4s ", &p[4], &p[20]); } @@ -610,18 +622,18 @@ allocino(request, type) return (0); } dp = ginode(ino); - dp->e2di_blocks[0] = allocblk(); + dp->e2di_blocks[0] = h2fs32(allocblk()); if (dp->e2di_blocks[0] == 0) { statemap[ino] = USTATE; return (0); } - dp->e2di_mode = type; + dp->e2di_mode = h2fs16(type); (void)time(&t); - dp->e2di_atime = t; + dp->e2di_atime = h2fs32(t); dp->e2di_mtime = dp->e2di_ctime = dp->e2di_atime; dp->e2di_dtime = 0; - dp->e2di_size = sblock.e2fs_bsize; - dp->e2di_nblock = btodb(sblock.e2fs_bsize); + dp->e2di_size = h2fs32(sblock.e2fs_bsize); + dp->e2di_nblock = h2fs32(btodb(sblock.e2fs_bsize)); n_files++; inodirty(); return (ino); diff --git a/sbin/fsck_ext2fs/pass1.c b/sbin/fsck_ext2fs/pass1.c index a861afa3f09d..9f82d00b6b7d 100644 --- a/sbin/fsck_ext2fs/pass1.c +++ b/sbin/fsck_ext2fs/pass1.c @@ -1,4 +1,4 @@ -/* $NetBSD: pass1.c,v 1.3 1997/09/14 14:27:26 lukem Exp $ */ +/* $NetBSD: pass1.c,v 1.4 1997/10/09 13:19:37 bouyer Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. @@ -39,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)pass1.c 8.1 (Berkeley) 6/5/93"; #else -__RCSID("$NetBSD: pass1.c,v 1.3 1997/09/14 14:27:26 lukem Exp $"); +__RCSID("$NetBSD: pass1.c,v 1.4 1997/10/09 13:19:37 bouyer Exp $"); #endif #endif /* not lint */ @@ -118,7 +118,7 @@ checkinode(inumber, idesc) if (inumber < EXT2_FIRSTINO && inumber != EXT2_ROOTINO) return; - mode = dp->e2di_mode & IFMT; + mode = fs2h16(dp->e2di_mode) & IFMT; if (mode == 0 || (dp->e2di_dtime != 0 && dp->e2di_nlink == 0)) { if (mode == 0 && ( memcmp(dp->e2di_blocks, zino.e2di_blocks, @@ -140,7 +140,7 @@ checkinode(inumber, idesc) if (preen || reply("CORRECT")) { time_t t; time(&t); - dp->e2di_dtime = t; + dp->e2di_dtime = h2fs32(t); dp = ginode(inumber); inodirty(); } @@ -151,7 +151,7 @@ checkinode(inumber, idesc) } lastino = inumber; if (dp->e2di_dtime != 0) { - time_t t = dp->e2di_dtime; + time_t t = fs2h32(dp->e2di_dtime); char *p = ctime(&t); pwarn("INODE I=%u HAS DTIME=%12.12s %4.4s", inumber, &p[4], &p[20]); if (preen) { @@ -164,22 +164,23 @@ checkinode(inumber, idesc) } } if (/* dp->di_size < 0 || */ - dp->e2di_size + sblock.e2fs_bsize - 1 < dp->e2di_size) { + fs2h32(dp->e2di_size) + sblock.e2fs_bsize - 1 < + fs2h32(dp->e2di_size)) { if (debug) - printf("bad size %lu:", (u_long)dp->e2di_size); + printf("bad size %lu:", (u_long)fs2h32(dp->e2di_size)); goto unknown; } if (!preen && mode == IFMT && reply("HOLD BAD BLOCK") == 1) { dp = ginode(inumber); - dp->e2di_size = sblock.e2fs_bsize; - dp->e2di_mode = IFREG|0600; + dp->e2di_size = h2fs32(sblock.e2fs_bsize); + dp->e2di_mode = h2fs16(IFREG|0600); inodirty(); } - ndb = howmany(dp->e2di_size, sblock.e2fs_bsize); + ndb = howmany(fs2h32(dp->e2di_size), sblock.e2fs_bsize); if (ndb < 0) { if (debug) printf("bad size %lu ndb %d:", - (u_long)dp->e2di_size, ndb); + (u_long)fs2h32(dp->e2di_size), ndb); goto unknown; } if (mode == IFBLK || mode == IFCHR) @@ -189,9 +190,9 @@ checkinode(inumber, idesc) * Fake ndb value so direct/indirect block checks below * will detect any garbage after symlink string. */ - if (dp->e2di_size < EXT2_MAXSYMLINKLEN || + if (fs2h32(dp->e2di_size) < EXT2_MAXSYMLINKLEN || (EXT2_MAXSYMLINKLEN == 0 && dp->e2di_blocks == 0)) { - ndb = howmany(dp->e2di_size, sizeof(u_int32_t)); + ndb = howmany(fs2h32(dp->e2di_size), sizeof(u_int32_t)); if (ndb > NDADDR) { j = ndb - NDADDR; for (ndb = 1; j > 1; j--) @@ -203,7 +204,7 @@ checkinode(inumber, idesc) for (j = ndb; j < NDADDR; j++) if (dp->e2di_blocks[j] != 0) { if (debug) - printf("bad direct addr: %d\n", dp->e2di_blocks[j]); + printf("bad direct addr: %d\n", fs2h32(dp->e2di_blocks[j])); goto unknown; } for (j = 0, ndb -= NDADDR; ndb > 0; j++) @@ -212,14 +213,14 @@ checkinode(inumber, idesc) if (dp->e2di_blocks[j+NDADDR] != 0) { if (debug) printf("bad indirect addr: %d\n", - dp->e2di_blocks[j+NDADDR]); + fs2h32(dp->e2di_blocks[j+NDADDR])); goto unknown; } if (ftypeok(dp) == 0) goto unknown; n_files++; - lncntp[inumber] = dp->e2di_nlink; - if (dp->e2di_nlink <= 0) { + lncntp[inumber] = fs2h16(dp->e2di_nlink); + if (dp->e2di_nlink == 0) { zlnp = (struct zlncnt *)malloc(sizeof *zlnp); if (zlnp == NULL) { pfatal("LINK COUNT TABLE OVERFLOW"); @@ -244,15 +245,15 @@ checkinode(inumber, idesc) idesc->id_number = inumber; (void)ckinode(dp, idesc); idesc->id_entryno *= btodb(sblock.e2fs_bsize); - if (dp->e2di_nblock != idesc->id_entryno) { + if (fs2h32(dp->e2di_nblock) != idesc->id_entryno) { pwarn("INCORRECT BLOCK COUNT I=%u (%d should be %d)", - inumber, dp->e2di_nblock, idesc->id_entryno); + inumber, fs2h32(dp->e2di_nblock), idesc->id_entryno); if (preen) printf(" (CORRECTED)\n"); else if (reply("CORRECT") == 0) return; dp = ginode(inumber); - dp->e2di_nblock = idesc->id_entryno; + dp->e2di_nblock = h2fs32(idesc->id_entryno); inodirty(); } return; diff --git a/sbin/fsck_ext2fs/pass2.c b/sbin/fsck_ext2fs/pass2.c index 3fbdaf1438a7..bf963c77b7c2 100644 --- a/sbin/fsck_ext2fs/pass2.c +++ b/sbin/fsck_ext2fs/pass2.c @@ -1,4 +1,4 @@ -/* $NetBSD: pass2.c,v 1.3 1997/09/16 08:37:03 mrg Exp $ */ +/* $NetBSD: pass2.c,v 1.4 1997/10/09 13:19:38 bouyer Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. @@ -39,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)pass2.c 8.6 (Berkeley) 10/27/94"; #else -__RCSID("$NetBSD: pass2.c,v 1.3 1997/09/16 08:37:03 mrg Exp $"); +__RCSID("$NetBSD: pass2.c,v 1.4 1997/10/09 13:19:38 bouyer Exp $"); #endif #endif /* not lint */ @@ -108,8 +108,7 @@ pass2() if (reply("FIX") == 0) errexit("%s\n", ""); dp = ginode(EXT2_ROOTINO); - dp->e2di_mode &= ~IFMT; - dp->e2di_mode |= IFDIR; + dp->e2di_mode = h2fs16((fs2h16(dp->e2di_mode) & ~IFMT) | IFDIR); inodirty(); break; @@ -140,7 +139,7 @@ pass2() inp->i_isize = roundup(MINDIRSIZE, sblock.e2fs_bsize); if (reply("FIX") == 1) { dp = ginode(inp->i_number); - dp->e2di_size = inp->i_isize; + dp->e2di_size = h2fs32(inp->i_isize); inodirty(); } } else if ((inp->i_isize & (sblock.e2fs_bsize - 1)) != 0) { @@ -152,13 +151,13 @@ pass2() inp->i_isize = roundup(inp->i_isize, sblock.e2fs_bsize); if (preen || reply("ADJUST") == 1) { dp = ginode(inp->i_number); - dp->e2di_size = inp->i_isize; + dp->e2di_size = h2fs32(inp->i_isize); inodirty(); } } memset(&dino, 0, sizeof(struct ext2fs_dinode)); - dino.e2di_mode = IFDIR; - dino.e2di_size = inp->i_isize; + dino.e2di_mode = h2fs16(IFDIR); + dino.e2di_size = h2fs32(inp->i_isize); memcpy(&dino.e2di_blocks[0], &inp->i_blks[0], (size_t)inp->i_numblks); curino.id_number = inp->i_number; curino.id_parent = inp->i_parent; @@ -217,40 +216,40 @@ pass2check(idesc) */ if (idesc->id_entryno != 0) goto chk1; - if (dirp->e2d_ino != 0 && dirp->e2d_namlen == 1 && + if (fs2h32(dirp->e2d_ino) != 0 && fs2h16(dirp->e2d_namlen) == 1 && dirp->e2d_name[0] == '.') { - if (dirp->e2d_ino != idesc->id_number) { + if (fs2h32(dirp->e2d_ino) != idesc->id_number) { direrror(idesc->id_number, "BAD INODE NUMBER FOR '.'"); - dirp->e2d_ino = idesc->id_number; + dirp->e2d_ino = h2fs32(idesc->id_number); if (reply("FIX") == 1) ret |= ALTERED; } goto chk1; } direrror(idesc->id_number, "MISSING '.'"); - proto.e2d_ino = idesc->id_number; - proto.e2d_namlen = 1; + proto.e2d_ino = h2fs32(idesc->id_number); + proto.e2d_namlen = h2fs16(1); (void)strcpy(proto.e2d_name, "."); - entrysize = EXT2FS_DIRSIZ(proto.e2d_namlen); - if (dirp->e2d_ino != 0 && strcmp(dirp->e2d_name, "..") != 0) { + entrysize = EXT2FS_DIRSIZ(fs2h16(proto.e2d_namlen)); + if (fs2h32(dirp->e2d_ino) != 0 && strcmp(dirp->e2d_name, "..") != 0) { pfatal("CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS %s\n", dirp->e2d_name); - } else if (dirp->e2d_reclen < entrysize) { + } else if (fs2h16(dirp->e2d_reclen) < entrysize) { pfatal("CANNOT FIX, INSUFFICIENT SPACE TO ADD '.'\n"); - } else if (dirp->e2d_reclen < 2 * entrysize) { + } else if (fs2h16(dirp->e2d_reclen) < 2 * entrysize) { proto.e2d_reclen = dirp->e2d_reclen; memcpy(dirp, &proto, (size_t)entrysize); if (reply("FIX") == 1) ret |= ALTERED; } else { - n = dirp->e2d_reclen - entrysize; - proto.e2d_reclen = entrysize; + n = fs2h16(dirp->e2d_reclen) - entrysize; + proto.e2d_reclen = h2fs16(entrysize); memcpy(dirp, &proto, (size_t)entrysize); idesc->id_entryno++; - lncntp[dirp->e2d_ino]--; + lncntp[fs2h32(dirp->e2d_ino)]--; dirp = (struct ext2fs_direct *)((char *)(dirp) + entrysize); memset(dirp, 0, (size_t)n); - dirp->e2d_reclen = n; + dirp->e2d_reclen = h2fs16(n); if (reply("FIX") == 1) ret |= ALTERED; } @@ -258,36 +257,36 @@ chk1: if (idesc->id_entryno > 1) goto chk2; inp = getinoinfo(idesc->id_number); - proto.e2d_ino = inp->i_parent; - proto.e2d_namlen = 2; + proto.e2d_ino = h2fs32(inp->i_parent); + proto.e2d_namlen = h2fs16(2); (void)strcpy(proto.e2d_name, ".."); - entrysize = EXT2FS_DIRSIZ(proto.e2d_namlen); + entrysize = EXT2FS_DIRSIZ(2); if (idesc->id_entryno == 0) { - n = EXT2FS_DIRSIZ(dirp->e2d_namlen); - if (dirp->e2d_reclen < n + entrysize) + n = EXT2FS_DIRSIZ(fs2h16(dirp->e2d_namlen)); + if (fs2h16(dirp->e2d_reclen) < n + entrysize) goto chk2; - proto.e2d_reclen = dirp->e2d_reclen - n; - dirp->e2d_reclen = n; + proto.e2d_reclen = h2fs16(fs2h16(dirp->e2d_reclen) - n); + dirp->e2d_reclen = h2fs16(n); idesc->id_entryno++; - lncntp[dirp->e2d_ino]--; + lncntp[fs2h32(dirp->e2d_ino)]--; dirp = (struct ext2fs_direct *)((char *)(dirp) + n); - memset(dirp, 0, (size_t)proto.e2d_reclen); + memset(dirp, 0, (size_t)fs2h16(proto.e2d_reclen)); dirp->e2d_reclen = proto.e2d_reclen; } - if (dirp->e2d_ino != 0 && - dirp->e2d_namlen == 2 && - strncmp(dirp->e2d_name, "..", dirp->e2d_namlen) == 0) { - inp->i_dotdot = dirp->e2d_ino; + if (fs2h32(dirp->e2d_ino) != 0 && + fs2h16(dirp->e2d_namlen) == 2 && + strncmp(dirp->e2d_name, "..", 2) == 0) { + inp->i_dotdot = fs2h32(dirp->e2d_ino); goto chk2; } - if (dirp->e2d_ino != 0 && - dirp->e2d_namlen == 1 && - strncmp(dirp->e2d_name, ".", dirp->e2d_namlen) != 0) { + if (fs2h32(dirp->e2d_ino) != 0 && + fs2h16(dirp->e2d_namlen) == 1 && + strncmp(dirp->e2d_name, ".", 1) != 0) { fileerror(inp->i_parent, idesc->id_number, "MISSING '..'"); pfatal("CANNOT FIX, SECOND ENTRY IN DIRECTORY CONTAINS %s\n", dirp->e2d_name); inp->i_dotdot = (ino_t)-1; - } else if (dirp->e2d_reclen < entrysize) { + } else if (fs2h16(dirp->e2d_reclen) < entrysize) { fileerror(inp->i_parent, idesc->id_number, "MISSING '..'"); pfatal("CANNOT FIX, INSUFFICIENT SPACE TO ADD '..'\n"); inp->i_dotdot = (ino_t)-1; @@ -303,16 +302,16 @@ chk1: ret |= ALTERED; } idesc->id_entryno++; - if (dirp->e2d_ino != 0) - lncntp[dirp->e2d_ino]--; + if (fs2h32(dirp->e2d_ino) != 0) + lncntp[fs2h32(dirp->e2d_ino)]--; return (ret|KEEPON); chk2: - if (dirp->e2d_ino == 0) + if (fs2h32(dirp->e2d_ino) == 0) return (ret|KEEPON); - if (dirp->e2d_namlen <= 2 && + if (fs2h16(dirp->e2d_namlen) <= 2 && dirp->e2d_name[0] == '.' && idesc->id_entryno >= 2) { - if (dirp->e2d_namlen == 1) { + if (fs2h16(dirp->e2d_namlen) == 1) { direrror(idesc->id_number, "EXTRA '.' ENTRY"); dirp->e2d_ino = 0; if (reply("FIX") == 1) @@ -329,17 +328,18 @@ chk2: } idesc->id_entryno++; n = 0; - if (dirp->e2d_ino > maxino || - (dirp->e2d_ino < EXT2_FIRSTINO && dirp->e2d_ino != EXT2_ROOTINO)) { - fileerror(idesc->id_number, dirp->e2d_ino, "I OUT OF RANGE"); + if (fs2h32(dirp->e2d_ino) > maxino || + (fs2h32(dirp->e2d_ino) < EXT2_FIRSTINO && + fs2h32(dirp->e2d_ino) != EXT2_ROOTINO)) { + fileerror(idesc->id_number, fs2h32(dirp->e2d_ino), "I OUT OF RANGE"); n = reply("REMOVE"); } else { again: - switch (statemap[dirp->e2d_ino]) { + switch (statemap[fs2h32(dirp->e2d_ino)]) { case USTATE: if (idesc->id_entryno <= 2) break; - fileerror(idesc->id_number, dirp->e2d_ino, "UNALLOCATED"); + fileerror(idesc->id_number, fs2h32(dirp->e2d_ino), "UNALLOCATED"); n = reply("REMOVE"); break; @@ -347,7 +347,7 @@ again: case FCLEAR: if (idesc->id_entryno <= 2) break; - if (statemap[dirp->e2d_ino] == FCLEAR) + if (statemap[fs2h32(dirp->e2d_ino)] == FCLEAR) errmsg = "DUP/BAD"; else if (!preen) errmsg = "ZERO LENGTH DIRECTORY"; @@ -355,22 +355,23 @@ again: n = 1; break; } - fileerror(idesc->id_number, dirp->e2d_ino, errmsg); + fileerror(idesc->id_number, fs2h32(dirp->e2d_ino), errmsg); if ((n = reply("REMOVE")) == 1) break; - dp = ginode(dirp->e2d_ino); - statemap[dirp->e2d_ino] = - (dp->e2di_mode & IFMT) == IFDIR ? DSTATE : FSTATE; - lncntp[dirp->e2d_ino] = dp->e2di_nlink; + dp = ginode(fs2h32(dirp->e2d_ino)); + statemap[fs2h32(dirp->e2d_ino)] = + (fs2h16(dp->e2di_mode) & IFMT) == IFDIR ? DSTATE : FSTATE; + lncntp[fs2h32(dirp->e2d_ino)] = fs2h16(dp->e2di_nlink); goto again; case DSTATE: case DFOUND: - inp = getinoinfo(dirp->e2d_ino); + inp = getinoinfo(fs2h32(dirp->e2d_ino)); if (inp->i_parent != 0 && idesc->id_entryno > 2) { getpathname(pathbuf, idesc->id_number, idesc->id_number); - getpathname(namebuf, dirp->e2d_ino, dirp->e2d_ino); + getpathname(namebuf, fs2h32(dirp->e2d_ino), + fs2h32(dirp->e2d_ino)); pwarn("%s %s %s\n", pathbuf, "IS AN EXTRANEOUS HARD LINK TO DIRECTORY", namebuf); @@ -384,12 +385,12 @@ again: /* fall through */ case FSTATE: - lncntp[dirp->e2d_ino]--; + lncntp[fs2h32(dirp->e2d_ino)]--; break; default: errexit("BAD STATE %d FOR INODE I=%d\n", - statemap[dirp->e2d_ino], dirp->e2d_ino); + statemap[fs2h32(dirp->e2d_ino)], fs2h32(dirp->e2d_ino)); } } if (n == 0) diff --git a/sbin/fsck_ext2fs/pass5.c b/sbin/fsck_ext2fs/pass5.c index 3d0db268ed62..09122c92dfba 100644 --- a/sbin/fsck_ext2fs/pass5.c +++ b/sbin/fsck_ext2fs/pass5.c @@ -1,4 +1,4 @@ -/* $NetBSD: pass5.c,v 1.3 1997/09/14 14:27:29 lukem Exp $ */ +/* $NetBSD: pass5.c,v 1.4 1997/10/09 13:19:39 bouyer Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. @@ -39,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)pass5.c 8.6 (Berkeley) 11/30/94"; #else -__RCSID("$NetBSD: pass5.c,v 1.3 1997/09/14 14:27:29 lukem Exp $"); +__RCSID("$NetBSD: pass5.c,v 1.4 1997/10/09 13:19:39 bouyer Exp $"); #endif #endif /* not lint */ @@ -93,17 +93,17 @@ pass5() ndirs = 0; if (blk_bitmap == NULL) { - blk_bitmap = getdatablk(fs->e2fs_gd[c].ext2bgd_b_bitmap, + blk_bitmap = getdatablk(fs2h32(fs->e2fs_gd[c].ext2bgd_b_bitmap), fs->e2fs_bsize); } else { - getblk(blk_bitmap, fs->e2fs_gd[c].ext2bgd_b_bitmap, + getblk(blk_bitmap, fs2h32(fs->e2fs_gd[c].ext2bgd_b_bitmap), fs->e2fs_bsize); } if (ino_bitmap == NULL) { - ino_bitmap = getdatablk(fs->e2fs_gd[c].ext2bgd_i_bitmap, + ino_bitmap = getdatablk(fs2h32(fs->e2fs_gd[c].ext2bgd_i_bitmap), fs->e2fs_bsize); } else { - getblk(ino_bitmap, fs->e2fs_gd[c].ext2bgd_i_bitmap, + getblk(ino_bitmap, fs2h32(fs->e2fs_gd[c].ext2bgd_i_bitmap), fs->e2fs_bsize); } memset(bbmap, 0, fs->e2fs_bsize); @@ -173,26 +173,26 @@ pass5() cs_nifree += nifree; cs_ndir += ndirs; - if (debug && (fs->e2fs_gd[c].ext2bgd_nbfree != nbfree || - fs->e2fs_gd[c].ext2bgd_nifree != nifree || - fs->e2fs_gd[c].ext2bgd_ndirs != ndirs)) { + if (debug && (fs2h16(fs->e2fs_gd[c].ext2bgd_nbfree) != nbfree || + fs2h16(fs->e2fs_gd[c].ext2bgd_nifree) != nifree || + fs2h16(fs->e2fs_gd[c].ext2bgd_ndirs) != ndirs)) { printf("summary info for cg %d is %d, %d, %d," "should be %d, %d, %d\n", c, - fs->e2fs_gd[c].ext2bgd_nbfree, - fs->e2fs_gd[c].ext2bgd_nifree, - fs->e2fs_gd[c].ext2bgd_ndirs, + fs2h16(fs->e2fs_gd[c].ext2bgd_nbfree), + fs2h16(fs->e2fs_gd[c].ext2bgd_nifree), + fs2h16(fs->e2fs_gd[c].ext2bgd_ndirs), nbfree, nifree, ndirs); } snprintf(msg, 255, "SUMMARY INFORMATIONS WRONG FOR CG #%d", c); - if ((fs->e2fs_gd[c].ext2bgd_nbfree != nbfree || - fs->e2fs_gd[c].ext2bgd_nifree != nifree || - fs->e2fs_gd[c].ext2bgd_ndirs != ndirs) && + if ((fs2h16(fs->e2fs_gd[c].ext2bgd_nbfree) != nbfree || + fs2h16(fs->e2fs_gd[c].ext2bgd_nifree) != nifree || + fs2h16(fs->e2fs_gd[c].ext2bgd_ndirs) != ndirs) && dofix(&idesc[0], msg)) { - fs->e2fs_gd[c].ext2bgd_nbfree = nbfree; - fs->e2fs_gd[c].ext2bgd_nifree = nifree; - fs->e2fs_gd[c].ext2bgd_ndirs = ndirs; + fs->e2fs_gd[c].ext2bgd_nbfree = h2fs16(nbfree); + fs->e2fs_gd[c].ext2bgd_nifree = h2fs16(nifree); + fs->e2fs_gd[c].ext2bgd_ndirs = h2fs16(ndirs); sbdirty(); } diff --git a/sbin/fsck_ext2fs/setup.c b/sbin/fsck_ext2fs/setup.c index ab027cbd7057..e027d5184311 100644 --- a/sbin/fsck_ext2fs/setup.c +++ b/sbin/fsck_ext2fs/setup.c @@ -1,4 +1,4 @@ -/* $NetBSD: setup.c,v 1.5 1997/09/16 08:37:04 mrg Exp $ */ +/* $NetBSD: setup.c,v 1.6 1997/10/09 13:19:40 bouyer Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. @@ -39,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)setup.c 8.5 (Berkeley) 11/23/94"; #else -__RCSID("$NetBSD: setup.c,v 1.5 1997/09/16 08:37:04 mrg Exp $"); +__RCSID("$NetBSD: setup.c,v 1.6 1997/10/09 13:19:40 bouyer Exp $"); #endif #endif /* not lint */ @@ -63,8 +63,6 @@ __RCSID("$NetBSD: setup.c,v 1.5 1997/09/16 08:37:04 mrg Exp $"); #include "extern.h" #include "fsutil.h" -struct bufarea asblk; -#define altsblock (*asblk.b_un.b_fs) #define POWEROF2(num) (((num) & ((num) - 1)) == 0) void badsb __P((int, char *)); @@ -115,8 +113,8 @@ setup(dev) lfdir = 0; initbarea(&sblk); initbarea(&asblk); - sblk.b_un.b_buf = malloc(sizeof(struct m_ext2fs)); - asblk.b_un.b_buf = malloc(sizeof(struct m_ext2fs)); + sblk.b_un.b_buf = malloc(SBSIZE); + asblk.b_un.b_buf = malloc(SBSIZE); if (sblk.b_un.b_buf == NULL || asblk.b_un.b_buf == NULL) errexit("cannot allocate space for superblock\n"); if ((lp = getdisklabel((char *)NULL, fsreadfd)) != NULL) @@ -179,6 +177,7 @@ setup(dev) if (reply("SET TO DEFAULT") == 1) { sblock.e2fs.e2fs_rbcount = sblock.e2fs.e2fs_bcount * 0.1; sbdirty(); + dirty(&asblk); } } if (sblock.e2fs.e2fs_bpg != sblock.e2fs.e2fs_fpg) { @@ -187,7 +186,7 @@ setup(dev) return 0; } if (asblk.b_dirty && !bflag) { - memcpy(&altsblock, &sblock, (size_t)SBSIZE); + copyback_sb(&asblk); flush(fswritefd, &asblk); } /* @@ -230,7 +229,7 @@ setup(dev) goto badsblabel; } for (numdirs = 0, cg = 0; cg < sblock.e2fs_ncg; cg++) { - numdirs += sblock.e2fs_gd[cg].ext2bgd_ndirs; + numdirs += fs2h16(sblock.e2fs_gd[cg].ext2bgd_ndirs); } inplast = 0; listmax = numdirs + 10; @@ -252,7 +251,7 @@ badsblabel: } /* - * Read in the super block and its summary info. + * Read in the super block and its summary info, convert to host byte order. */ static int readsb(listerr) @@ -260,10 +259,37 @@ readsb(listerr) { daddr_t super = bflag ? bflag : SBOFF / dev_bsize; - if (bread(fsreadfd, (char *)&sblock.e2fs, super, (long)SBSIZE) != 0) + if (bread(fsreadfd, (char *)sblk.b_un.b_fs, super, (long)SBSIZE) != 0) return (0); sblk.b_bno = super; sblk.b_size = SBSIZE; + + /* Copy the superblock in memory */ + sblock.e2fs.e2fs_icount = fs2h32(sblk.b_un.b_fs->e2fs_icount); + sblock.e2fs.e2fs_bcount = fs2h32(sblk.b_un.b_fs->e2fs_bcount); + sblock.e2fs.e2fs_rbcount = fs2h32(sblk.b_un.b_fs->e2fs_rbcount); + sblock.e2fs.e2fs_fbcount = fs2h32(sblk.b_un.b_fs->e2fs_fbcount); + sblock.e2fs.e2fs_ficount = fs2h32(sblk.b_un.b_fs->e2fs_ficount); + sblock.e2fs.e2fs_first_dblock = fs2h32(sblk.b_un.b_fs->e2fs_first_dblock); + sblock.e2fs.e2fs_log_bsize = fs2h32(sblk.b_un.b_fs->e2fs_log_bsize); + sblock.e2fs.e2fs_fsize = fs2h32(sblk.b_un.b_fs->e2fs_fsize); + sblock.e2fs.e2fs_bpg = fs2h32(sblk.b_un.b_fs->e2fs_bpg); + sblock.e2fs.e2fs_fpg = fs2h32(sblk.b_un.b_fs->e2fs_fpg); + sblock.e2fs.e2fs_ipg = fs2h32(sblk.b_un.b_fs->e2fs_ipg); + sblock.e2fs.e2fs_mtime = fs2h32(sblk.b_un.b_fs->e2fs_mtime); + sblock.e2fs.e2fs_wtime = fs2h32(sblk.b_un.b_fs->e2fs_wtime); + sblock.e2fs.e2fs_lastfsck = fs2h32(sblk.b_un.b_fs->e2fs_lastfsck); + sblock.e2fs.e2fs_fsckintv = fs2h32(sblk.b_un.b_fs->e2fs_fsckintv); + sblock.e2fs.e2fs_creator = fs2h32(sblk.b_un.b_fs->e2fs_creator); + sblock.e2fs.e2fs_rev = fs2h32(sblk.b_un.b_fs->e2fs_rev); + sblock.e2fs.e2fs_mnt_count = fs2h16(sblk.b_un.b_fs->e2fs_mnt_count); + sblock.e2fs.e2fs_max_mnt_count = fs2h16(sblk.b_un.b_fs->e2fs_max_mnt_count); + sblock.e2fs.e2fs_magic = fs2h16(sblk.b_un.b_fs->e2fs_magic); + sblock.e2fs.e2fs_state = fs2h16(sblk.b_un.b_fs->e2fs_state); + sblock.e2fs.e2fs_beh = fs2h16(sblk.b_un.b_fs->e2fs_beh); + sblock.e2fs.e2fs_ruid = fs2h16(sblk.b_un.b_fs->e2fs_ruid); + sblock.e2fs.e2fs_rgid = fs2h16(sblk.b_un.b_fs->e2fs_rgid); + /* * run a few consistency checks of the super block */ @@ -306,6 +332,11 @@ readsb(listerr) super *= dev_bsize; dev_bsize = sblock.e2fs_bsize / fsbtodb(&sblock, 1); sblk.b_bno = super / dev_bsize; + + getblk(&asblk, 1 * sblock.e2fs.e2fs_bpg + sblock.e2fs.e2fs_first_dblock, + (long)SBSIZE); + if (asblk.b_errs) + return (0); if (bflag) { havesb = 1; return (1); @@ -316,36 +347,34 @@ readsb(listerr) * of whole super block against an alternate super block. * When an alternate super-block is specified this check is skipped. */ - getblk(&asblk, 1 * sblock.e2fs.e2fs_bpg + sblock.e2fs.e2fs_first_dblock, - (long)SBSIZE); - if (asblk.b_errs) - return (0); - altsblock.e2fs.e2fs_rbcount = sblock.e2fs.e2fs_rbcount; - altsblock.e2fs.e2fs_fbcount = sblock.e2fs.e2fs_fbcount; - altsblock.e2fs.e2fs_ficount = sblock.e2fs.e2fs_ficount; - altsblock.e2fs.e2fs_mtime = sblock.e2fs.e2fs_mtime; - altsblock.e2fs.e2fs_wtime = sblock.e2fs.e2fs_wtime; - altsblock.e2fs.e2fs_mnt_count = sblock.e2fs.e2fs_mnt_count; - altsblock.e2fs.e2fs_max_mnt_count = sblock.e2fs.e2fs_max_mnt_count; - altsblock.e2fs.e2fs_state = sblock.e2fs.e2fs_state; - altsblock.e2fs.e2fs_beh = sblock.e2fs.e2fs_beh; - altsblock.e2fs.e2fs_lastfsck = sblock.e2fs.e2fs_lastfsck; - altsblock.e2fs.e2fs_fsckintv = sblock.e2fs.e2fs_fsckintv; - altsblock.e2fs.e2fs_ruid = sblock.e2fs.e2fs_ruid; - altsblock.e2fs.e2fs_rgid = sblock.e2fs.e2fs_rgid; - if (memcmp(&(sblock.e2fs), &(altsblock.e2fs), (int)SBSIZE)) { + asblk.b_un.b_fs->e2fs_rbcount = sblk.b_un.b_fs->e2fs_rbcount; + asblk.b_un.b_fs->e2fs_fbcount = sblk.b_un.b_fs->e2fs_fbcount; + asblk.b_un.b_fs->e2fs_ficount = sblk.b_un.b_fs->e2fs_ficount; + asblk.b_un.b_fs->e2fs_mtime = sblk.b_un.b_fs->e2fs_mtime; + asblk.b_un.b_fs->e2fs_wtime = sblk.b_un.b_fs->e2fs_wtime; + asblk.b_un.b_fs->e2fs_mnt_count = sblk.b_un.b_fs->e2fs_mnt_count; + asblk.b_un.b_fs->e2fs_max_mnt_count = sblk.b_un.b_fs->e2fs_max_mnt_count; + asblk.b_un.b_fs->e2fs_state = sblk.b_un.b_fs->e2fs_state; + asblk.b_un.b_fs->e2fs_beh = sblk.b_un.b_fs->e2fs_beh; + asblk.b_un.b_fs->e2fs_lastfsck = sblk.b_un.b_fs->e2fs_lastfsck; + asblk.b_un.b_fs->e2fs_fsckintv = sblk.b_un.b_fs->e2fs_fsckintv; + asblk.b_un.b_fs->e2fs_ruid = sblk.b_un.b_fs->e2fs_ruid; + asblk.b_un.b_fs->e2fs_rgid = sblk.b_un.b_fs->e2fs_rgid; + if (memcmp(sblk.b_un.b_fs, asblk.b_un.b_fs, SBSIZE)) { if (debug) { - long *nlp, *olp, *endlp; + u_int32_t *nlp, *olp, *endlp; printf("superblock mismatches\n"); - nlp = (long *)&altsblock; - olp = (long *)&sblock; + nlp = (u_int32_t *)asblk.b_un.b_fs; + olp = (u_int32_t *)sblk.b_un.b_fs; endlp = olp + (SBSIZE / sizeof *olp); for ( ; olp < endlp; olp++, nlp++) { if (*olp == *nlp) continue; printf("offset %ld, original %ld, alternate %ld\n", - (long)(olp - (long *)&sblock), *olp, *nlp); + (long)(olp - (u_int32_t *)sblk.b_un.b_fs), + (long)fs2h32(*olp), + (long)fs2h32(*nlp)); } } badsb(listerr, @@ -356,6 +385,39 @@ readsb(listerr) return (1); } +void +copyback_sb(bp) + struct bufarea *bp; +{ + /* Copy the in-memory superblock back to buffer */ + bp->b_un.b_fs->e2fs_icount = fs2h32(sblock.e2fs.e2fs_icount); + bp->b_un.b_fs->e2fs_bcount = fs2h32(sblock.e2fs.e2fs_bcount); + bp->b_un.b_fs->e2fs_rbcount = fs2h32(sblock.e2fs.e2fs_rbcount); + bp->b_un.b_fs->e2fs_fbcount = fs2h32(sblock.e2fs.e2fs_fbcount); + bp->b_un.b_fs->e2fs_ficount = fs2h32(sblock.e2fs.e2fs_ficount); + bp->b_un.b_fs->e2fs_first_dblock = + fs2h32(sblock.e2fs.e2fs_first_dblock); + bp->b_un.b_fs->e2fs_log_bsize = fs2h32(sblock.e2fs.e2fs_log_bsize); + bp->b_un.b_fs->e2fs_fsize = fs2h32(sblock.e2fs.e2fs_fsize); + bp->b_un.b_fs->e2fs_bpg = fs2h32(sblock.e2fs.e2fs_bpg); + bp->b_un.b_fs->e2fs_fpg = fs2h32(sblock.e2fs.e2fs_fpg); + bp->b_un.b_fs->e2fs_ipg = fs2h32(sblock.e2fs.e2fs_ipg); + bp->b_un.b_fs->e2fs_mtime = fs2h32(sblock.e2fs.e2fs_mtime); + bp->b_un.b_fs->e2fs_wtime = fs2h32(sblock.e2fs.e2fs_wtime); + bp->b_un.b_fs->e2fs_lastfsck = fs2h32(sblock.e2fs.e2fs_lastfsck); + bp->b_un.b_fs->e2fs_fsckintv = fs2h32(sblock.e2fs.e2fs_fsckintv); + bp->b_un.b_fs->e2fs_creator = fs2h32(sblock.e2fs.e2fs_creator); + bp->b_un.b_fs->e2fs_rev = fs2h32(sblock.e2fs.e2fs_rev); + bp->b_un.b_fs->e2fs_mnt_count = fs2h16(sblock.e2fs.e2fs_mnt_count); + bp->b_un.b_fs->e2fs_max_mnt_count = + fs2h16(sblock.e2fs.e2fs_max_mnt_count); + bp->b_un.b_fs->e2fs_magic = fs2h16(sblock.e2fs.e2fs_magic); + bp->b_un.b_fs->e2fs_state = fs2h16(sblock.e2fs.e2fs_state); + bp->b_un.b_fs->e2fs_beh = fs2h16(sblock.e2fs.e2fs_beh); + bp->b_un.b_fs->e2fs_ruid = fs2h16(sblock.e2fs.e2fs_ruid); + bp->b_un.b_fs->e2fs_rgid = fs2h16(sblock.e2fs.e2fs_rgid); +} + void badsb(listerr, s) int listerr; @@ -396,17 +458,17 @@ calcsb(dev, devfd, fs) pp = &lp->d_partitions[0]; else pp = &lp->d_partitions[*cp - 'a']; - if (pp->p_fstype != FS_BSDFFS) { - pfatal("%s: NOT LABELED AS A BSD FILE SYSTEM (%s)\n", + if (pp->p_fstype != FS_EX2FS) { + pfatal("%s: NOT LABELED AS A EXT2 FILE SYSTEM (%s)\n", dev, pp->p_fstype < FSMAXTYPES ? fstypenames[pp->p_fstype] : "unknown"); return (0); } memset(fs, 0, sizeof(struct m_ext2fs)); - fs->e2fs_bsize = 1024; /* XXX to look for altenate SP */ - fs->e2fs.e2fs_log_bsize = 0; + fs->e2fs_bsize = pp->p_fsize; + fs->e2fs.e2fs_log_bsize = pp->p_fsize / 1024; fs->e2fs.e2fs_bcount = (pp->p_size * DEV_BSIZE) / fs->e2fs_bsize; - fs->e2fs.e2fs_first_dblock = 1; + fs->e2fs.e2fs_first_dblock = (fs->e2fs.e2fs_log_bsize == 0) ? 1 : 0; fs->e2fs.e2fs_bpg = fs->e2fs_bsize * NBBY; fs->e2fs_bshift = LOG_MINBSIZE + fs->e2fs.e2fs_log_bsize; fs->e2fs_qbmask = fs->e2fs_bsize - 1; @@ -418,8 +480,6 @@ calcsb(dev, devfd, fs) fs->e2fs_ngdb = howmany(fs->e2fs_ncg, fs->e2fs_bsize / sizeof(struct ext2_gd)); - - return (1); } diff --git a/sbin/fsck_ext2fs/utilities.c b/sbin/fsck_ext2fs/utilities.c index 8f1d8c1eedcc..2135b645b357 100644 --- a/sbin/fsck_ext2fs/utilities.c +++ b/sbin/fsck_ext2fs/utilities.c @@ -1,4 +1,4 @@ -/* $NetBSD: utilities.c,v 1.2 1997/09/14 14:27:31 lukem Exp $ */ +/* $NetBSD: utilities.c,v 1.3 1997/10/09 13:19:41 bouyer Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. @@ -39,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)utilities.c 8.1 (Berkeley) 6/5/93"; #else -__RCSID("$NetBSD: utilities.c,v 1.2 1997/09/14 14:27:31 lukem Exp $"); +__RCSID("$NetBSD: utilities.c,v 1.3 1997/10/09 13:19:41 bouyer Exp $"); #endif #endif /* not lint */ @@ -67,7 +67,7 @@ int ftypeok(dp) struct ext2fs_dinode *dp; { - switch (dp->e2di_mode & IFMT) { + switch (fs2h16(dp->e2di_mode) & IFMT) { case IFDIR: case IFREG: @@ -80,7 +80,7 @@ ftypeok(dp) default: if (debug) - printf("bad file type 0%o\n", dp->e2di_mode); + printf("bad file type 0%o\n", fs2h16(dp->e2di_mode)); return (0); } } @@ -128,6 +128,7 @@ bufinit() long bufcnt, i; char *bufp; + diskreads = totalreads = 0; pbp = pdirbp = (struct bufarea *)0; bufhead.b_next = bufhead.b_prev = &bufhead; bufcnt = MAXBUFSPACE / sblock.e2fs_bsize; @@ -170,6 +171,7 @@ getdatablk(blkno, size) if (bp == &bufhead) errexit("deadlocked buffer pool\n"); getblk(bp, blkno, size); + diskreads++; /* fall through */ foundit: totalreads++; @@ -194,7 +196,6 @@ getblk(bp, blk, size) dblk = fsbtodb(&sblock, blk); if (bp->b_bno != dblk) { flush(fswritefd, bp); - diskreads++; bp->b_errs = bread(fsreadfd, bp->b_un.b_buf, dblk, size); bp->b_bno = dblk; bp->b_size = size; @@ -253,10 +254,13 @@ ckfini(markclean) } flush(fswritefd, &sblk); if (havesb && sblk.b_bno != SBOFF / dev_bsize && - !preen && reply("UPDATE STANDARD SUPERBLOCK")) { + !preen && reply("UPDATE STANDARD SUPERBLOCKS")) { sblk.b_bno = SBOFF / dev_bsize; sbdirty(); flush(fswritefd, &sblk); + copyback_sb(&asblk); + asblk.b_dirty = 1; + flush(fswritefd, &asblk); } for (bp = bufhead.b_prev; bp && bp != &bufhead; bp = nbp) { cnt++;