X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=dump%2Ftape.c;h=b44f9e04309405f96f0724111d49774eb23f84d5;hp=1990be91bbb952a43c767f985abb3df27ab01775;hb=cae88c2de27ac671cc2fea240fd5952a508cab3c;hpb=aa2fe29bc559dfbf17805267f10f7bf0b112750f diff --git a/dump/tape.c b/dump/tape.c index 1990be9..b44f9e0 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -37,7 +37,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.77 2003/04/18 07:47:57 stelian Exp $"; + "$Id: tape.c,v 1.81 2004/03/01 10:52:53 stelian Exp $"; #endif /* not lint */ #include @@ -60,6 +60,7 @@ int write(), read(); #ifdef __linux__ #include #include +#include /* for definition of BLKFLSBUF */ #include #endif #include @@ -104,12 +105,14 @@ int write(), read(); int writesize; /* size of malloc()ed buffer for tape */ long lastspclrec = -1; /* tape block number of last written header */ int trecno = 0; /* next record to write in current block */ -extern long blocksperfile; /* number of blocks per output file */ +extern long *blocksperfiles; /* number of blocks per output file(s) */ +long blocksperfiles_current; /* current position in blocksperfiles */ long blocksthisvol; /* number of blocks on current output file */ extern int ntrec; /* blocking factor on tape */ extern int cartridge; char *nexttape; extern pid_t rshpid; +int eot_code = 1; long long tapea_bytes = 0; /* bytes_written at start of current volume */ static int magtapeout; /* output is really a tape */ @@ -126,7 +129,8 @@ static void killall __P((void)); static void rollforward __P((void)); #ifdef USE_QFA static int GetTapePos __P((long long *)); -static void MkTapeString __P((struct s_spcl *, long long)); +static int MkTapeString __P((struct s_spcl *, long long)); +#define FILESQFAPOS 20 #endif /* @@ -194,7 +198,7 @@ alloctape(void) * repositioning after stopping, i.e, streaming mode, where the gap is * variable, 0.30" to 0.45". The gap is maximal when the tape stops. */ - if (blocksperfile == 0 && !unlimited) + if (!blocksperfiles && !unlimited) tenths = (cartridge ? 16 : density == 625 ? 5 : 8); else { tenths = 0; @@ -481,9 +485,9 @@ flushtape(void) blockswritten += ntrec; blocksthisvol += ntrec; if (!pipeout && !unlimited) { - if (blocksperfile) { - if ( compressed ? (bytes_written - tapea_bytes + SLAVES * (writesize + sizeof(struct tapebuf))) >= (((long long)blocksperfile) * 1024) - : blocksthisvol >= blocksperfile ) { + if (blocksperfiles && blocksperfiles[blocksperfiles_current]) { + if ( compressed ? (bytes_written - tapea_bytes + SLAVES * (writesize + sizeof(struct tapebuf))) >= (((long long)blocksperfiles[blocksperfiles_current]) * 1024) + : blocksthisvol >= blocksperfiles[blocksperfiles_current] ) { close_rewind(); startnewtape(0); } @@ -868,6 +872,8 @@ restore_check_point: tape[MAXPATHLEN - 1] = '\0'; msg("Dumping volume %d on %s\n", tapeno, tape); } + if (blocksperfiles && blocksperfiles_current < *blocksperfiles) + blocksperfiles_current++; #ifdef RDUMP while ((tapefd = (host ? rmtopen(tape, O_WRONLY|O_CREAT|O_TRUNC) : pipeout ? fileno(stdout) : @@ -1096,6 +1102,9 @@ doslave(int cmd, long long curtapepos; union u_spcl *uspclptr; struct s_spcl *spclptr; + /* long maxntrecs = 300000000 / (ntrec * 1024); last tested: 50 000 000 */ + long maxntrecs = 50000; /* every 50MB */ + long cntntrecs = maxntrecs; #endif /* USE_QFA */ sigset_t set; @@ -1112,7 +1121,7 @@ doslave(int cmd, quit("slave couldn't reopen disk: %s\n", strerror(errno)); #ifdef __linux__ #ifdef BLKFLSBUF - (void)ioctl(diskfd, BLKFLSBUF); + (void)ioctl(diskfd, BLKFLSBUF, 0); #endif ext2fs_close(fs); retval = dump_fs_open(disk, &fs); @@ -1277,23 +1286,30 @@ doslave(int cmd, #ifdef USE_QFA if (gTapeposfd >= 0) { int i; - int firstpass = 1; - for (i = 0; i < ntrec; ++i) { + int foundone = 0; + + for (i = 0; (i < ntrec) && !foundone; ++i) { uspclptr = (union u_spcl *)&slp->tblock[i]; spclptr = &uspclptr->s_spcl; if ((spclptr->c_magic == NFS_MAGIC) && - (spclptr->c_type == TS_INODE) && - ((spclptr->c_dinode.di_mode & S_IFMT) != IFDIR) && - (spclptr->c_date == gThisDumpDate)) { - /* if an error occured previously don't - * try again */ - if (firstpass) { - firstpass = 0; + (spclptr->c_type == TS_INODE) && + (spclptr->c_date == gThisDumpDate) && + !(spclptr->c_dinode.di_mode & S_IFDIR) + ) { + foundone = 1; + /* if (cntntrecs >= maxntrecs) { only write every maxntrecs amount of data */ + cntntrecs = 0; if (gtperr == 0) gtperr = GetTapePos(&curtapepos); - } - if (gtperr == 0) - MkTapeString(spclptr, curtapepos); + /* if an error occured previously don't + * try again */ + if (gtperr == 0) { +#ifdef DEBUG_QFA + msg("inode %ld at tapepos %ld\n", spclptr->c_inumber, curtapepos); +#endif + gtperr = MkTapeString(spclptr, curtapepos); + } + /* } */ } } } @@ -1350,6 +1366,11 @@ doslave(int cmd, * Signal the next slave to go. */ (void) kill(nextslave, SIGUSR2); +#ifdef USE_QFA + if (gTapeposfd >= 0) { + cntntrecs += ntrec; + } +#endif /* USE_QFA */ } if (nread != 0) quit("error reading command pipe: %s\n", strerror(errno)); @@ -1390,7 +1411,27 @@ dump_atomic_write(int fd, const void *buf, size_t count) } +/* +int +SetLogicalPos(void) +{ + int err = 0; + struct mt_pos buf; + + buf.mt_op = MTSETDRVBUFFER; + buf.mt_count = MT_ST_BOOLEANS | MT_ST_SCSI2LOGICAL; + if (ioctl(tapefd, MTIOCTOP, &buf) == -1) { + err = errno; + msg("[%ld] error: %d (setting logical)\n", + (unsigned long)getpid(), err); + } + return err; +} +*/ + #ifdef USE_QFA +#define LSEEK_GET_TAPEPOS 10 +#define LSEEK_GO2_TAPEPOS 11 /* * read the current tape position */ @@ -1401,7 +1442,7 @@ GetTapePos(long long *pos) #ifdef RDUMP if (host) { - *pos = (long long) rmtseek(0, SEEK_CUR); + *pos = (long long) rmtseek((OFF_T)0, (int)LSEEK_GET_TAPEPOS); err = *pos < 0; } else @@ -1427,8 +1468,10 @@ GetTapePos(long long *pos) return err; } -static void -MkTapeString(struct s_spcl *spclptr, long long curtapepos) { +static int +MkTapeString(struct s_spcl *spclptr, long long curtapepos) +{ + int err = 0; #ifdef DEBUG_QFA msg("inode %ld at tapepos %lld\n", spclptr->c_inumber, curtapepos); @@ -1440,7 +1483,9 @@ MkTapeString(struct s_spcl *spclptr, long long curtapepos) { curtapepos); gTps[sizeof(gTps) - 1] = '\0'; if (write(gTapeposfd, gTps, strlen(gTps)) != (ssize_t)strlen(gTps)) { - warn("error writing tapepos file.\n"); + err = errno; + warn("error writing tapepos file. (error %d)\n", errno); } + return err; } #endif /* USE_QFA */