Date: Tue, 6 Apr 2004 11:55:22 -0700 (PDT) From: Nate Lawson <nate@root.org> To: Lukas Ertl <le@FreeBSD.org> Cc: cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sbin/growfs Makefile debug.c growfs.c Message-ID: <20040406114524.O28713@root.org> In-Reply-To: <20040406204024.X631@korben> References: <200404031740.i33HeKH6016345@repoman.freebsd.org> <20040403184246.GA613@darkness.comp.waw.pl> <20040406194620.P631@korben> <20040406113129.T28582@root.org> <20040406204024.X631@korben>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 6 Apr 2004, Lukas Ertl wrote: > On Tue, 6 Apr 2004, Nate Lawson wrote: > > > On Tue, 6 Apr 2004, Lukas Ertl wrote: > > > On Sat, 3 Apr 2004, Pawel Jakub Dawidek wrote: > > > > > > > On Sat, Apr 03, 2004 at 09:40:20AM -0800, Lukas Ertl wrote: > > > > +> > > > > +> Modified files: > > > > +> sbin/growfs Makefile debug.c growfs.c > > > > +> Log: > > > > +> Make growfs WARNS=6 clean. > > > > > > > > AFAIK growfs(8) doesn't work with UFS2, so maybe while you are here... :) > > > > > > It works on UFS2, but not very well. Yes, I'll have a look, but maybe > > > I'll make a big style sweep first, so I can actually read what's going on > > > there. :-) > > > > It does work but there are problems. First thing that should be done is > > factor out the superblock update code and have growfs bring it up to > > canonical (latest) form before processing the fs. Also, there are minor > > things like it removing flags like ACLs from the superblock. > > Do you still have the patches you talked about floating around? 1. Factor out ffs_oldfscompat_read and ffs_oldfscompat_write to a .c (ffs_sb.c?) 2. Make it compile in userland (!_KERNEL) case. 3. Compile it into growfs (as appropriate, move into libufs) You'll want to change rdfs and wtfs to use a byte offset instead of a block offset because the newest sb form uses that. This diff also fixes the fs_flags update to only kill the clean/fsck flags but preserve the others. This diff is not complete and was only a start to the experiment. Contact mckusick@ for more info on this approach. ffs_sb.c: #include <sys/types.h> #include <ufs/ufs/dinode.h> #include <ufs/ffs/fs.h> /* * Sanity checks for loading old filesystem superblocks. * See ffs_oldfscompat_write below for unwound actions. * * fs is a pointer to the superblock to update, savedmaxfilesize indicates * an area to store the maxfilesize for ffs_oldfscompat_write(), and sblockloc * is the offset of the sblock in bytes. */ void ffs_oldfscompat_read(struct fs *fs, int64_t *savedmaxfilesize, ufs2_daddr_t sblockloc) { ... } /* * Unwinding superblock updates for old filesystems. * See ffs_oldfscompat_read above for details. */ void ffs_oldfscompat_write(struct fs *fs, int64_t maxfilesize) { ... } Diffs: diff -u -r1.13 growfs.c --- /home/nate/freebsd/growfs.old/growfs.c 30 Dec 2002 21:18:05 -0000 1.13 +++ /home/nate/freebsd/growfs.old/growfs.c 4 Apr 2003 16:54:31 -0000 @@ -299,7 +299,7 @@ * Now write the new superblock back to disk. */ sblock.fs_time = utime; - wtfs(sblockloc, (size_t)SBLOCKSIZE, (void *)&sblock, fso, Nflag); + wtfs(sblockloc / DEV_BSIZE, SBLOCKSIZE, &sblock, fso, Nflag); DBG_PRINT0("sblock written\n"); DBG_DUMP_FS(&sblock, "new initial sblock"); @@ -313,7 +313,8 @@ sblock.fs_cgrotor = 0; sblock.fs_state = 0; memset((void *)&sblock.fs_fsmnt, 0, sizeof(sblock.fs_fsmnt)); - sblock.fs_flags &= FS_DOSOFTDEP; + sblock.fs_flags &= ~(FS_UNCLEAN | FS_NEEDSFSCK); + sblock.fs_old_flags = sblock.fs_flags & 0xff; /* * XXX @@ -326,6 +327,7 @@ * fs_minfree, * fs_optim * fs_flags regarding SOFTPDATES + * fs_old_flags * * We probably should rather change the summary for the cylinder group * statistics here to the value of what would be in there, if the file @@ -363,7 +365,7 @@ { DBG_FUNC("initcg") static caddr_t iobuf; - long i, j, d, dlower, dupper, blkno, start; + long i, d, dlower, dupper, blkno, start; ufs2_daddr_t cbase, dmax; struct ufs1_dinode *dp1; struct ufs2_dinode *dp2; @@ -440,6 +442,9 @@ dp1 = (struct ufs1_dinode *)iobuf; dp2 = (struct ufs2_dinode *)iobuf; #ifdef FSIRAND + { + int j; + for (j = 0; j < INOPB(&sblock); j++) if (sblock.fs_magic == FS_UFS1_MAGIC) { dp1->di_gen = random(); @@ -448,6 +453,7 @@ dp2->di_gen = random(); dp2++; } + } #endif wtfs(fsbtodb(&sblock, cgimin(&sblock, cylno) + i), sblock.fs_bsize, iobuf, fso, Nflag); @@ -1494,7 +1500,7 @@ */ for(i=0; i<ind; i++) { if(!bp[i].found || (bp[i].found>sblock.fs_frag)) { - warnx("error: %d refs found for block %d.", + warnx("error: %d refs found for block %jd.", bp[i].found, bp[i].old); } @@ -2042,18 +2048,20 @@ /* * Read the current superblock, and take a backup. + * sblockloc is now always in units of bytes, not blocks */ for (i = 0; sblock_try[i] != -1; i++) { - sblockloc = sblock_try[i] / DEV_BSIZE; - rdfs(sblockloc, (size_t)SBLOCKSIZE, (void *)&(osblock), fsi); + sblockloc = sblock_try[i]; + rdfs(sblockloc / DEV_BSIZE, SBLOCKSIZE, &osblock, fsi); if ((osblock.fs_magic == FS_UFS1_MAGIC || (osblock.fs_magic == FS_UFS2_MAGIC && - osblock.fs_sblockloc == sblock_try[i])) && + (osblock.fs_sblockloc == sblockloc || + (osblock.fs_old_flags & FS_FLAGS_UPDATED) == 0))) && osblock.fs_bsize <= MAXBSIZE && osblock.fs_bsize >= sizeof(struct fs)) break; } - if (sblock_try[i] == -1) { + if (sblock_try[i] == -1 || osblock.fs_sbsize < SBLOCKSIZE) { errx(1, "superblock not recognized"); } memcpy((void *)&fsun1, (void *)&fsun2, sizeof(fsun2)); @@ -2114,7 +2122,7 @@ } } - printf("new file systemsize is: %d frags\n", sblock.fs_size); + printf("new file systemsize is: %jd frags\n", sblock.fs_size); /* * Try to access our new last block in the file system. Even if we @@ -2156,7 +2164,7 @@ sblock.fs_ncg--; if (sblock.fs_magic == FS_UFS1_MAGIC) sblock.fs_old_ncyl = sblock.fs_ncg * sblock.fs_old_cpg; - printf("Warning: %d sector(s) cannot be allocated.\n", + printf("Warning: %jd sector(s) cannot be allocated.\n", fsbtodb(&sblock, sblock.fs_size % sblock.fs_fpg)); sblock.fs_size = sblock.fs_ncg * sblock.fs_fpg; } @@ -2340,7 +2348,7 @@ ufs_lbn_t len, lbn, numblks; ufs2_daddr_t iptr, blksperindir; union dinode *ino; - int i, mode, remaining_blocks, inodeupdated; + int i, mode, inodeupdated; DBG_ENTER; @@ -2420,7 +2428,6 @@ { DBG_FUNC("indirchk") void *ibuf; - off_t offset; int i, last; ufs2_daddr_t iptr;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040406114524.O28713>