Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Bacula® is a registered trademark of John Walker.
+ Bacula® is a registered trademark of Kern Sibbald.
The licensor of Bacula is the Free Software Foundation Europe
(FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
Switzerland, email:ftf@fsfeurope.org.
if (dev->get_slot() > 0) {
return dev->get_slot();
}
+
/* Virtual disk autochanger */
if (dcr->device->changer_command[0] == 0) {
return 1;
free_volume(dev); /* Free any volume associated with this drive */
free_pool_memory(changer);
}
- dev->clear_unload();
+ if (ok) {
+ dev->clear_unload();
+ }
return ok;
}
break;
}
if (dev->is_busy()) {
- Jmsg(dcr->jcr, M_WARNING, 0, _("Volume \"%s\" is in use by device %s\n"),
- dcr->VolumeName, dev->print_name());
+ Jmsg(dcr->jcr, M_WARNING, 0, _("Volume \"%s\" wanted on %s is in use by device %s\n"),
+ dcr->VolumeName, dcr->dev->print_name(), dev->print_name());
Dmsg4(100, "Vol %s for dev=%s is busy dev=%s slot=%d\n",
dcr->VolumeName, dcr->dev->print_name(), dev->print_name(), dev->get_slot());
Dmsg2(100, "num_writ=%d reserv=%d\n", dev->num_writers, dev->num_reserved());
return unload_dev(dcr, dev);
}
+/*
+ * Unconditionally unload a specified drive
+ */
bool unload_dev(DCR *dcr, DEVICE *dev)
{
JCR *jcr = dcr->jcr;
DEVICE *save_dev;
int save_slot;
- if (!changer || dev->get_slot() <= 0) {
+ if (!changer) {
return false;
}
+
+ save_dev = dcr->dev; /* save dcr device */
+ dcr->dev = dev; /* temporarily point dcr at other device */
+
+ if (dev->get_slot() <= 0 && get_autochanger_loaded_slot(dcr) <= 0) {
+ dcr->dev = save_dev;
+ return false;
+ }
+ save_slot = dcr->VolCatInfo.Slot;
+ dcr->VolCatInfo.Slot = dev->get_slot();
+
dev->dlock();
POOLMEM *changer_cmd = get_pool_memory(PM_FNAME);
Dmsg2(100, "Issuing autochanger \"unload slot %d, drive %d\" command.\n",
dev->get_slot(), dev->drive_index);
- save_dev = dcr->dev;
- dcr->dev = dev;
- save_slot = dcr->VolCatInfo.Slot;
- dcr->VolCatInfo.Slot = dev->get_slot();
changer_cmd = edit_device_codes(dcr, changer_cmd,
dcr->device->changer_command, "unload");
dev->close();
Dmsg2(100, "Slot %d unloaded %s\n", dev->get_slot(), dev->print_name());
dev->set_slot(0); /* nothing loaded */
}
- dev->clear_unload();
+ if (ok) {
+ dev->clear_unload();
+ }
unlock_changer(dcr);
dev->dunlock();