Fix restore of files spanning on the first and second volumes of a dump.
authorStelian Pop <stelian@popies.net>
Thu, 23 Jul 2009 14:10:38 +0000 (14:10 +0000)
committerStelian Pop <stelian@popies.net>
Thu, 23 Jul 2009 14:10:38 +0000 (14:10 +0000)
CHANGES
restore/tape.c

diff --git a/CHANGES b/CHANGES
index 3e0e7c45e78f46409fad4ce25c4064e3d53e8501..8d217dd6ccda9128a97978707b47f8e1d2ea959b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,4 @@
-$Id: CHANGES,v 1.303 2009/07/23 09:34:07 stelian Exp $
+$Id: CHANGES,v 1.304 2009/07/23 14:10:38 stelian Exp $
 
 Changes between versions 0.4b42 and 0.4b43 (released ?????????????)
 ===================================================================
@@ -7,6 +7,12 @@ Changes between versions 0.4b42 and 0.4b43 (released ?????????????)
        (> 2 GB). Thanks to X DUGi <xdugi@users.sourceforge.net> for
        reporting the bug (Sourceforge bug #2820629)
 
+2.     Fix 'restore -x' in multi-volume mode, which caused files being
+       spanned on the first and second volumes to be incorrectly extracted.
+       Thanks to Adam Tkac <atkac@redhat.com> for reporting the bug.
+       (there may be several bug reports about this issue, including
+       Sourceforge bug #2117008, RedHat bugs #232415 and #444958).
+
 Changes between versions 0.4b41 and 0.4b42 (released June 18, 2009)
 ===================================================================
 
index 3d673b62b740c9c1057e70a2ef6c3d0cd9dec469..b779fd72517dd904a17b3430cd2a8d90790e4081 100644 (file)
@@ -42,7 +42,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: tape.c,v 1.92 2007/02/22 20:16:23 stelian Exp $";
+       "$Id: tape.c,v 1.93 2009/07/23 14:10:39 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -474,7 +474,6 @@ getvol(long nextvol)
        if (nextvol == 1) {
                tapesread = 0;
                gettingfile = 0;
-               tpblksread = 0;
                blksread = 0;
        }
        if (pipein) {
@@ -1333,7 +1332,11 @@ loop:
                        break;
                }
        }
-       if (gethead(&spcl) == GOOD && size > 0) {
+       while (gethead(&spcl) != GOOD) {
+               fprintf(stderr, "Incorrect block for %s at %ld blocks\n",
+                       curfile.name, (long)blksread);
+       }
+       if (size > 0) {
                if (spcl.c_type == TS_ADDR)
                        goto loop;
                Dprintf(stdout,