DEV_BLOCK *block = dcr->block;
int mode;
- Dmsg1(150, "Enter mount_next_volume(release=%d)\n", release);
+ Dmsg2(150, "Enter mount_next_volume(release=%d) dev=%s\n", release,
+ dev->print_name());
init_device_wait_timers(dcr);
mode = OPEN_READ_WRITE;
}
while (dev->open(dcr, mode) < 0) {
- Dmsg0(000, "open_device failed\n");
+ Dmsg1(150, "open_device failed: ERR=%s\n", dev->bstrerror());
if (dev->is_file() && dev->is_removable()) {
- Dmsg0(000, "call scan_dir_for_vol\n");
+ Dmsg0(150, "call scan_dir_for_vol\n");
if (dev->scan_dir_for_volume(dcr)) {
break; /* got a valid volume */
}
*/
if (dev->has_cap(CAP_STREAM)) {
vol_label_status = VOL_OK;
- create_volume_label(dev, dcr->VolumeName, "Default");
+ create_volume_label(dev, dcr->VolumeName, "Default", false /* not DVD */);
dev->VolHdr.LabelType = PRE_LABEL;
} else {
vol_label_status = read_dev_volume_label(dcr);
recycle = strcmp(dev->VolCatInfo.VolCatStatus, "Recycle") == 0;
break; /* got a Volume */
case VOL_NAME_ERROR:
- VOLUME_CAT_INFO VolCatInfo, devVolCatInfo;
+ VOLUME_CAT_INFO dcrVolCatInfo, devVolCatInfo;
/* If not removable, Volume is broken */
if (!dev->is_removable()) {
* this volume is really OK. If not, put back the desired
* volume name, mark it not in changer and continue.
*/
- memcpy(&VolCatInfo, &dcr->VolCatInfo, sizeof(VolCatInfo));
+ memcpy(&dcrVolCatInfo, &dcr->VolCatInfo, sizeof(dcrVolCatInfo));
memcpy(&devVolCatInfo, &dev->VolCatInfo, sizeof(devVolCatInfo));
/* Check if this is a valid Volume in the pool */
bstrncpy(dcr->VolumeName, dev->VolHdr.VolumeName, sizeof(dcr->VolumeName));
/* This gets the info regardless of the Pool */
bstrncpy(dcr->VolumeName, dev->VolHdr.VolumeName, sizeof(dcr->VolumeName));
if (autochanger && !dir_get_volume_info(dcr, GET_VOL_INFO_FOR_READ)) {
+ /*
+ * If we get here, we know we cannot write on the Volume,
+ * and we know that we cannot read it either, so it
+ * is not in the autochanger.
+ */
mark_volume_not_inchanger(dcr);
}
memcpy(&dev->VolCatInfo, &devVolCatInfo, sizeof(dev->VolCatInfo));
Jmsg(jcr, M_WARNING, 0, _("Director wanted Volume \"%s\".\n"
" Current Volume \"%s\" not acceptable because:\n"
" %s"),
- VolCatInfo.VolCatName, dev->VolHdr.VolumeName,
+ dcrVolCatInfo.VolCatName, dev->VolHdr.VolumeName,
jcr->dir_bsock->msg);
ask = true;
+ /* Restore saved DCR before continuing */
+ memcpy(&dcr->VolCatInfo, &dcrVolCatInfo, sizeof(dcr->VolCatInfo));
goto mount_next_vol;
}
- /* This was not the volume we expected, but it is OK with
+ /*
+ * This was not the volume we expected, but it is OK with
* the Director, so use it.
*/
Dmsg1(150, "want new name=%s\n", dcr->VolumeName);
Dmsg0(200, "Device previously written, moving to end of data\n");
Jmsg(jcr, M_INFO, 0, _("Volume \"%s\" previously written, moving to end of data.\n"),
dcr->VolumeName);
- if (!dev->eod()) {
+ if (!dev->eod(dcr)) {
Jmsg(jcr, M_ERROR, 0, _("Unable to position to end of data on device %s: ERR=%s\n"),
- dev->print_name(), strerror_dev(dev));
+ dev->print_name(), dev->bstrerror());
mark_volume_in_error(dcr);
goto mount_next_vol;
}
+ if (dev->is_dvd()) {
+ char ed1[50], ed2[50];
+ if (dev->VolCatInfo.VolCatBytes == dev->part_start + dev->part_size) {
+ Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\""
+ " part=%d size=%s\n"), dcr->VolumeName,
+ dev->part, edit_uint64(dev->VolCatInfo.VolCatBytes,ed1));
+ } else {
+ Jmsg(jcr, M_ERROR, 0, _("I cannot write on Volume \"%s\" because: "
+ "The sizes do not match! Volume=%s Catalog=%s\n"),
+ dcr->VolumeName,
+ edit_uint64(dev->part_start + dev->part_size, ed1),
+ edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
+ mark_volume_in_error(dcr);
+ goto mount_next_vol;
+ }
+ }
/* *****FIXME**** we should do some checking for files too */
if (dev->is_tape()) {
/*
* Check if we are positioned on the tape at the same place
* that the database says we should be.
*/
- if (dev->VolCatInfo.VolCatFiles == dev_file(dev)) {
+ if (dev->VolCatInfo.VolCatFiles == dev->get_file()) {
Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\" at file=%d.\n"),
- dcr->VolumeName, dev_file(dev));
+ dcr->VolumeName, dev->get_file());
} else {
Jmsg(jcr, M_ERROR, 0, _("I cannot write on Volume \"%s\" because:\n"
-"The number of files mismatch! Volume=%u Catalog=%u\n"),
- dcr->VolumeName, dev_file(dev), dev->VolCatInfo.VolCatFiles);
+ "The number of files mismatch! Volume=%u Catalog=%u\n"),
+ dcr->VolumeName, dev->get_file(), dev->VolCatInfo.VolCatFiles);
mark_volume_in_error(dcr);
goto mount_next_vol;
}
empty_block(block); /* we used it for reading so set for write */
}
dev->set_append();
- Dmsg0(150, "set APPEND, normal return from read_dev_for_append\n");
+ Dmsg1(150, "set APPEND, normal return from mount_next_write_volume. dev=%s\n",
+ dev->print_name());
+
return true;
}
Dmsg0(150, "Create volume label\n");
/* Create a new Volume label and write it to the device */
if (!write_new_volume_label_to_dev(dcr, dcr->VolumeName,
- dcr->pool_name)) {
+ dcr->pool_name, false, /* no relabel */ false /* defer DVD label */)) {
Dmsg0(150, "!write_vol_label\n");
mark_volume_in_error(dcr);
return try_next_vol;