* Version $Id$
*/
/*
- Copyright (C) 2000-2005 Kern Sibbald
+ Copyright (C) 2000-2006 Kern Sibbald
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
static char *rec_state_to_str(DEV_RECORD *rec);
#endif
+static const int dbglvl = 1000;
+
bool read_records(DCR *dcr,
bool record_cb(DCR *dcr, DEV_RECORD *rec),
bool mount_cb(DCR *dcr))
break;
}
jcr->mount_next_volume = false;
+ /*
+ * The Device can change at the end of a tape, so refresh it
+ * from the dcr.
+ */
+ dev = dcr->dev;
/*
* We just have a new tape up, now read the label (first record)
* and pass it off to the callback routine, then continue
} else if (dev->at_eof()) {
if (verbose) {
- Jmsg(jcr, M_INFO, 0, _("Got EOF at file %u on device %s, Volume \"%s\"\n"),
- dev->file, dev->print_name(), dcr->VolumeName);
+ char dvdpart[100];
+ if (dev->is_dvd()) {
+ bsnprintf(dvdpart, sizeof(dvdpart), _("part %d "), dev->part);
+ } else {
+ dvdpart[0] = 0;
+ }
+ Jmsg(jcr, M_INFO, 0, _("End of file %u %son device %s, Volume \"%s\"\n"),
+ dev->file, dvdpart, dev->print_name(), dcr->VolumeName);
}
- Dmsg3(200, "Got EOF at file %u on device %s, Volume \"%s\"\n",
+ Dmsg3(200, "End of file %u on device %s, Volume \"%s\"\n",
dev->file, dev->print_name(), dcr->VolumeName);
continue;
} else if (dev->is_short_block()) {
break;
}
}
- Dmsg2(300, "New block at position=(file:block) %u:%u\n", dev->file, dev->block_num);
+ Dmsg2(dbglvl, "Read new block at pos=%u:%u\n", dev->file, dev->block_num);
#ifdef if_and_when_FAST_BLOCK_REJECTION_is_working
/* this does not stop when file/block are too big */
if (!match_bsr_block(jcr->bsr, block)) {
if (!found) {
rec = new_record();
recs->prepend(rec);
- Dmsg2(300, "New record for SI=%d ST=%d\n",
+ Dmsg3(dbglvl, "New record for state=%s SI=%d ST=%d\n",
+ rec_state_to_str(rec),
block->VolSessionId, block->VolSessionTime);
}
- Dmsg3(300, "After mount next vol. stat=%s blk=%d rem=%d\n", rec_state_to_str(rec),
+ Dmsg3(dbglvl, "Before read rec loop. stat=%s blk=%d rem=%d\n", rec_state_to_str(rec),
block->BlockNumber, rec->remainder);
record = 0;
rec->state = 0;
- Dmsg1(300, "Block empty %d\n", is_block_empty(rec));
+ Dmsg1(dbglvl, "Block %s empty\n", is_block_empty(rec)?"is":"NOT");
for (rec->state=0; ok && !is_block_empty(rec); ) {
if (!read_record_from_block(block, rec)) {
Dmsg3(400, "!read-break. state=%s blk=%d rem=%d\n", rec_state_to_str(rec),
block->BlockNumber, rec->remainder);
break;
}
- Dmsg5(300, "read-OK. state=%s blk=%d rem=%d file:block=%u:%u\n",
+ Dmsg5(dbglvl, "read-OK. state=%s blk=%d rem=%d file:block=%u:%u\n",
rec_state_to_str(rec), block->BlockNumber, rec->remainder,
dev->file, dev->block_num);
/*
* get all the data.
*/
record++;
- Dmsg6(300, "recno=%d state=%s blk=%d SI=%d ST=%d FI=%d\n", record,
+ Dmsg6(dbglvl, "recno=%d state=%s blk=%d SI=%d ST=%d FI=%d\n", record,
rec_state_to_str(rec), block->BlockNumber,
rec->VolSessionId, rec->VolSessionTime, rec->FileIndex);
/* Some sort of label? */
if (rec->FileIndex < 0) {
handle_session_record(dev, rec, &sessrec);
+ if (jcr->bsr) {
+ /* We just check block FI and FT not FileIndex */
+ rec->match_stat = match_bsr_block(jcr->bsr, block);
+ } else {
+ rec->match_stat = 0;
+ }
+ /*
+ * Note, we pass *all* labels to the callback routine. If
+ * he wants to know if they matched the bsr, then he must
+ * check the match_stat in the record */
ok = record_cb(dcr, rec);
+ /*
+ * If this is the end of the Session (EOS) for this record
+ * we can remove the record. Note, there is a separate
+ * record to read each session. If a new session is seen
+ * a new record will be created at approx line 157 above.
+ */
if (rec->FileIndex == EOS_LABEL) {
- Dmsg2(300, "Remove rec. SI=%d ST=%d\n", rec->VolSessionId,
+ Dmsg2(dbglvl, "Remove EOS rec. SI=%d ST=%d\n", rec->VolSessionId,
rec->VolSessionTime);
recs->remove(rec);
free_record(rec);
* Apply BSR filter
*/
if (jcr->bsr) {
- int stat = match_bsr(jcr->bsr, rec, &dev->VolHdr, &sessrec);
- if (stat == -1) { /* no more possible matches */
+ rec->match_stat = match_bsr(jcr->bsr, rec, &dev->VolHdr, &sessrec);
+ if (rec->match_stat == -1) { /* no more possible matches */
done = true; /* all items found, stop */
- Dmsg2(300, "All done=(file:block) %u:%u\n", dev->file, dev->block_num);
+ Dmsg2(dbglvl, "All done=(file:block) %u:%u\n", dev->file, dev->block_num);
break;
- } else if (stat == 0) { /* no match */
- Dmsg4(300, "Clear rem=%d FI=%d before set_eof pos %u:%u\n",
+ } else if (rec->match_stat == 0) { /* no match */
+ Dmsg4(dbglvl, "BSR no match: clear rem=%d FI=%d before set_eof pos %u:%u\n",
rec->remainder, rec->FileIndex, dev->file, dev->block_num);
rec->remainder = 0;
rec->state &= ~REC_PARTIAL_RECORD;
}
dcr->VolLastIndex = rec->FileIndex; /* let caller know where we are */
if (is_partial_record(rec)) {
- Dmsg6(300, "Partial, break. recno=%d state=%s blk=%d SI=%d ST=%d FI=%d\n", record,
+ Dmsg6(dbglvl, "Partial, break. recno=%d state=%s blk=%d SI=%d ST=%d FI=%d\n", record,
rec_state_to_str(rec), block->BlockNumber,
rec->VolSessionId, rec->VolSessionTime, rec->FileIndex);
break; /* read second part of record */
}
+ Dmsg6(dbglvl, "OK callback. recno=%d state=%s blk=%d SI=%d ST=%d FI=%d\n", record,
+ rec_state_to_str(rec), block->BlockNumber,
+ rec->VolSessionId, rec->VolSessionTime, rec->FileIndex);
ok = record_cb(dcr, rec);
+ /*
+ * If we have a digest stream, we check to see if we have
+ * finished the current bsr, and if so, repositioning will
+ * be truned on.
+ */
if (crypto_digest_stream_type(rec->Stream) != CRYPTO_DIGEST_NONE) {
- Dmsg3(300, "Done FI=%u before set_eof pos %u:%u\n", rec->FileIndex,
+ Dmsg3(dbglvl, "Have digest FI=%u before bsr check pos %u:%u\n", rec->FileIndex,
dev->file, dev->block_num);
- if (match_set_eof(jcr->bsr, rec) && try_repositioning(jcr, rec, dev)) {
- Dmsg2(300, "Break after match_set_eof pos %u:%u\n",
+ if (is_this_bsr_done(jcr->bsr, rec) && try_repositioning(jcr, rec, dev)) {
+ Dmsg2(dbglvl, "This bsr done, break pos %u:%u\n",
dev->file, dev->block_num);
break;
}
- Dmsg2(300, "After set_eof pos %u:%u\n", dev->file, dev->block_num);
+ Dmsg2(900, "After is_bsr_done pos %u:%u\n", dev->file, dev->block_num);
}
} /* end for loop over records */
- Dmsg2(300, "After end records position=(file:block) %u:%u\n", dev->file, dev->block_num);
+ Dmsg2(dbglvl, "After end recs in block. pos=%u:%u\n", dev->file, dev->block_num);
} /* end for loop over blocks */
-// Dmsg2(300, "Position=(file:block) %u:%u\n", dev->file, dev->block_num);
+// Dmsg2(dbglvl, "Position=(file:block) %u:%u\n", dev->file, dev->block_num);
/* Walk down list and free all remaining allocated recs */
while (!recs->empty()) {
BSR *bsr;
bsr = find_next_bsr(jcr->bsr, dev);
if (bsr == NULL && jcr->bsr->mount_next_volume) {
- Dmsg0(300, "Would mount next volume here\n");
- Dmsg2(300, "Current postion (file:block) %u:%u\n",
+ Dmsg0(dbglvl, "Would mount next volume here\n");
+ Dmsg2(dbglvl, "Current postion (file:block) %u:%u\n",
dev->file, dev->block_num);
jcr->bsr->mount_next_volume = false;
if (!dev->at_eot()) {
dev->file, dev->block_num, bsr->volfile->sfile,
bsr->volblock->sblock);
}
- Dmsg4(300, "Try_Reposition from (file:block) %u:%u to %u:%u\n",
+ Dmsg4(dbglvl, "Try_Reposition from (file:block) %u:%u to %u:%u\n",
dev->file, dev->block_num, bsr->volfile->sfile,
bsr->volblock->sblock);
- reposition_dev(dev, bsr->volfile->sfile, bsr->volblock->sblock);
+ dev->reposition(bsr->volfile->sfile, bsr->volblock->sblock);
rec->Block = 0;
}
return false;
if (bsr && (bsr->volfile->sfile != 0 || bsr->volblock->sblock != 0)) {
Jmsg(jcr, M_INFO, 0, _("Forward spacing to file:block %u:%u.\n"),
bsr->volfile->sfile, bsr->volblock->sblock);
- Dmsg2(300, "Forward spacing to file:block %u:%u.\n",
+ Dmsg2(dbglvl, "Forward spacing to file:block %u:%u.\n",
bsr->volfile->sfile, bsr->volblock->sblock);
- reposition_dev(dev, bsr->volfile->sfile, bsr->volblock->sblock);
+ dev->reposition(bsr->volfile->sfile, bsr->volblock->sblock);
}
}
return bsr;
rtype = buf;
break;
}
- Dmsg5(300, _("%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n"),
+ Dmsg5(dbglvl, _("%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n"),
rtype, rec->VolSessionId, rec->VolSessionTime, rec->Stream, rec->data_len);
}