X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Ftape.c;h=2db739cf91b19e5e0df7ae845e62618358cf8e5a;hb=90aa48744a16dcf7ec265a9437004fd3c4d8b526;hp=16328bd0a313ca691400985edf414bd888776104;hpb=d6967896bc4e18f9b4359a2ef5be5c0f1bcc456a;p=dump.git diff --git a/dump/tape.c b/dump/tape.c index 16328bd..2db739c 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.27 2000/12/21 11:14:54 stelian Exp $"; + "$Id: tape.c,v 1.30 2001/02/16 13:38:47 stelian Exp $"; #endif /* not lint */ #include @@ -236,24 +236,27 @@ dumpblock(daddr_t blkno, int size) int nogripe = 0; static void -tperror(int signo) +tperror(int errnum) { if (pipeout) { - msg("write error on %s\n", tape); + msg("write error on %s: %s\n", tape, strerror(errnum)); quit("Cannot recover\n"); /* NOTREACHED */ } - msg("write error %d blocks into volume %d\n", blocksthisvol, tapeno); + msg("write error %d blocks into volume %d: %s\n", blocksthisvol, tapeno, strerror(errnum)); broadcast("DUMP WRITE ERROR!\n"); - if (!query("Do you want to restart?")) - dumpabort(0); - msg("Closing this volume. Prepare to restart with new media;\n"); - msg("this dump volume will be rewritten.\n"); - killall(); - nogripe = 1; - close_rewind(); - Exit(X_REWRITE); + if (query("Do you want to rewrite this volume?")) { + msg("Closing this volume. Prepare to restart with new media;\n"); + msg("this dump volume will be rewritten.\n"); + killall(); + nogripe = 1; + close_rewind(); + Exit(X_REWRITE); + } + if (query("Do you want to start the next tape?")) + return; + dumpabort(0); } static void @@ -286,6 +289,8 @@ do_stats(void) #else ctime(&tnow)); #endif + msg("Volume %d: %ld tape blocks (%.2fMB)\n", tapeno, + blocks, ((double)blocks * TP_BSIZE / 1048576)); if (ttaken > 0) { msg("Volume %d took %d:%02d:%02d\n", tapeno, ttaken / 3600, (ttaken % 3600) / 60, ttaken % 60); @@ -310,11 +315,17 @@ mktimeest(time_t tnow) tapesize = blockswritten; deltat = tstart_writing - tnow + (1.0 * (tnow - tstart_writing)) / blockswritten * tapesize; - (void)snprintf(msgbuf, sizeof(msgbuf), - "%3.2f%% done at %ld KB/s, finished in %d:%02d\n", - (blockswritten * 100.0) / tapesize, - (spcl.c_tapea - tapea_volume) / (tnow - tstart_volume), - (int)(deltat / 3600), (int)((deltat % 3600) / 60)); + if (tnow > tstart_volume) + (void)snprintf(msgbuf, sizeof(msgbuf), + "%3.2f%% done at %ld KB/s, finished in %d:%02d\n", + (blockswritten * 100.0) / tapesize, + (spcl.c_tapea - tapea_volume) / (tnow - tstart_volume), + (int)(deltat / 3600), (int)((deltat % 3600) / 60)); + else + (void)snprintf(msgbuf, sizeof(msgbuf), + "%3.2f%% done, finished in %d:%02d\n", + (blockswritten * 100.0) / tapesize, + (int)(deltat / 3600), (int)((deltat % 3600) / 60)); return msgbuf; } @@ -371,6 +382,10 @@ flushtape(void) } slp->sent = 0; + /* Check for errors */ + if (got < 0) + tperror(-got); + /* Check for end of tape */ if (got < writesize) { msg("End of tape detected\n"); @@ -484,6 +499,10 @@ trewind(void) dumpabort(0); } slaves[f].sent = 0; + + if (got < 0) + tperror(-got); + if (got != writesize) { msg("EOT detected in last 2 tape records!\n"); msg("Use a longer tape, decrease the size estimate\n"); @@ -657,6 +676,9 @@ rollforward(void) } slp->sent = 0; + if (got < 0) + tperror(-got); + if (got != writesize) { quit("EOT detected at start of the tape!\n"); } @@ -916,8 +938,6 @@ enslave(void) sigaction(SIGTERM, &sa, NULL); /* Slave sends SIGTERM on dumpabort() */ sa.sa_handler = sigpipe; sigaction(SIGPIPE, &sa, NULL); - sa.sa_handler = tperror; - sigaction(SIGUSR1, &sa, NULL); /* Slave sends SIGUSR1 on tape errors */ sa.sa_handler = proceed; sa.sa_flags = SA_RESTART; sigaction(SIGUSR2, &sa, NULL); /* Slave sends SIGUSR2 to next slave */ @@ -1002,7 +1022,6 @@ doslave(int cmd, int slave_number) register int nread; int nextslave, size, eot_count; volatile int wrote = 0; - sigset_t sigset; #ifdef __linux__ errcode_t retval; #endif @@ -1095,19 +1114,17 @@ doslave(int cmd, int slave_number) if (eot_count > 0) size = 0; - if (wrote < 0) { - (void) kill(master, SIGUSR1); - sigemptyset(&sigset); - sigaddset(&sigset, SIGINT); - for (;;) - sigsuspend(&sigset); - } else { - /* - * pass size of write back to master - * (for EOT handling) - */ - (void) atomic_write( cmd, (char *)&size, sizeof size); - } + /* + * pass errno back to master for special handling + */ + if (wrote < 0) + size = -errno; + + /* + * pass size of write back to master + * (for EOT handling) + */ + (void) atomic_write( cmd, (char *)&size, sizeof size); /* * If partial write, don't want next slave to go.