From d7d6a198df823a359b39db442d8f3c1aa006fa3f Mon Sep 17 00:00:00 2001 From: imp Date: Tue, 28 Jul 1998 18:50:01 +0000 Subject: Commit patch from Tor Egge to fix the "large filesystem restore" problem. This appears to work for me in the old case, but I don't have large enough filesystems to test the fix case. Reported working by: karl@mcs.net --- sbin/restore/tape.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'sbin') diff --git a/sbin/restore/tape.c b/sbin/restore/tape.c index 9cf1d3f..03ddd15 100644 --- a/sbin/restore/tape.c +++ b/sbin/restore/tape.c @@ -41,7 +41,7 @@ static char sccsid[] = "@(#)tape.c 8.9 (Berkeley) 5/1/95"; #endif static const char rcsid[] = - "$Id$"; + "$Id: tape.c,v 1.13 1998/07/28 06:20:15 charnier Exp $"; #endif /* not lint */ #include @@ -107,6 +107,8 @@ static void xtrmap __P((char *, long)); static void xtrmapskip __P((char *, long)); static void xtrskip __P((char *, long)); +static int readmapflag; + /* * Set up an input source */ @@ -681,7 +683,7 @@ getfile(fill, skip) 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 ? @@ -700,7 +702,7 @@ loop: } 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; } @@ -1098,6 +1100,7 @@ good: qcvt.val[0] = i; buf->c_dinode.di_size = qcvt.qval; } + readmapflag = 0; switch (buf->c_type) { @@ -1108,8 +1111,11 @@ good: */ 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: @@ -1190,7 +1196,7 @@ newcalc: 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; -- cgit v1.1