ssize_t stat;
int looping;
uint32_t BlockNumber;
+ int retry = 0;
looping = 0;
Dmsg1(100, "Full read() in read_block_from_device() len=%d\n",
block->read_len = 0;
return 0;
}
- if ((stat=read(dev->fd, block->buf, (size_t)block->buf_len)) < 0) {
+ do {
+ stat = read(dev->fd, block->buf, (size_t)block->buf_len);
+ } while (stat == -1 && (errno == EINTR || errno == EIO) && retry++ < 6);
+ if (stat < 0) {
Dmsg1(90, "Read device got: ERR=%s\n", strerror(errno));
clrerror_dev(dev, -1);
block->read_len = 0;
printf("End of File on device\n");
break;
}
+ /* Read and discard Volume label */
DEV_RECORD *record;
record = new_record();
read_block_from_device(jcr, dev, block, NO_BLOCK_NUMBER_CHECK);
get_session_record(dev, record, &sessrec);
free_record(record);
printf("Volume %s mounted.\n", jcr->VolumeName);
- continue;
- }
- if (dev->state & ST_EOF) {
+
+ } else if (dev->state & ST_EOF) {
Jmsg(jcr, M_INFO, 0, "Got EOF on device %s\n", dev_name(dev));
Dmsg0(20, "read_record got eof. try again\n");
continue;
- }
- if (dev->state & ST_SHORT) {
+ } else if (dev->state & ST_SHORT) {
Jmsg(jcr, M_INFO, 0, "%s", dev->errmsg);
continue;
+ } else {
+ /* I/O error */
+ display_tape_error_status(jcr, dev);
+ break;
}
- display_tape_error_status(jcr, dev);
- break;
}
Dmsg5(100, "Blk=%u blen=%u bVer=%d SessId=%u SessTim=%u\n",
block->BlockNumber, block->block_len, block->BlockVer,
read_record_from_block(block, record);
get_session_record(dev, record, &sessrec);
free_record(record);
- }
- if (dev->state & ST_EOF) {
+ /* Now, continue to read the records on this volume */
+
+ } else if (dev->state & ST_EOF) {
Dmsg0(90, "Got End of File. Trying again ...\n");
continue; /* End of File */
- }
- if (dev->state & ST_SHORT) {
+ } else if (dev->state & ST_SHORT) {
continue;
+ } else {
+ /* I/O error -- or non-standard end of tape */
+ Dmsg0(000, "I/O error, bailing out.\n");
+ ok = FALSE;
+ break;
}
- /* I/O error -- or non-standard end of tape */
- ok = FALSE;
- break;
}
for (rec->state=0; !is_block_empty(rec); ) {
char *rtype;
memset(sessrec, 0, sizeof(sessrec));
switch (rec->FileIndex) {
- case PRE_LABEL:
- rtype = "Fresh Volume Label";
- break;
- case VOL_LABEL:
- rtype = "Volume Label";
- unser_volume_label(dev, rec);
- break;
- case SOS_LABEL:
- rtype = "Begin Session";
- unser_session_label(sessrec, rec);
- break;
- case EOS_LABEL:
- rtype = "End Session";
- break;
- case EOM_LABEL:
- rtype = "End of Media";
- break;
- default:
- rtype = "Unknown";
- break;
+ case PRE_LABEL:
+ rtype = "Fresh Volume Label";
+ break;
+ case VOL_LABEL:
+ rtype = "Volume Label";
+ unser_volume_label(dev, rec);
+ break;
+ case SOS_LABEL:
+ rtype = "Begin Session";
+ unser_session_label(sessrec, rec);
+ break;
+ case EOS_LABEL:
+ rtype = "End Session";
+ break;
+ case EOM_LABEL:
+ rtype = "End of Media";
+ break;
+ default:
+ rtype = "Unknown";
+ break;
}
Dmsg5(10, "%s Record: VolSessionId=%d VolSessionTime=%d JobId=%d DataLen=%d\n",
rtype, rec->VolSessionId, rec->VolSessionTime, rec->Stream, rec->data_len);
get_session_record(dev, trec, &sessrec);
record_cb(jcr, dev, block, trec);
free_record(trec);
- goto next_record;
- }
- if (dev->state & ST_EOF) {
+ goto next_record; /* go read new tape */
+
+ } else if (dev->state & ST_EOF) {
Jmsg(jcr, M_INFO, 0, "Got EOF on device %s, Volume \"%s\"\n",
dev_name(dev), jcr->VolumeName);
Dmsg0(20, "read_record got eof. try again\n");
continue;
- }
- if (dev->state & ST_SHORT) {
+ } else if (dev->state & ST_SHORT) {
Jmsg(jcr, M_INFO, 0, "%s", dev->errmsg);
continue;
+ } else {
+ /* I/O error or strange end of tape */
+ display_tape_error_status(jcr, dev);
+ ok = FALSE;
+ break;
}
- /* I/O error or strange end of tape */
- display_tape_error_status(jcr, dev);
- ok = FALSE;
- break;
}
if (verbose) {
Dmsg2(10, "Block: %d blen=%d\n", block->BlockNumber, block->block_len);