- }
- }
- 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);
+ }
+ }
+ 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();