- rec->remainder = 0;
- break; /* yes, get out */
- }
-
- /* Some sort of label? */
- if (rec->FileIndex < 0) {
- get_session_record(dev, rec, &sessrec);
- record_cb(jcr, dev, block, rec);
- continue;
- } /* end if label record */
-
- /*
- * Apply BSR filter
- */
- if (jcr->bsr && !match_bsr(jcr->bsr, rec, &dev->VolHdr, &sessrec)) {
- if (verbose) {
- Dmsg5(10, "BSR no match rec=%d block=%d SessId=%d SessTime=%d FI=%d\n",
- record, block->BlockNumber, rec->VolSessionId, rec->VolSessionTime,
- rec->FileIndex);
- }
- rec->remainder = 0;
- continue; /* we don't want record, read next one */
- }
- if (is_partial_record(rec)) {
- Dmsg6(10, "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 */
- }
- record_cb(jcr, dev, block, rec);
+ break; /* yes, get out */
+ }
+
+ /* 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(dbglvl, "Remove EOS rec. SI=%d ST=%d\n", rec->VolSessionId,
+ rec->VolSessionTime);
+ recs->remove(rec);
+ free_record(rec);
+ }
+ continue;
+ } /* end if label record */
+
+ /*
+ * Apply BSR filter
+ */
+ if (jcr->bsr) {
+ 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(dbglvl, "All done=(file:block) %u:%u\n", dev->file, dev->block_num);
+ break;
+ } 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;
+ if (try_repositioning(jcr, rec, dcr)) {
+ break;
+ }
+ continue; /* we don't want record, read next one */
+ }
+ }
+ dcr->VolLastIndex = rec->FileIndex; /* let caller know where we are */
+ if (is_partial_record(rec)) {
+ 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 turned on.
+ */
+ if (crypto_digest_stream_type(rec->Stream) != CRYPTO_DIGEST_NONE) {
+ Dmsg3(dbglvl, "Have digest FI=%u before bsr check pos %u:%u\n", rec->FileIndex,
+ dev->file, dev->block_num);
+ if (is_this_bsr_done(jcr->bsr, rec) && try_repositioning(jcr, rec, dcr)) {
+ Dmsg2(dbglvl, "This bsr done, break pos %u:%u\n",
+ dev->file, dev->block_num);
+ break;
+ }
+ Dmsg2(900, "After is_bsr_done pos %u:%u\n", dev->file, dev->block_num);
+ }
+ } /* end for loop over records */
+ Dmsg2(dbglvl, "After end recs in block. pos=%u:%u\n", dev->file, dev->block_num);
+ } /* end for loop over blocks */
+// 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()) {
+ rec = (DEV_RECORD *)recs->first();
+ recs->remove(rec);
+ free_record(rec);
+ }
+ delete recs;
+ print_block_read_errors(jcr, block);
+ return ok;
+}
+
+/*
+ * See if we can reposition.
+ * Returns: true if at end of volume
+ * false otherwise
+ */
+static bool try_repositioning(JCR *jcr, DEV_RECORD *rec, DCR *dcr)
+{
+ BSR *bsr;
+ DEVICE *dev = dcr->dev;
+
+ bsr = find_next_bsr(jcr->bsr, dev);
+ if (bsr == NULL && jcr->bsr->mount_next_volume) {
+ 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()) {
+ /* Set EOT flag to force mount of next Volume */
+ jcr->mount_next_volume = true;
+ dev->set_eot();