- dcr->VolumeName, dcr->dev->print_name(), dev->print_name(), slot);
- Dmsg2(100, "num_writ=%d reserv=%d\n", dev->num_writers, dev->reserved_device);
- dev->dunlock();
+ 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());
+ volume_unused(dcr);
+ return false;
+ }
+ return unload_dev(dcr, dev);
+}
+
+/*
+ * Unconditionally unload a specified drive
+ */
+bool unload_dev(DCR *dcr, DEVICE *dev)
+{
+ JCR *jcr = dcr->jcr;
+ bool ok = true;
+ uint32_t timeout = dcr->device->max_changer_wait;
+ AUTOCHANGER *changer = dcr->dev->device->changer_res;
+ DEVICE *save_dev;
+ int save_slot;
+
+ if (!changer) {
+ return false;
+ }
+
+ save_dev = dcr->dev; /* save dcr device */
+ dcr->dev = dev; /* temporarily point dcr at other device */
+
+ /* Update slot if not set or not always_open */
+ if (dev->get_slot() <= 0 || !dev->has_cap(CAP_ALWAYSOPEN)) {
+ get_autochanger_loaded_slot(dcr);
+ }
+
+ /* Fail if we have no slot to unload */
+ if (dev->get_slot() <= 0) {
+ dcr->dev = save_dev;