X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fmount.c;h=efb76029d654fc00e9150ee54c23ea5754589972;hb=36b40d5c7f3ff90565ab73ac75f0dc4f6660ff37;hp=b4aa2e26aecb76175b5565b064cab3877ee76be8;hpb=b9d447d0d88fe8b9d6d40f00d3d80a5792c81a91;p=bacula%2Fbacula diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index b4aa2e26ae..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 (retry < 2 && !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); /* @@ -366,7 +374,7 @@ int DCR::check_volume_label(bool &ask, bool &autochanger) VOLUME_CAT_INFO dcrVolCatInfo, devVolCatInfo; char saveVolumeName[MAX_NAME_LENGTH]; - Dmsg1(150, "Vol NAME Error Name=%s\n", VolumeName); + 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; @@ -486,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 */ @@ -495,12 +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, "must_unload release %s\n", dev->print_name()); release_volume(); } + 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 @@ -517,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, "Must load %s\n", dev->print_name()); - if (autoload_device(this, is_writing, NULL) > 0) { - dev->clear_load(); - } - } } @@ -698,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