X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=dump%2Ftape.c;fp=dump%2Ftape.c;h=bab3379782ca445b26caa219d4a244522c6ecc87;hp=e0b54112bb602dbb69ecead4356c96b128471d25;hb=70deb804d2211535f1f188a14e8fc867db9c6625;hpb=e3956dfb7715a21919aa66dd4209a2dc1c3c82da diff --git a/dump/tape.c b/dump/tape.c index e0b5411..bab3379 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -37,7 +37,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.95 2011/06/10 13:07:29 stelian Exp $"; + "$Id: tape.c,v 1.96 2011/06/10 13:41:41 stelian Exp $"; #endif /* not lint */ #include @@ -93,6 +93,8 @@ int write(), read(); #include #include "dump.h" +#include "indexer.h" +#include "slave.h" int writesize; /* size of malloc()ed buffer for tape */ long lastspclrec = -1; /* tape block number of last written header */ @@ -119,24 +121,7 @@ static void enslave __P((void)); static void flushtape __P((void)); static void killall __P((void)); static void rollforward __P((void)); -#ifdef USE_QFA -static int GetTapePos __P((long long *)); -static int MkTapeString __P((struct s_spcl *, long long)); -#define FILESQFAPOS 20 -#endif -/* - * Concurrent dump mods (Caltech) - disk block reading and tape writing - * are exported to several slave processes. While one slave writes the - * tape, the others read disk blocks; they pass control of the tape in - * a ring via signals. The parent process traverses the filesystem and - * sends writeheader()'s and lists of daddr's to the slaves via pipes. - * The following structure defines the instruction packets sent to slaves. - */ -struct req { - ext2_loff_t dblk; - int count; -}; int reqsiz; struct slave_results { @@ -144,19 +129,7 @@ struct slave_results { ssize_t clen; /* compressed length */ }; -#define SLAVES 3 /* 1 slave writing, 1 reading, 1 for slack */ -struct slave { - int tapea; /* header number at start of this chunk */ - int count; /* count to next header (used for TS_TAPE */ - /* after EOT) */ - int inode; /* inode that we are currently dealing with */ - int fd; /* FD for this slave */ - int pid; /* PID for this slave */ - int sent; /* 1 == we've sent this slave requests */ - int firstrec; /* record number of this block */ - char (*tblock)[TP_BSIZE]; /* buffer for data blocks */ - struct req *req; /* buffer for requests */ -} slaves[SLAVES+1]; +struct slave slaves[SLAVES+1]; struct slave *slp; char (*nextblock)[TP_BSIZE]; @@ -176,9 +149,6 @@ static int ready2; /* have we reached the lock point without having */ /* received the SIGUSR2 signal from the prev slave? */ static sigjmp_buf jmpbuf2; /* where to jump to if we are ready when the */ /* SIGUSR2 arrives from the previous slave */ -#ifdef USE_QFA -static int gtperr = 0; -#endif /* * Determine if we can use Linux' clone system call. If so, call it @@ -280,27 +250,7 @@ writerec(const void *dp, int isspcl) *(union u_spcl *)(*(nextblock)) = *(union u_spcl *)dp; /* Need to write it to the archive file */ - if (! AfileActive && isspcl && (spcl.c_type == TS_END)) - AfileActive = 1; - if (AfileActive && Afile >= 0 && !(spcl.c_flags & DR_EXTATTRIBUTES)) { - /* When we dump an inode which is not a directory, - * it means we ended the archive contents */ - if (isspcl && (spcl.c_type == TS_INODE) && - ((spcl.c_dinode.di_mode & S_IFMT) != IFDIR)) - AfileActive = 0; - else { - union u_spcl tmp; - tmp = *(union u_spcl *)dp; - /* Write the record, _uncompressed_ */ - if (isspcl) { - tmp.s_spcl.c_flags &= ~DR_COMPRESSED; - mkchecksum(&tmp); - } - if (write(Afile, &tmp, TP_BSIZE) != TP_BSIZE) - msg("error writing archive file: %s\n", - strerror(errno)); - } - } + indexer->writerec(dp, isspcl); nextblock++; if (isspcl) @@ -1176,12 +1126,7 @@ doslave(int cmd, errcode_t retval; #endif #ifdef USE_QFA - 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; + QFA_State qfa_state; #endif /* USE_QFA */ sigset_t set; @@ -1195,6 +1140,8 @@ doslave(int cmd, transformation->startDiskIOProcess(transformation); #endif /* HAVE_BLOCK_TRANSFORMATION */ + indexer->openQfaState(&qfa_state); + /* * Need our own seek pointer. */ @@ -1333,38 +1280,7 @@ doslave(int cmd, ready2 = 0; caught2 = 0; -#ifdef USE_QFA - if (gTapeposfd >= 0) { - int 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_date == gThisDumpDate) && - !(spclptr->c_dinode.di_mode & S_IFDIR) && - !(spclptr->c_flags & DR_EXTATTRIBUTES) - ) { - foundone = 1; - /* if (cntntrecs >= maxntrecs) { only write every maxntrecs amount of data */ - cntntrecs = 0; - if (gtperr == 0) - gtperr = GetTapePos(&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); - } - /* } */ - } - } - } -#endif /* USE_QFA */ + indexer->updateQfa(&qfa_state); while (eot_count < 10 && size < bufsize) { #ifdef RDUMP @@ -1417,11 +1333,8 @@ doslave(int cmd, * Signal the next slave to go. */ (void) kill(nextslave, SIGUSR2); -#ifdef USE_QFA - if (gTapeposfd >= 0) { - cntntrecs += ntrec; - } -#endif /* USE_QFA */ + + indexer->updateQfaState(&qfa_state); } #ifdef HAVE_BLOCK_TRANSFORMATION @@ -1484,64 +1397,3 @@ SetLogicalPos(void) return err; } */ - -#ifdef USE_QFA -#define LSEEK_GET_TAPEPOS 10 -#define LSEEK_GO2_TAPEPOS 11 -/* - * read the current tape position - */ -int -GetTapePos(long long *pos) -{ - int err = 0; - -#ifdef RDUMP - if (host) { - *pos = (long long) rmtseek((OFF_T)0, (int)LSEEK_GET_TAPEPOS); - err = *pos < 0; - } - else -#endif - { - if (magtapeout) { - long mtpos; - *pos = 0; - err = (ioctl(tapefd, MTIOCPOS, &mtpos) < 0); - *pos = (long long)mtpos; - } - else { - *pos = LSEEK(tapefd, 0, SEEK_CUR); - err = (*pos < 0); - } - } - if (err) { - err = errno; - msg("[%ld] error: %d (getting tapepos: %lld)\n", getpid(), - err, *pos); - return err; - } - return err; -} - -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); -#endif - - snprintf(gTps, sizeof(gTps), "%ld\t%d\t%lld\n", - (unsigned long)spclptr->c_inumber, - tapeno, - curtapepos); - gTps[sizeof(gTps) - 1] = '\0'; - if (write(gTapeposfd, gTps, strlen(gTps)) != (ssize_t)strlen(gTps)) { - err = errno; - warn("error writing tapepos file. (error %d)\n", errno); - } - return err; -} -#endif /* USE_QFA */