Little feedback on this, If you have good reasons to keep the ability to convert and/or check (very) old ffs on-disk formats, speak up now.
-Otto On Mon, Apr 18, 2011 at 12:03:38PM +0200, Otto Moerbeek wrote: > Hi, > > this removes the support to check and convert (very) old incarnations > of ffs. This old code makes diffing to fsck_ffs in freebsd harder. > > We use and old filesystem in one place (the vax boot image), but that > image does not need checking, and even Miod is not sure it's actually > needed for the vaxen we support. > > -Otto > > Index: dir.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/dir.c,v > retrieving revision 1.25 > diff -u -p -r1.25 dir.c > --- dir.c 16 Apr 2011 16:37:21 -0000 1.25 > +++ dir.c 17 Apr 2011 11:19:00 -0000 > @@ -115,29 +115,8 @@ dirscan(struct inodesc *idesc) > for (dp = fsck_readdir(idesc); dp != NULL; dp = fsck_readdir(idesc)) { > dsize = dp->d_reclen; > memcpy(dbuf, dp, (size_t)dsize); > -# if (BYTE_ORDER == LITTLE_ENDIAN) > - if (!newinofmt) { > - struct direct *tdp = (struct direct *)dbuf; > - u_char tmp; > - > - tmp = tdp->d_namlen; > - tdp->d_namlen = tdp->d_type; > - tdp->d_type = tmp; > - } > -# endif > idesc->id_dirp = (struct direct *)dbuf; > if ((n = (*idesc->id_func)(idesc)) & ALTERED) { > -# if (BYTE_ORDER == LITTLE_ENDIAN) > - if (!newinofmt && !doinglevel2) { > - struct direct *tdp; > - u_char tmp; > - > - tdp = (struct direct *)dbuf; > - tmp = tdp->d_namlen; > - tdp->d_namlen = tdp->d_type; > - tdp->d_type = tmp; > - } > -# endif > bp = getdirblk(idesc->id_blkno, blksiz); > memcpy(bp->b_un.b_buf + idesc->id_loc - dsize, dbuf, > (size_t)dsize); > @@ -230,19 +209,9 @@ dircheck(struct inodesc *idesc, struct d > return (0); > if (dp->d_ino == 0) > return (1); > - size = DIRSIZ(!newinofmt, dp); > -# if (BYTE_ORDER == LITTLE_ENDIAN) > - if (!newinofmt) { > - type = dp->d_namlen; > - namlen = dp->d_type; > - } else { > - namlen = dp->d_namlen; > - type = dp->d_type; > - } > -# else > - namlen = dp->d_namlen; > - type = dp->d_type; > -# endif > + size = DIRSIZ(0, dp); > + namlen = dp->d_namlen; > + type = dp->d_type; > if (dp->d_reclen < size || > idesc->id_filesize < size || > type > 15) > @@ -334,27 +303,9 @@ mkentry(struct inodesc *idesc) > dirp = (struct direct *)(((char *)dirp) + oldlen); > dirp->d_ino = idesc->id_parent; /* ino to be entered is in id_parent */ > dirp->d_reclen = newent.d_reclen; > - if (newinofmt) > - dirp->d_type = GET_ITYPE(idesc->id_parent); > - else > - dirp->d_type = 0; > + dirp->d_type = GET_ITYPE(idesc->id_parent); > dirp->d_namlen = newent.d_namlen; > memcpy(dirp->d_name, idesc->id_name, (size_t)dirp->d_namlen + 1); > -# if (BYTE_ORDER == LITTLE_ENDIAN) > - /* > - * If the entry was split, dirscan() will only reverse the byte > - * order of the original entry, and not the new one, before > - * writing it back out. So, we reverse the byte order here if > - * necessary. > - */ > - if (oldlen != 0 && !newinofmt && !doinglevel2) { > - u_char tmp; > - > - tmp = dirp->d_namlen; > - dirp->d_namlen = dirp->d_type; > - dirp->d_type = tmp; > - } > -# endif > return (ALTERED|STOP); > } > > @@ -366,10 +317,7 @@ chgino(struct inodesc *idesc) > if (memcmp(dirp->d_name, idesc->id_name, (int)dirp->d_namlen + 1)) > return (KEEPON); > dirp->d_ino = idesc->id_parent; > - if (newinofmt) > - dirp->d_type = GET_ITYPE(idesc->id_parent); > - else > - dirp->d_type = 0; > + dirp->d_type = GET_ITYPE(idesc->id_parent); > return (ALTERED|STOP); > } > > @@ -615,10 +563,7 @@ allocdir(ino_t parent, ino_t request, in > struct inoinfo *inp; > > ino = allocino(request, IFDIR|mode); > - if (newinofmt) > - dirp = &dirhead; > - else > - dirp = (struct dirtemplate *)&odirhead; > + dirp = &dirhead; > dirp->dot_ino = ino; > dirp->dotdot_ino = parent; > dp = ginode(ino); > Index: fsck.h > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/fsck.h,v > retrieving revision 1.24 > diff -u -p -r1.24 fsck.h > --- fsck.h 16 Apr 2011 16:37:21 -0000 1.24 > +++ fsck.h 17 Apr 2011 11:16:15 -0000 > @@ -237,9 +237,6 @@ char yflag; /* assume a yes > response * > int bflag; /* location of alternate super block */ > int debug; /* output debugging info */ > int cvtlevel; /* convert to newer file system format */ > -int doinglevel1; /* converting to new cylinder group format */ > -int doinglevel2; /* converting to new inode format */ > -int newinofmt; /* filesystem has new inode format */ > char usedsoftdep; /* just fix soft dependency inconsistencies > */ > int preen; /* just fix normal inconsistencies */ > char resolved; /* cleared if unresolved changes => not > clean */ > Index: inode.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/inode.c,v > retrieving revision 1.34 > diff -u -p -r1.34 inode.c > --- inode.c 16 Apr 2011 16:37:21 -0000 1.34 > +++ inode.c 17 Apr 2011 11:19:25 -0000 > @@ -650,8 +650,7 @@ allocino(ino_t request, int type) > DIP_SET(dp, di_blocks, btodb(sblock.fs_fsize)); > n_files++; > inodirty(); > - if (newinofmt) > - SET_ITYPE(ino, IFTODT(type)); > + SET_ITYPE(ino, IFTODT(type)); > return (ino); > } > > Index: main.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/main.c,v > retrieving revision 1.37 > diff -u -p -r1.37 main.c > --- main.c 16 Apr 2011 16:37:21 -0000 1.37 > +++ main.c 18 Apr 2011 09:33:15 -0000 > @@ -76,6 +76,9 @@ main(int argc, char *argv[]) > case 'c': > skipclean = 0; > cvtlevel = argtoi('c', "conversion level", optarg, 10); > + if (cvtlevel < 3) > + errexit("cannot do level %d conversion\n", > + cvtlevel); > break; > > case 'd': > Index: pass1.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/pass1.c,v > retrieving revision 1.34 > diff -u -p -r1.34 pass1.c > --- pass1.c 16 Apr 2011 16:37:21 -0000 1.34 > +++ pass1.c 17 Apr 2011 11:20:38 -0000 > @@ -259,34 +259,6 @@ checkinode(ino_t inumber, struct inodesc > ndb++; > if (mode == IFLNK) { > /* > - * Note that the old fastlink format always had di_blocks set > - * to 0. Other than that we no longer use the `spare' field > - * (which is now the extended uid) for sanity checking, the > - * new format is the same as the old. We simply ignore the > - * conversion altogether. - mycroft, 19MAY1994 > - */ > - if (sblock.fs_magic == FS_UFS1_MAGIC && doinglevel2 && > - DIP(dp, di_size) > 0 && > - DIP(dp, di_size) < MAXSYMLINKLEN_UFS1 && > - DIP(dp, di_blocks) != 0) { > - symbuf = alloca(secsize); > - if (bread(fsreadfd, symbuf, > - fsbtodb(&sblock, DIP(dp, di_db[0])), > - (long)secsize) != 0) > - errexit("cannot read symlink\n"); > - if (debug) { > - symbuf[DIP(dp, di_size)] = 0; > - printf("convert symlink %d(%s) of size %llu\n", > - inumber, symbuf, > - (unsigned long long)DIP(dp, di_size)); > - } > - dp = ginode(inumber); > - memcpy(dp->dp1.di_shortlink, symbuf, > - (long)DIP(dp, di_size)); > - DIP_SET(dp, di_blocks, 0); > - inodirty(); > - } > - /* > * Fake ndb value so direct/indirect block checks below > * will detect any garbage after symlink string. > */ > @@ -349,16 +321,6 @@ checkinode(ino_t inumber, struct inodesc > } else > SET_ISTATE(inumber, FSTATE); > SET_ITYPE(inumber, IFTODT(mode)); > - if (sblock.fs_magic == FS_UFS1_MAGIC && doinglevel2 && > - (dp->dp1.di_ouid != (u_short)-1 || > - dp->dp1.di_ogid != (u_short)-1)) { > - dp = ginode(inumber); > - DIP_SET(dp, di_uid, dp->dp1.di_ouid); > - dp->dp1.di_ouid = -1; > - DIP_SET(dp, di_gid, dp->dp1.di_ogid); > - dp->dp1.di_ogid = -1; > - inodirty(); > - } > badblk = dupblk = 0; > idesc->id_number = inumber; > (void)ckinode(dp, idesc); > Index: pass2.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/pass2.c,v > retrieving revision 1.30 > diff -u -p -r1.30 pass2.c > --- pass2.c 16 Apr 2011 16:37:21 -0000 1.30 > +++ pass2.c 17 Apr 2011 11:23:37 -0000 > @@ -259,13 +259,6 @@ pass2check(struct inodesc *idesc) > char pathbuf[MAXPATHLEN + 1]; > > /* > - * If converting, set directory entry type. > - */ > - if (doinglevel2 && dirp->d_ino > 0 && dirp->d_ino < maxino) { > - dirp->d_type = GET_ITYPE(dirp->d_ino); > - ret |= ALTERED; > - } > - /* > * check for "." > */ > if (idesc->id_entryno != 0) > @@ -277,7 +270,7 @@ pass2check(struct inodesc *idesc) > if (reply("FIX") == 1) > ret |= ALTERED; > } > - if (newinofmt && dirp->d_type != DT_DIR) { > + if (dirp->d_type != DT_DIR) { > direrror(idesc->id_number, "BAD TYPE VALUE FOR '.'"); > dirp->d_type = DT_DIR; > if (reply("FIX") == 1) > @@ -287,21 +280,9 @@ pass2check(struct inodesc *idesc) > } > direrror(idesc->id_number, "MISSING '.'"); > proto.d_ino = idesc->id_number; > - if (newinofmt) > - proto.d_type = DT_DIR; > - else > - proto.d_type = 0; > + proto.d_type = DT_DIR; > proto.d_namlen = 1; > (void)strlcpy(proto.d_name, ".", sizeof proto.d_name); > -# if BYTE_ORDER == LITTLE_ENDIAN > - if (!newinofmt) { > - u_char tmp; > - > - tmp = proto.d_type; > - proto.d_type = proto.d_namlen; > - proto.d_namlen = tmp; > - } > -# endif > entrysize = DIRSIZ(0, &proto); > if (dirp->d_ino != 0 && strcmp(dirp->d_name, "..") != 0) { > pfatal("CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS %s\n", > @@ -330,21 +311,9 @@ chk1: > goto chk2; > inp = getinoinfo(idesc->id_number); > proto.d_ino = inp->i_parent; > - if (newinofmt) > - proto.d_type = DT_DIR; > - else > - proto.d_type = 0; > + proto.d_type = DT_DIR; > proto.d_namlen = 2; > (void)strlcpy(proto.d_name, "..", sizeof proto.d_name); > -# if BYTE_ORDER == LITTLE_ENDIAN > - if (!newinofmt) { > - u_char tmp; > - > - tmp = proto.d_type; > - proto.d_type = proto.d_namlen; > - proto.d_namlen = tmp; > - } > -# endif > entrysize = DIRSIZ(0, &proto); > if (idesc->id_entryno == 0) { > n = DIRSIZ(0, dirp); > @@ -360,7 +329,7 @@ chk1: > } > if (dirp->d_ino != 0 && strcmp(dirp->d_name, "..") == 0) { > inp->i_dotdot = dirp->d_ino; > - if (newinofmt && dirp->d_type != DT_DIR) { > + if (dirp->d_type != DT_DIR) { > direrror(idesc->id_number, "BAD TYPE VALUE FOR '..'"); > dirp->d_type = DT_DIR; > if (reply("FIX") == 1) > @@ -473,8 +442,7 @@ again: > /* FALLTHROUGH */ > > case FSTATE: > - if (newinofmt && dirp->d_type != > - GET_ITYPE(dirp->d_ino)) { > + if (dirp->d_type != GET_ITYPE(dirp->d_ino)) { > fileerror(idesc->id_number, dirp->d_ino, > "BAD TYPE VALUE"); > dirp->d_type = GET_ITYPE(dirp->d_ino); > Index: pass5.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/pass5.c,v > retrieving revision 1.40 > diff -u -p -r1.40 pass5.c > --- pass5.c 16 Apr 2011 16:37:21 -0000 1.40 > +++ pass5.c 17 Apr 2011 11:24:38 -0000 > @@ -65,7 +65,7 @@ pass5(void) > struct cg *cg = &cgrp; > daddr64_t dbase, dmax; > daddr64_t d; > - long i, j, k; > + long i, j, k, rewritecg = 0; > struct csum *cs; > struct csum_total cstotal; > struct inodesc idesc[3]; > @@ -80,7 +80,7 @@ pass5(void) > pwarn("DELETING CLUSTERING MAPS\n"); > if (preen || reply("DELETE CLUSTERING MAPS")) { > fs->fs_contigsumsize = 0; > - doinglevel1 = 1; > + rewritecg = 1; > sbdirty(); > } > } > @@ -107,7 +107,7 @@ pass5(void) > doit); > fs->fs_cgsize = > fragroundup(fs, CGSIZE(fs)); > - doinglevel1 = 1; > + rewritecg = 1; > sbdirty(); > } > } > @@ -164,11 +164,8 @@ pass5(void) > fs->fs_postblformat); > } > memset(&idesc[0], 0, sizeof idesc); > - for (i = 0; i < 3; i++) { > + for (i = 0; i < 3; i++) > idesc[i].id_type = ADDR; > - if (doinglevel2) > - idesc[i].id_fix = FIX; > - } > memset(&cstotal, 0, sizeof(struct csum_total)); > dmax = blknum(fs, fs->fs_size + fs->fs_frag - 1); > for (d = fs->fs_size; d < dmax; d++) > @@ -320,7 +317,7 @@ pass5(void) > memcpy(cs, &newcg->cg_cs, sizeof *cs); > sbdirty(); > } > - if (doinglevel1) { > + if (rewritecg) { > memcpy(cg, newcg, (size_t)fs->fs_cgsize); > cgdirty(); > continue; > Index: setup.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/setup.c,v > retrieving revision 1.47 > diff -u -p -r1.47 setup.c > --- setup.c 16 Apr 2011 16:37:21 -0000 1.47 > +++ setup.c 17 Apr 2011 19:16:18 -0000 > @@ -260,96 +260,57 @@ found: > dirty(&asblk); > } > } > - if (sblock.fs_inodefmt >= FS_44INODEFMT) { > - if (sblock.fs_maxfilesize != maxfilesize) { > - pwarn("INCORRECT MAXFILESIZE=%llu IN SUPERBLOCK", > - (unsigned long long)sblock.fs_maxfilesize); > - sblock.fs_maxfilesize = maxfilesize; > - if (preen) > - printf(" (FIXED)\n"); > - if (preen || reply("FIX") == 1) { > - sbdirty(); > - dirty(&asblk); > - } > - } > - maxsymlinklen = sblock.fs_magic == FS_UFS1_MAGIC ? > - MAXSYMLINKLEN_UFS1 : MAXSYMLINKLEN_UFS2; > - if (sblock.fs_maxsymlinklen != maxsymlinklen) { > - pwarn("INCORRECT MAXSYMLINKLEN=%d IN SUPERBLOCK", > - sblock.fs_maxsymlinklen); > - sblock.fs_maxsymlinklen = maxsymlinklen; > - if (preen) > - printf(" (FIXED)\n"); > - if (preen || reply("FIX") == 1) { > - sbdirty(); > - dirty(&asblk); > - } > - } > - if (sblock.fs_qbmask != ~sblock.fs_bmask) { > - pwarn("INCORRECT QBMASK=%lx IN SUPERBLOCK", > - (unsigned long)sblock.fs_qbmask); > - sblock.fs_qbmask = ~sblock.fs_bmask; > - if (preen) > - printf(" (FIXED)\n"); > - if (preen || reply("FIX") == 1) { > - sbdirty(); > - dirty(&asblk); > - } > - } > - if (sblock.fs_qfmask != ~sblock.fs_fmask) { > - pwarn("INCORRECT QFMASK=%lx IN SUPERBLOCK", > - (unsigned long)sblock.fs_qfmask); > - sblock.fs_qfmask = ~sblock.fs_fmask; > - if (preen) > - printf(" (FIXED)\n"); > - if (preen || reply("FIX") == 1) { > - sbdirty(); > - dirty(&asblk); > - } > + if (sblock.fs_inodefmt < FS_44INODEFMT) { > + pwarn("Format of filesystem is too old.\n"); > + pwarn("Must update to modern format using a version of fsck\n"); > + pfatal("from before release 5.0 with the command ``fsck -c > 2''\n"); > + exit(8); > + } > + if (sblock.fs_maxfilesize != maxfilesize) { > + pwarn("INCORRECT MAXFILESIZE=%llu IN SUPERBLOCK", > + (unsigned long long)sblock.fs_maxfilesize); > + sblock.fs_maxfilesize = maxfilesize; > + if (preen) > + printf(" (FIXED)\n"); > + if (preen || reply("FIX") == 1) { > + sbdirty(); > + dirty(&asblk); > } > - newinofmt = 1; > - } else { > - sblock.fs_qbmask = ~sblock.fs_bmask; > - sblock.fs_qfmask = ~sblock.fs_fmask; > - newinofmt = 0; > } > - /* > - * Convert to new inode format. > - */ > - if (cvtlevel >= 2 && sblock.fs_inodefmt < FS_44INODEFMT) { > + maxsymlinklen = sblock.fs_magic == FS_UFS1_MAGIC ? > + MAXSYMLINKLEN_UFS1 : MAXSYMLINKLEN_UFS2; > + if (sblock.fs_maxsymlinklen != maxsymlinklen) { > + pwarn("INCORRECT MAXSYMLINKLEN=%d IN SUPERBLOCK", > + sblock.fs_maxsymlinklen); > + sblock.fs_maxsymlinklen = maxsymlinklen; > if (preen) > - pwarn("CONVERTING TO NEW INODE FORMAT\n"); > - else if (!reply("CONVERT TO NEW INODE FORMAT")) > - return(0); > - doinglevel2++; > - sblock.fs_inodefmt = FS_44INODEFMT; > - sblock.fs_maxfilesize = maxfilesize; > - sblock.fs_maxsymlinklen = MAXSYMLINKLEN_UFS1; > + printf(" (FIXED)\n"); > + if (preen || reply("FIX") == 1) { > + sbdirty(); > + dirty(&asblk); > + } > + } > + if (sblock.fs_qbmask != ~sblock.fs_bmask) { > + pwarn("INCORRECT QBMASK=%lx IN SUPERBLOCK", > + (unsigned long)sblock.fs_qbmask); > sblock.fs_qbmask = ~sblock.fs_bmask; > - sblock.fs_qfmask = ~sblock.fs_fmask; > - sbdirty(); > - dirty(&asblk); > + if (preen) > + printf(" (FIXED)\n"); > + if (preen || reply("FIX") == 1) { > + sbdirty(); > + dirty(&asblk); > + } > } > - /* > - * Convert to new cylinder group format. > - */ > - if (cvtlevel >= 1 && sblock.fs_postblformat == FS_42POSTBLFMT) { > + if (sblock.fs_qfmask != ~sblock.fs_fmask) { > + pwarn("INCORRECT QFMASK=%lx IN SUPERBLOCK", > + (unsigned long)sblock.fs_qfmask); > + sblock.fs_qfmask = ~sblock.fs_fmask; > if (preen) > - pwarn("CONVERTING TO NEW CYLINDER GROUP FORMAT\n"); > - else if (!reply("CONVERT TO NEW CYLINDER GROUP FORMAT")) > - return(0); > - doinglevel1++; > - sblock.fs_postblformat = FS_DYNAMICPOSTBLFMT; > - sblock.fs_nrpos = 8; > - sblock.fs_postbloff = > - (char *)(&sblock.fs_maxbsize) - > - (char *)(&sblock.fs_firstfield); > - sblock.fs_rotbloff = &sblock.fs_space[0] - > - (u_char *)(&sblock.fs_firstfield); > - sblock.fs_cgsize = > - fragroundup(&sblock, CGSIZE(&sblock)); > - sbdirty(); > - dirty(&asblk); > + printf(" (FIXED)\n"); > + if (preen || reply("FIX") == 1) { > + sbdirty(); > + dirty(&asblk); > + } > } > if (sblock.fs_cgsize != fragroundup(&sblock, CGSIZE(&sblock))) { > pwarn("INCONSISTENT CGSIZE=%d\n", sblock.fs_cgsize); > Index: utilities.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/utilities.c,v > retrieving revision 1.38 > diff -u -p -r1.38 utilities.c > --- utilities.c 16 Apr 2011 16:37:21 -0000 1.38 > +++ utilities.c 17 Apr 2011 11:26:48 -0000 > @@ -511,8 +511,7 @@ getpathname(char *namebuf, size_t namebu > void > catch(int signo) > { > - if (!doinglevel2) > - ckfini(0); /* XXX signal race */ > + ckfini(0); /* XXX signal race */ > _exit(12); > }