- /* wait for result from dumper */
-
- cmd = getresult(dumper->outfd, 1, &result_argc, result_argv, MAX_ARGS+1);
-
- if(cmd != BOGUS)
- free_serial(result_argv[2]);
-
- switch(cmd) {
- case BOGUS:
- /* either eof or garbage from dumper */
- log_add(L_WARNING, "%s pid %ld is messed up, ignoring it.\n",
- dumper->name, (long)dumper->pid);
- dumper->down = 1; /* mark it down so it isn't used again */
- failed = 1; /* dump failed, must still finish up with taper */
- break;
-
- case DONE: /* DONE <handle> <origsize> <dumpsize> <dumptime> <err str> */
- /* everything went fine */
- origsize = (long)atof(result_argv[3]);
- dumpsize = (long)atof(result_argv[4]);
- dumptime = (long)atof(result_argv[5]);
- break;
-
- case NO_ROOM: /* NO-ROOM <handle> */
- dumper_cmd(dumper, ABORT, dp);
- cmd = getresult(dumper->outfd, 1, &result_argc, result_argv, MAX_ARGS+1);
- if(cmd != BOGUS)
- free_serial(result_argv[2]);
- assert(cmd == ABORT_FINISHED);
-
- case TRYAGAIN: /* TRY-AGAIN <handle> <err str> */
- default:
- /* dump failed, but we must still finish up with taper */
- failed = 1; /* problem with dump, possibly nonfatal */
- break;
-
- case FAILED: /* FAILED <handle> <errstr> */
- /* dump failed, but we must still finish up with taper */
- failed = 2; /* fatal problem with dump */
- break;
- }
-
- /*
- * Note that at this point, even if the dump above failed, it may
- * not be a fatal failure if taper below says we can try again.
- * E.g. a dumper failure above may actually be the result of a
- * tape overflow, which in turn causes dump to see "broken pipe",
- * "no space on device", etc., since taper closed the port first.
- */
-
- cmd = getresult(taper, 1, &result_argc, result_argv, MAX_ARGS+1);
-
- switch(cmd) {
- case DONE: /* DONE <handle> <label> <tape file> <err mess> */
- if(result_argc != 5) {
- error("error [dump to tape DONE result_argc != 5: %d]", result_argc);
- }
-
- if(failed == 1) goto tryagain; /* dump didn't work */
- else if(failed == 2) goto failed_dumper;
-
- free_serial(result_argv[2]);
-
- /* every thing went fine */
- update_info_dumper(dp, origsize, dumpsize, dumptime);
- filenum = atoi(result_argv[4]);
- update_info_taper(dp, result_argv[3], filenum, sched(dp)->level);
- /* note that update_info_dumper() must be run before
- update_info_taper(), since update_info_dumper overwrites
- tape information. */
-
- break;
-
- case TRYAGAIN: /* TRY-AGAIN <handle> <err mess> */
- tryagain:
- headqueue_disk(&runq, dp);
- failed_dumper:
- update_failed_dump_to_tape(dp);
- free_serial(result_argv[2]);
- tape_left = tape_length;
- break;
-
-
- case TAPE_ERROR: /* TAPE-ERROR <handle> <err mess> */
- case BOGUS:
- default:
- update_failed_dump_to_tape(dp);
- free_serial(result_argv[2]);
- failed = 2; /* fatal problem */
- start_degraded_mode(&runq);
- }
-
- /* reset statistics & return */
-
- taper_busy = dumper->busy = 0;
- dp->host->inprogress -= 1;
- dp->inprogress = 0;
- deallocate_bandwidth(dp->host->netif, sched(dp)->est_kps);