X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fmount.c;h=efb76029d654fc00e9150ee54c23ea5754589972;hb=36b40d5c7f3ff90565ab73ac75f0dc4f6660ff37;hp=8ae5a0ee3b9a1cf571443ed048d3f37dc977ff47;hpb=ce03ce1beb289542dd6ea45c4750357ba0b07e96;p=bacula%2Fbacula diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index 8ae5a0ee3b..efb76029d6 100644 --- a/bacula/src/stored/mount.c +++ b/bacula/src/stored/mount.c @@ -20,7 +20,7 @@ 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. @@ -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,19 @@ 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*/); + do_unload(); + do_swapping(true /*is_writing*/); + do_load(true /*is_writing*/); - if (!find_a_volume()) { + if (do_find && !find_a_volume()) { goto no_lock_bail_out; } @@ -136,7 +144,7 @@ mount_next_vol: } else { autochanger = false; VolCatInfo.Slot = 0; - ask = true; + ask = retry >= 2; } Dmsg1(150, "autoload_dev returns %d\n", autochanger); /* @@ -146,15 +154,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 +302,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 +374,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 +388,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 +414,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 +432,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 +494,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 */ @@ -484,13 +502,30 @@ bool DCR::is_suitable_volume_mounted() return dir_get_volume_info(this, GET_VOL_INFO_FOR_WRITE); } -void DCR::do_swapping(bool is_writing) +bool DCR::do_unload() { 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(); } + return false; +} + +bool DCR::do_load(bool is_writing) +{ + if (dev->must_load()) { + Dmsg1(100, "Must load %s\n", dev->print_name()); + if (autoload_device(this, is_writing, NULL) > 0) { + dev->clear_load(); + return true; + } + return false; + } + return true; +} + +void DCR::do_swapping(bool is_writing) +{ /* * See if we are asked to swap the Volume from another device * if so, unload the other device here, and attach the @@ -507,17 +542,12 @@ 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()); - if (autoload_device(this, is_writing, NULL) > 0) { - dev->clear_load(); - } - } } @@ -614,7 +644,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 +718,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 +743,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"); }