From 740dbf0d62bd81b8aa1ab1ce5775f913a1ccbc52 Mon Sep 17 00:00:00 2001 From: bouyer Date: Fri, 14 Dec 2001 14:43:33 +0000 Subject: [PATCH] Add a -l (autoload) flag. For multivolume dumps, this makes dump eject the tape when a volume is full, and try to reopen the tape drive for 2 mn. To be used with tape changers which load the next tape when the current one is ejected. While I'm there fix eject handling for remote tape. --- sbin/dump/dump.8 | 12 ++++++++++-- sbin/dump/dump.h | 6 ++++-- sbin/dump/dumprmt.c | 36 ++++++++++++++++++------------------ sbin/dump/main.c | 13 +++++++++---- sbin/dump/tape.c | 31 +++++++++++++++++++++++++++---- 5 files changed, 68 insertions(+), 30 deletions(-) diff --git a/sbin/dump/dump.8 b/sbin/dump/dump.8 index a6e915166d9c..d4ceb0b16a5c 100644 --- a/sbin/dump/dump.8 +++ b/sbin/dump/dump.8 @@ -1,4 +1,4 @@ -.\" $NetBSD: dump.8,v 1.42 2001/12/07 19:53:44 wiz Exp $ +.\" $NetBSD: dump.8,v 1.43 2001/12/14 14:43:33 bouyer Exp $ .\" .\" Copyright (c) 1980, 1991, 1993 .\" Regents of the University of California. @@ -43,7 +43,7 @@ .Nd file system backup .Sh SYNOPSIS .Nm "" -.Op Fl 0123456789ceFnStu +.Op Fl 0123456789ceFlnStu .Op Fl B Ar records .Op Fl b Ar blocksize .Op Fl d Ar density @@ -187,6 +187,14 @@ but full backups retain them. .It Fl k Ar read blocksize The size in kilobyte of the read buffers, rounded up to a multiple of the file system block size. Default is 32k. +.It Fl l +If a tape change is required, eject the tape and wait for the drive to +be ready again. This is to be used with tape changers which automatically load +the next tape when the tape is ejected. If after 2 minutes the drive is not +ready +.Nm +falls back to the default behavior, and prompts the operator for the next +tape. .It Fl L Ar label The user-supplied text string .Ar label diff --git a/sbin/dump/dump.h b/sbin/dump/dump.h index 20e798e7e427..7ae0887e0a9d 100644 --- a/sbin/dump/dump.h +++ b/sbin/dump/dump.h @@ -1,4 +1,4 @@ -/* $NetBSD: dump.h,v 1.29 2001/10/15 13:25:34 blymn Exp $ */ +/* $NetBSD: dump.h,v 1.30 2001/12/14 14:43:33 bouyer Exp $ */ /*- * Copyright (c) 1980, 1993 @@ -98,6 +98,7 @@ char lastlevel; /* dump level of previous dump */ char level; /* dump level of this dump */ int uflag; /* update flag */ int eflag; /* eject flag */ +int lflag; /* autoload flag */ int diskfd; /* disk file descriptor */ int tapefd; /* tape file descriptor */ int pipeout; /* true => output to standard output */ @@ -211,8 +212,9 @@ char *xstrdup(const char *); #if defined(RDUMP) || defined(RRESTORE) void rmtclose(void); int rmthost(char *); -int rmtopen(char *, int); +int rmtopen(char *, int, int); int rmtwrite(char *, int); +int rmtioctl(int, int); #endif /* RDUMP || RRESTORE */ void interrupt(int); /* in case operator bangs on console */ diff --git a/sbin/dump/dumprmt.c b/sbin/dump/dumprmt.c index 86f822af42fe..279a9f79f626 100644 --- a/sbin/dump/dumprmt.c +++ b/sbin/dump/dumprmt.c @@ -1,4 +1,4 @@ -/* $NetBSD: dumprmt.c,v 1.26 2001/11/01 08:03:03 lukem Exp $ */ +/* $NetBSD: dumprmt.c,v 1.27 2001/12/14 14:43:33 bouyer Exp $ */ /*- * Copyright (c) 1980, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)dumprmt.c 8.3 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: dumprmt.c,v 1.26 2001/11/01 08:03:03 lukem Exp $"); +__RCSID("$NetBSD: dumprmt.c,v 1.27 2001/12/14 14:43:33 bouyer Exp $"); #endif #endif /* not lint */ @@ -84,14 +84,13 @@ static int rmtape; static char *rmtpeer; static int okname(char *); -static int rmtcall(char *, char *); +static int rmtcall(char *, char *, int); static void rmtconnaborted(int); static int rmtgetb(void); static void rmtgetconn(void); static void rmtgets(char *, int); - int rmtioctl(int, int); int rmtread(char *, int); -static int rmtreply(char *); +static int rmtreply(char *, int); int rmtseek(int, int); extern int ntrec; /* blocking factor on tape */ @@ -184,13 +183,13 @@ okname(char *cp0) } int -rmtopen(char *tapedevice, int mode) +rmtopen(char *tapedevice, int mode, int verbose) { char buf[256]; (void)snprintf(buf, sizeof buf, "O%s\n%d\n", tapedevice, mode); rmtstate = TS_OPEN; - return (rmtcall(tapedevice, buf)); + return (rmtcall(tapedevice, buf, verbose)); } void @@ -199,7 +198,7 @@ rmtclose(void) if (rmtstate != TS_OPEN) return; - rmtcall("close", "C\n"); + rmtcall("close", "C\n", 1); rmtstate = TS_CLOSED; } @@ -210,7 +209,7 @@ rmtread(char *buf, int count) int n, i, cc; (void)snprintf(line, sizeof line, "R%d\n", count); - n = rmtcall("read", line); + n = rmtcall("read", line, 1); if (n < 0) { errno = n; return (-1); @@ -232,7 +231,7 @@ rmtwrite(char *buf, int count) (void)snprintf(line, sizeof line, "W%d\n", count); write(rmtape, line, strlen(line)); write(rmtape, buf, count); - return (rmtreply("write")); + return (rmtreply("write", 1)); } #if 0 /* XXX unused? */ @@ -256,7 +255,7 @@ int rmtwrite2(void) { - return (rmtreply("write")); + return (rmtreply("write", 1)); } #endif @@ -266,7 +265,7 @@ rmtseek(int offset, int pos) char line[80]; (void)snprintf(line, sizeof line, "L%d\n%d\n", offset, pos); - return (rmtcall("seek", line)); + return (rmtcall("seek", line, 1)); } @@ -280,7 +279,7 @@ rmtstatus(void) if (rmtstate != TS_OPEN) return (NULL); - rmtcall("status", "S\n"); + rmtcall("status", "S\n", 1); for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++) *cp++ = rmtgetb(); return (&mts); @@ -295,20 +294,20 @@ rmtioctl(int cmd, int count) if (count < 0) return (-1); (void)snprintf(buf, sizeof buf, "I%d\n%d\n", cmd, count); - return (rmtcall("ioctl", buf)); + return (rmtcall("ioctl", buf, 1)); } static int -rmtcall(char *cmd, char *buf) +rmtcall(char *cmd, char *buf, int verbose) { if (write(rmtape, buf, strlen(buf)) != strlen(buf)) rmtconnaborted(0); - return (rmtreply(cmd)); + return (rmtreply(cmd, verbose)); } static int -rmtreply(char *cmd) +rmtreply(char *cmd, int verbose) { char *cp; char code[30], emsg[BUFSIZ]; @@ -316,7 +315,8 @@ rmtreply(char *cmd) rmtgets(code, sizeof (code)); if (*code == 'E' || *code == 'F') { rmtgets(emsg, sizeof (emsg)); - msg("%s: %s", cmd, emsg); + if (verbose) + msg("%s: %s", cmd, emsg); if (*code == 'F') { rmtstate = TS_CLOSED; return (-1); diff --git a/sbin/dump/main.c b/sbin/dump/main.c index 5fb6255ecab4..67b4e281146c 100644 --- a/sbin/dump/main.c +++ b/sbin/dump/main.c @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.40 2001/11/16 04:41:23 lukem Exp $ */ +/* $NetBSD: main.c,v 1.41 2001/12/14 14:43:33 bouyer Exp $ */ /*- * Copyright (c) 1980, 1991, 1993, 1994 @@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 1991, 1993, 1994\n\ #if 0 static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 5/1/95"; #else -__RCSID("$NetBSD: main.c,v 1.40 2001/11/16 04:41:23 lukem Exp $"); +__RCSID("$NetBSD: main.c,v 1.41 2001/12/14 14:43:33 bouyer Exp $"); #endif #endif /* not lint */ @@ -146,7 +146,7 @@ main(int argc, char *argv[]) obsolete(&argc, &argv); while ((ch = getopt(argc, argv, - "0123456789B:b:cd:eFf:h:k:L:nr:s:StT:uWw")) != -1) + "0123456789B:b:cd:eFf:h:k:lL:nr:s:StT:uWw")) != -1) switch (ch) { /* dump level */ case '0': case '1': case '2': case '3': case '4': @@ -193,6 +193,11 @@ main(int argc, char *argv[]) readblksize = numarg("read block size", 0, 64) * 1024; break; + case 'l': /* autoload after eject full tapes */ + eflag = 1; + lflag = 1; + break; + case 'L': /* * Note that although there are LBLSIZE characters, @@ -605,7 +610,7 @@ usage(void) { (void)fprintf(stderr, "%s\n%s\n%s\n%s\n", -"usage: dump [-0123456789ceFntu] [-B records] [-b blocksize] [-d density]", +"usage: dump [-0123456789ceFlntu] [-B records] [-b blocksize] [-d density]", " [-f file] [-h level] [-k read block size] [-L label]", " [-r read cache size] [-s feet] [-T date] file system", " dump [-W | -w]"); diff --git a/sbin/dump/tape.c b/sbin/dump/tape.c index 4d2fcf4d484b..9983f09ddd7a 100644 --- a/sbin/dump/tape.c +++ b/sbin/dump/tape.c @@ -1,4 +1,4 @@ -/* $NetBSD: tape.c,v 1.30 2001/11/01 08:03:03 lukem Exp $ */ +/* $NetBSD: tape.c,v 1.31 2001/12/14 14:43:34 bouyer Exp $ */ /*- * Copyright (c) 1980, 1991, 1993 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)tape.c 8.4 (Berkeley) 5/1/95"; #else -__RCSID("$NetBSD: tape.c,v 1.30 2001/11/01 08:03:03 lukem Exp $"); +__RCSID("$NetBSD: tape.c,v 1.31 2001/12/14 14:43:34 bouyer Exp $"); #endif #endif /* not lint */ @@ -404,8 +404,12 @@ trewind(int eject) #ifdef RDUMP if (host) { rmtclose(); - while (rmtopen(tape, 0) < 0) + while (rmtopen(tape, 0, 0) < 0) sleep(10); + if (eflag && eject) { + msg("Ejecting %s\n", tape); + (void) rmtioctl(MTOFFL, 0); + } rmtclose(); return; } @@ -427,6 +431,8 @@ trewind(int eject) void close_rewind(void) { + int i, f; + trewind(1); (void)do_stats(); if (nexttape) @@ -435,6 +441,23 @@ close_rewind(void) msg("Change Volumes: Mount volume #%d\n", tapeno+1); broadcast("CHANGE DUMP VOLUMES!\7\7\n"); } + if (lflag) { + for (i = 0; i < 12; i++) { /* wait 2 mn */ + if (host) { + if (rmtopen(tape, 0, 0) >= 0) { + rmtclose(); + return; + } + } else { + if ((f = open(tape, 0)) >= 0) { + close(f); + return; + } + } + sleep (10); + } + } + while (!query("Is the new volume mounted and ready to go?")) if (query("Do you want to abort?")) { dumpabort(0); @@ -658,7 +681,7 @@ restore_check_point: msg("Dumping volume %d on %s\n", tapeno, tape); } #ifdef RDUMP - while ((tapefd = (host ? rmtopen(tape, 2) : + while ((tapefd = (host ? rmtopen(tape, 2, 1) : pipeout ? 1 : open(tape, O_WRONLY|O_CREAT, 0666))) < 0) #else while ((tapefd = (pipeout ? 1 :