Subject: NetBSD/pmax fsck gets symlinks wrong on Ultrix ffs partitions +GROSS FIX
To: None <port-pmax@sun-lamp.cs.berkeley.edu>
From: Jonathan Stone <jonathan@DSG.Stanford.EDU>
List: port-pmax
Date: 08/22/1994 21:21:21
I followed a suggestion from Chris Demetriou, changing off_t in a
private copy of netbsd's sys/types.h from quad_t to unsigned long, and
compiling an fsck under Ultrix. I used something like
bmake -k CC="gcc -nostdinc -I- -I. -I/src/NetBSD/src/include
-I/src/NetBSD/src/sys -I/src/NetBSD/binaries/pmax
-I/src/NetBSD/src/sbin/fsck -I/src/NetBSD/src/sys/sys"
where I have my netBSD tree in /src/NetBSD; and I'd made symlinks from
/src/NetBSD/src/sys/arch/pmax/include to
/src/NetBSD/src/sbin/fsck/machine; *and* also made a copy of the
Ultrix stdio in the fsck directory, with the include of sys/types
taken out.
I find that almost works. Thanks for the tip, Crhis!
But the resulting fsck just doesn't work on symlinks. It says it
expects a bunch of inodes - the first two of which appear
to be symlinks -- are size 2 blocks and should be zero,
and tries to correct them. This is clearly wrong: on 4.2 filesystems,
the destination of a soft link is put into direct blocks.
I believe that they're really two blocks --it's an 8k/1k filesystem,
with DEV_BSIZE at 512 bytes. This has the really nasty effect
that if one follow's Adam's suggestion on booting, the
symlink in /sbin from /init to /bin/init gets trashed..
Some debugging shows that sblock.fs_maxsymlinklen was being set to -1,
presumably from the superblock. I tried the following (gross) patch,
and it works for me. Now I can safely, happily mount local
filesystems read-write. Hooray!
(PS: if someone'd remind me what I'm meant to do to remount
the root partition read-write, I'd be grateful...)
*** src/sbin/fsck/setup.c.DIST Thu Jun 30 03:31:27 1994
--- src/sbin/fsck/setup.c Mon Aug 22 21:09:11 1994
***************
*** 181,186 ****
--- 181,194 ----
newinofmt = 0;
}
/*
+ * XXX Apparenlty necessary for Ultrix filesystems with symlinks
+ */
+ if (sblock.fs_postblformat == FS_42POSTBLFMT && sblock.fs_maxsymlinklen == -1) {
+ pwarn("IMPOSSIBLE IN-INODE SYMINK MAXLEN= %d, set to zero\n",
+ sblock.fs_maxsymlinklen);
+ sblock.fs_maxsymlinklen = 0;
+ }
+ /*
* Convert to new inode format.
*/
if (cvtlevel >= 2 && sblock.fs_inodefmt < FS_44INODEFMT) {
------------------------------------------------------------------------------