Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Jul 1998 17:19:47 +0200
From:      Tor.Egge@fast.no
To:        karl@mcs.net
Cc:        current@FreeBSD.ORG
Subject:   Re: Serious Dump problems
Message-ID:  <199807281519.RAA12042@pat.idi.ntnu.no>
In-Reply-To: Your message of "Tue, 28 Jul 1998 07:35:23 -0500"
References:  <19980728073523.02311@mcs.net>

next in thread | previous in thread | raw e-mail | index | archive | help
> Hi folks,
> 
> I have an interesting one here...
> 
> I have a dump tape which is intact, yet restore complains about "hole in
> map" and segv's when attempting to start up in interactive mode.

Philip Inglesant <philip@dircon.net> gave a good description of this
problem on the -stable list.

You probably had more than 4 million inodes on the file system.  Thus
the bitmaps uses more than 512 KB(i.e. more than 512 tape blocks).

Running dump/restore using a 51 GB partition (with 13 million inodes
gave the same problem for me.

> It appears that dump and restore are VERY old, and nobody is maintaining
> them.  Interestingly enough, a new dump of the same filesystem produces
> the same error, so I suspect a problem with dump where it is writing out a
> bad directory map.

It is not sufficient to only change dump.  The calculation of maxino
in restore depends upon the current behavior of dump, using a 
value larger than 512 in the c_count field when the number of inodes
is larger than 4 million.

Only a small change to restore is needed.

> Any ideas on this one?  Is there a more recent set of sources available
> somewhere that might not display this problem?

I suggest using a patch similar to this (barely tested) one in order
to avoid the buffer overrun in restore.

Index: tape.c
===================================================================
RCS file: /home/ncvs/src/sbin/restore/tape.c,v
retrieving revision 1.12
diff -u -r1.12 tape.c
--- tape.c	1998/06/28 20:25:59	1.12
+++ tape.c	1998/07/28 13:45:29
@@ -104,6 +104,8 @@
 static void	 xtrmapskip __P((char *, long));
 static void	 xtrskip __P((char *, long));
 
+static int readmapflag;
+
 /*
  * Set up an input source
  */
@@ -678,7 +680,7 @@
 	gettingfile++;
 loop:
 	for (i = 0; i < spcl.c_count; i++) {
-		if (spcl.c_addr[i]) {
+		if (readmapflag || spcl.c_addr[i]) {
 			readtape(&buf[curblk++][0]);
 			if (curblk == fssize / TP_BSIZE) {
 				(*fill)((char *)buf, (long)(size > TP_BSIZE ?
@@ -697,7 +699,7 @@
 		}
 		if ((size -= TP_BSIZE) <= 0) {
 			for (i++; i < spcl.c_count; i++)
-				if (spcl.c_addr[i])
+				if (readmapflag || spcl.c_addr[i])
 					readtape(junk);
 			break;
 		}
@@ -1095,6 +1097,7 @@
 		qcvt.val[0] = i;
 		buf->c_dinode.di_size = qcvt.qval;
 	}
+	readmapflag = 0;
 
 	switch (buf->c_type) {
 
@@ -1105,8 +1108,11 @@
 		 */
 		buf->c_inumber = 0;
 		buf->c_dinode.di_size = buf->c_count * TP_BSIZE;
-		for (i = 0; i < buf->c_count; i++)
-			buf->c_addr[i]++;
+		if (buf->c_count > TP_NINDIR)
+			readmapflag = 1;
+		else 
+			for (i = 0; i < buf->c_count; i++)
+				buf->c_addr[i]++;
 		break;
 
 	case TS_TAPE:
@@ -1187,7 +1193,7 @@
 	blks = 0;
 	if (header->c_type != TS_END)
 		for (i = 0; i < header->c_count; i++)
-			if (header->c_addr[i] != 0)
+			if (readmapflag || header->c_addr[i] != 0)
 				blks++;
 	predict = blks;
 	blksread = 0;

> 
> Needless to say, unrestorable tapes are not my idea of a good time!

I agree.

- Tor Egge

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199807281519.RAA12042>