cvs commit: src/sbin/growfs Makefile debug.c growfs.c
Nate Lawson
nate at root.org
Tue Apr 6 12:03:02 PDT 2004
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;
More information about the cvs-src
mailing list