/*
Bacula® - The Network Backup Solution
- Copyright (C) 2001-2007 Free Software Foundation Europe e.V.
+ Copyright (C) 2001-2008 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
dev->dev_errno = EIO;
Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer discarded.\n"),
dev->file, dev->block_num, BLKHDR2_ID, Id);
+ Dmsg1(50, "%s", dev->errmsg);
if (block->read_errors == 0 || verbose >= 2) {
Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
}
if (dcr->NewVol) {
/* Note, setting a new volume also handles any pending new file */
set_new_volume_parameters(dcr);
- dcr->NewFile = false; /* this handled for new file too */
} else {
set_new_file_parameters(dcr);
}
dev->VolCatInfo.VolCatName,
dev->file, dev->block_num, dev->print_name(), wlen, stat);
}
- Dmsg7(100, "=== Write error. fd=%d size=%u rtn=%d dev_blk=%d blk_blk=%d errno=%d: ERR=%s\n",
- dev->fd(), wlen, stat, dev->block_num, block->BlockNumber,
- dev->dev_errno, strerror(dev->dev_errno));
+ if (debug_level >= 100) {
+ berrno be;
+ Dmsg7(100, "=== Write error. fd=%d size=%u rtn=%d dev_blk=%d blk_blk=%d errno=%d: ERR=%s\n",
+ dev->fd(), wlen, stat, dev->block_num, block->BlockNumber,
+ dev->dev_errno, be.bstrerror(dev->dev_errno));
+ }
ok = terminate_writing_volume(dcr);
if (!ok && !forge_on) {
dev->block_num = dcr->EndBlock;
dev->file = dcr->EndFile;
}
+ dcr->VolMediaId = dev->VolCatInfo.VolMediaId;
if (dcr->VolFirstIndex == 0 && block->FirstIndex > 0) {
dcr->VolFirstIndex = block->FirstIndex;
}
#endif
}
+/*
+ * If this routine is called, we do our bookkeeping and
+ * then assure that the volume will not be written any
+ * more.
+ */
static bool terminate_writing_volume(DCR *dcr)
{
DEVICE *dev = dcr->dev;
dev->VolCatInfo.VolCatParts = dev->num_dvd_parts;
}
- if (!dir_update_volume_info(dcr, false)) {
+ if (!dir_update_volume_info(dcr, false, true)) {
ok = false;
}
Dmsg1(100, "dir_update_volume_info terminate writing -- %s\n", ok?"OK":"ERROR");
/* This may not be fatal since we already wrote an EOF */
Jmsg(dcr->jcr, M_ERROR, 0, "%s", dev->errmsg);
}
+
bail_out:
dev->set_ateot(); /* no more writing this tape */
- Dmsg1(100, "Leave terminate_writing_volume -- %s\n", ok?"OK":"ERROR");
+ Dmsg1(50, "*** Leave terminate_writing_volume -- %s\n", ok?"OK":"ERROR");
return ok;
}
return false;
}
dev->VolCatInfo.VolCatFiles = dev->file;
- if (!dir_update_volume_info(dcr, false)) {
+ if (!dir_update_volume_info(dcr, false, false)) {
Dmsg0(190, "Error from update_vol_info.\n");
terminate_writing_volume(dcr);
dev->dev_errno = EIO;
dev->VolCatInfo.VolCatParts = dev->num_dvd_parts;
- if (!dir_update_volume_info(dcr, false)) {
+ if (!dir_update_volume_info(dcr, false, false)) {
Dmsg0(190, "Error from update_vol_info.\n");
dev->dev_errno = EIO;
return false;
dev->set_ateof();
return false; /* return eof */
}
+
/* Continue here for successful read */
+
block->read_len = stat; /* save length read */
+ if (block->read_len == 80 &&
+ (dcr->VolCatInfo.LabelType != B_BACULA_LABEL ||
+ dcr->device->label_type != B_BACULA_LABEL)) {
+ /* ***FIXME*** should check label */
+ Dmsg2(100, "Ignore 80 byte ANSI label at %u:%u\n", dev->file, dev->block_num);
+ dev->clear_eof();
+ goto reread; /* skip ANSI/IBM label */
+ }
+
if (block->read_len < BLKHDR2_LENGTH) {
dev->dev_errno = EIO;
Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Very short block of %d bytes on device %s discarded.\n"),
dev->block_num = dcr->EndBlock;
dev->file = dcr->EndFile;
}
+ dcr->VolMediaId = dev->VolCatInfo.VolMediaId;
dev->file_addr += block->read_len;
dev->file_size += block->read_len;