recycle = ask = autochanger = 0;
if (release) {
Dmsg0(100, "mount_next_volume release=1\n");
- /*
- * First erase all memory of the current volume
- */
- dev->block_num = dev->file = 0;
- dev->EndBlock = dev->EndFile = 0;
- memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
- memset(&jcr->VolCatInfo, 0, sizeof(jcr->VolCatInfo));
- memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
- dev->state &= ~ST_LABEL; /* label not yet read */
- jcr->VolumeName[0] = 0;
-
- if (!dev_is_tape(dev) || !dev_cap(dev, CAP_ALWAYSOPEN)) {
- if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
- offline_dev(dev);
- /*
- * Note, this rewind probably should not be here (it wasn't
- * in prior versions of Bacula), but on FreeBSD, this is
- * needed in the case the tape was "frozen" due to an error
- * such as backspacing after writing and EOF. If it is not
- * done, all future references to the drive get and I/O error.
- */
- } else if (!rewind_dev(dev)) {
- Jmsg2(jcr, M_WARNING, 0, _("Rewind error on device %s. ERR=%s\n"),
- dev_name(dev), strerror_dev(dev));
- }
- close_dev(dev);
- }
-
- /* If we have not closed the device, then at least rewind the tape */
- if (dev->state & ST_OPENED) {
- if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
- offline_dev(dev);
- } else if (!rewind_dev(dev)) {
- Jmsg2(jcr, M_WARNING, 0, _("Rewind error on device %s. ERR=%s\n"),
- dev_name(dev), strerror_dev(dev));
- }
- }
+ release_volume(jcr, dev);
ask = 1; /* ask operator to mount tape */
}
dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
- jcr->VolFirstIndex = jcr->JobFiles; /* first update of Vol FileIndex */
for ( ;; ) {
int vol_label_status;
autochanger = autoload_device(jcr, dev, 1, NULL);
release = 1; /* release next time if we "recurse" */
+ask_again:
if (ask && !dir_ask_sysop_to_mount_next_volume(jcr, dev)) {
Dmsg0(100, "Error return ask_sysop ...\n");
return 0; /* error return */
memcpy(&VolCatInfo, &jcr->VolCatInfo, sizeof(jcr->VolCatInfo));
/* Check if this is a valid Volume in the pool */
pm_strcpy(&jcr->VolumeName, dev->VolHdr.VolName);
- if (!dir_get_volume_info(jcr, 1)) {
+ if (!dir_get_volume_info(jcr, GET_VOL_INFO_FOR_WRITE)) {
Mmsg(&jcr->errmsg, _("Director wanted Volume \"%s\".\n"
" Current Volume \"%s\" not acceptable because:\n"
" %s"),
mount_error:
/* Send error message */
Jmsg1(jcr, M_WARNING, 0, "%s", jcr->errmsg);
- if (autochanger) {
- invalidate_slot_in_catalog(jcr);
- }
Dmsg0(100, "Default\n");
- goto mount_next_vol;
+ ask = 1;
+ goto ask_again;
}
break;
}
dev->VolCatInfo.VolCatFiles = 0;
dev->VolCatInfo.VolCatErrors = 0;
dev->VolCatInfo.VolCatBlocks = 0;
+ dev->VolCatInfo.VolCatRBytes = 0;
if (recycle) {
dev->VolCatInfo.VolCatMounts++;
dev->VolCatInfo.VolCatRecycles++;
dev_file(dev));
} else {
Jmsg(jcr, M_ERROR, 0, _("I canot write on this volume because:\n\
-The number of files mismatch! Volume=%d Catalog=%d\n"),
+The number of files mismatch! Volume=%u Catalog=%u\n"),
dev_file(dev), dev->VolCatInfo.VolCatFiles);
strcpy(dev->VolCatInfo.VolCatStatus, "Error");
Dmsg0(200, "dir_update_vol_info. Set Error.\n");
close_dev(dev);
dev->state &= ~ST_READ;
if (!acquire_device_for_read(jcr, dev, block)) {
- Emsg2(M_FATAL, 0, "Cannot open Dev=%s, Vol=%s\n", dev_name(dev),
+ Jmsg2(jcr, M_FATAL, 0, "Cannot open Dev=%s, Vol=%s\n", dev_name(dev),
jcr->VolumeName);
return 0;
}
Dmsg0(90, "End of Device reached.\n");
return 0;
}
+
+/*
+ * Either because we are going to hang a new volume, or because
+ * of explicit user request, we release the current volume.
+ */
+void release_volume(JCR *jcr, DEVICE *dev)
+{
+
+ if (jcr->WroteVol) {
+ Jmsg0(jcr, M_ERROR, 0, "Hey!!!!! WroteVol non-zero !!!!!\n");
+ }
+ /*
+ * First erase all memory of the current volume
+ */
+ dev->block_num = dev->file = 0;
+ dev->EndBlock = dev->EndFile = 0;
+ memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
+ memset(&jcr->VolCatInfo, 0, sizeof(jcr->VolCatInfo));
+ memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
+ dev->state &= ~ST_LABEL; /* label not yet read */
+ jcr->VolumeName[0] = 0;
+
+ if (!dev_is_tape(dev) || !dev_cap(dev, CAP_ALWAYSOPEN)) {
+ offline_or_rewind_dev(dev);
+ close_dev(dev);
+ }
+
+ /* If we have not closed the device, then at least rewind the tape */
+ if (dev->state & ST_OPENED) {
+ offline_or_rewind_dev(dev);
+ }
+}