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>
