#include "bacula.h" /* pull in global headers */
#include "stored.h" /* pull in Storage Deamon headers */
-
enum {
try_next_vol = 1,
try_read_vol,
dev->print_name());
init_device_wait_timers(dcr);
- lock_volumes();
/*
* Attempt to mount the next volume. If something non-fatal goes
* wrong, we come back here to re-try (new op messages, re-read
* Volume, ...)
*/
+ lock_volumes();
+
mount_next_vol:
Dmsg1(150, "mount_next_vol retry=%d\n", retry);
/* Ignore retry if this is poll request */
- if (!dev->poll && retry++ > 4) {
+ if (retry++ > 4) {
/* Last ditch effort before giving up, force operator to respond */
VolCatInfo.Slot = 0;
unlock_volumes();
if (dev->must_unload()) {
ask = true; /* ask operator to mount tape */
}
- unlock_volumes();
do_unload();
do_swapping(true /*is_writing*/);
do_load(true /*is_writing*/);
- lock_volumes();
if (!find_a_volume()) {
- goto no_lock_bail_out;
+ goto bail_out;
}
if (job_canceled(jcr)) {
* and move the tape to the end of data.
*
*/
- unlock_volumes();
dcr->setVolCatInfo(false); /* out of date when Vols unlocked */
if (autoload_device(dcr, true/*writing*/, NULL) > 0) {
autochanger = true;
VolCatInfo.Slot = 0;
ask = retry >= 2;
}
- lock_volumes();
Dmsg1(150, "autoload_dev returns %d\n", autochanger);
/*
* If we autochanged to correct Volume or (we have not just
* Check that volcatinfo is good
*/
if (!dev->haveVolCatInfo()) {
- Dmsg0(000, "Do not have volcatinfo\n");
+ Dmsg0(100, "Do not have volcatinfo\n");
if (!find_a_volume()) {
goto mount_next_vol;
}
* This routine is meant to be called once the first pass
* to ensure that we have a candidate volume to mount.
* Otherwise, we ask the sysop to created one.
- * Note, the the Volumes are locked on entry.
- * They are unlocked on failure and remain locked on
- * success. The caller must know this!!!
+ * Note, the the Volumes are locked on entry and exit.
*/
-bool DCR::find_a_volume()
+bool DCR::find_a_volume()
{
DCR *dcr = this;
+
if (!is_suitable_volume_mounted()) {
bool have_vol = false;
/* Do we have a candidate volume? */
while (!dir_find_next_appendable_volume(dcr)) {
Dmsg0(200, "not dir_find_next\n");
if (job_canceled(jcr)) {
- unlock_volumes();
return false;
}
unlock_volumes();
if (!dir_ask_sysop_to_create_appendable_volume(dcr)) {
+ lock_volumes();
return false;
}
lock_volumes();
+ if (job_canceled(jcr)) {
+ return false;
+ }
Dmsg0(150, "Again dir_find_next_append...\n");
}
}
if (dev->is_open()) {
dev->offline_or_rewind();
}
-// Dmsg0(50, "set_unload\n");
-// dev->set_unload();
Dmsg0(190, "release_volume\n");
}