X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=bacula%2Fsrc%2Fstored%2Fmount.c;h=c7f5eda63a7ae0dca63113acb17af017c86fd955;hb=e62fc0c4690a5729c4e663688458c40c61e73910;hp=8ae5a0ee3b9a1cf571443ed048d3f37dc977ff47;hpb=ce03ce1beb289542dd6ea45c4750357ba0b07e96;p=bacula%2Fbacula diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index 8ae5a0ee3b..c7f5eda63a 100644 --- a/bacula/src/stored/mount.c +++ b/bacula/src/stored/mount.c @@ -69,6 +69,7 @@ bool DCR::mount_next_write_volume() { int retry = 0; bool ask = false, recycle, autochanger; + bool do_find = true; int mode; DCR *dcr = this; @@ -104,12 +105,17 @@ mount_next_vol: } recycle = false; + if (retry >= 2) { + do_find = false; + } + if (dev->must_unload()) { ask = true; /* ask operator to mount tape */ + do_find = true; /* re-find a volume after unload */ } do_swapping(true /*writing*/); - if (!find_a_volume()) { + if (do_find && !find_a_volume()) { goto no_lock_bail_out; } @@ -146,15 +152,15 @@ mount_next_vol: * we will fail, recurse and ask the operator the next time. */ if (!dev->must_unload() && dev->is_tape() && dev->has_cap(CAP_AUTOMOUNT)) { - Dmsg0(150, "(1)Ask=0\n"); + Dmsg0(250, "(1)Ask=0\n"); ask = false; /* don't ask SYSOP this time */ } /* Don't ask if not removable */ if (!dev->is_removable()) { - Dmsg0(150, "(2)Ask=0\n"); + Dmsg0(250, "(2)Ask=0\n"); ask = false; } - Dmsg2(150, "Ask=%d autochanger=%d\n", ask, autochanger); + Dmsg2(250, "Ask=%d autochanger=%d\n", ask, autochanger); if (ask) { unlock_volumes(); @@ -294,6 +300,11 @@ no_lock_bail_out: return false; } +/* + * 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. + */ bool DCR::find_a_volume() { DCR *dcr = this; @@ -361,6 +372,12 @@ int DCR::check_volume_label(bool &ask, bool &autochanger) VOLUME_CAT_INFO dcrVolCatInfo, devVolCatInfo; char saveVolumeName[MAX_NAME_LENGTH]; + Dmsg2(150, "Vol NAME Error Have=%s, want=%s\n", dev->VolHdr.VolumeName, VolumeName); + if (dev->is_volume_to_unload()) { + ask = true; + goto check_next_volume; + } + /* If not removable, Volume is broken */ if (!dev->is_removable()) { Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on device %s.\n"), @@ -369,13 +386,6 @@ int DCR::check_volume_label(bool &ask, bool &autochanger) goto check_next_volume; } - Dmsg1(150, "Vol NAME Error Name=%s\n", VolumeName); - /* If polling and got a previous bad name, ignore it */ - if (dev->poll && strcmp(dev->BadVolName, dev->VolHdr.VolumeName) == 0) { - ask = true; - Dmsg1(200, "Vol Name error supress due to poll. Name=%s\n", VolumeName); - goto check_next_volume; - } /* * OK, we got a different volume mounted. First save the * requested Volume info (dcr) structure, then query if @@ -402,7 +412,7 @@ int DCR::check_volume_label(bool &ask, bool &autochanger) mark_volume_not_inchanger(); } dev->VolCatInfo = devVolCatInfo; /* structure assignment */ - bstrncpy(dev->BadVolName, dev->VolHdr.VolumeName, sizeof(dev->BadVolName)); + dev->set_unload(); /* unload this volume */ Jmsg(jcr, M_WARNING, 0, _("Director wanted Volume \"%s\".\n" " Current Volume \"%s\" not acceptable because:\n" " %s"), @@ -420,6 +430,13 @@ int DCR::check_volume_label(bool &ask, bool &autochanger) */ Dmsg1(150, "Got new Volume name=%s\n", VolumeName); dev->VolCatInfo = VolCatInfo; /* structure assignment */ + Dmsg1(100, "Call reserve_volume=%s\n", dev->VolHdr.VolumeName); + if (reserve_volume(this, dev->VolHdr.VolumeName) == NULL) { + Jmsg2(jcr, M_WARNING, 0, _("Could not reserve volume %s on %s\n"), + dev->VolHdr.VolumeName, dev->print_name()); + ask = true; + goto check_next_volume; + } break; /* got a Volume */ /* * At this point, we assume we have a blank tape mounted. @@ -475,7 +492,6 @@ check_read_volume: bool DCR::is_suitable_volume_mounted() { - /* Volume mounted? */ if (dev->VolHdr.VolumeName[0] == 0 || dev->swap_dev || dev->must_unload()) { return false; /* no */ @@ -487,9 +503,8 @@ bool DCR::is_suitable_volume_mounted() void DCR::do_swapping(bool is_writing) { if (dev->must_unload()) { - Dmsg1(100, "swapping: unloading %s\n", dev->print_name()); + Dmsg1(100, "must_unload release %s\n", dev->print_name()); release_volume(); - dev->clear_unload(); } /* * See if we are asked to swap the Volume from another device @@ -507,13 +522,14 @@ void DCR::do_swapping(bool is_writing) } if (dev->vol) { dev->vol->clear_swapping(); + Dmsg1(100, "=== set in_use vol=%s\n", dev->vol->vol_name); dev->vol->set_in_use(); dev->VolHdr.VolumeName[0] = 0; /* don't yet have right Volume */ } dev->swap_dev = NULL; } if (dev->must_load()) { - Dmsg1(100, "swapping: must load %s\n", dev->print_name()); + Dmsg1(100, "Must load %s\n", dev->print_name()); if (autoload_device(this, is_writing, NULL) > 0) { dev->clear_load(); } @@ -614,7 +630,8 @@ int DCR::try_autolabel(bool opened) /* Create a new Volume label and write it to the device */ if (!write_new_volume_label_to_dev(dcr, VolumeName, pool_name, false, /* no relabel */ false /* defer DVD label */)) { - Dmsg0(150, "!write_vol_label\n"); + Dmsg2(150, "write_vol_label failed. vol=%s, pool=%s\n", + VolumeName, pool_name); if (opened) { mark_volume_in_error(); } @@ -687,7 +704,7 @@ void DCR::release_volume() if (WroteVol) { Jmsg0(jcr, M_ERROR, 0, _("Hey!!!!! WroteVol non-zero !!!!!\n")); - Dmsg0(190, "Hey!!!!! WroteVol non-zero !!!!!\n"); + Pmsg0(190, "Hey!!!!! WroteVol non-zero !!!!!\n"); } /* * First erase all memory of the current volume @@ -712,8 +729,8 @@ void DCR::release_volume() if (dev->is_open()) { dev->offline_or_rewind(); } - Dmsg0(50, "set_unload\n"); - dev->set_unload(); +// Dmsg0(50, "set_unload\n"); +// dev->set_unload(); Dmsg0(190, "release_volume\n"); }