X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Facquire.c;h=2aba36809223d54a9cf23ea2b29688d2f05d3eec;hb=36b40d5c7f3ff90565ab73ac75f0dc4f6660ff37;hp=47a2a75eb8cc270fd0c4f2d437fb527610faa7ed;hpb=217e5ed47147cd420ed0799a96868a561bfd6b57;p=bacula%2Fbacula diff --git a/bacula/src/stored/acquire.c b/bacula/src/stored/acquire.c index 47a2a75eb8..2aba368092 100644 --- a/bacula/src/stored/acquire.c +++ b/bacula/src/stored/acquire.c @@ -38,6 +38,7 @@ /* Forward referenced functions */ static void attach_dcr_to_dev(DCR *dcr); +static void set_dcr_from_vol(DCR *dcr, VOL_LIST *vol); /********************************************************************* @@ -88,15 +89,9 @@ bool acquire_device_for_read(DCR *dcr) jcr->NumReadVolumes, jcr->CurReadVolume); goto get_out; /* should not happen */ } - /* - * Note, if we want to be able to work from a .bsr file only - * for disaster recovery, we must "simulate" reading the catalog - */ - bstrncpy(dcr->VolumeName, vol->VolumeName, sizeof(dcr->VolumeName)); - bstrncpy(dcr->VolCatInfo.VolCatName, vol->VolumeName, sizeof(dcr->VolCatInfo.VolCatName)); - bstrncpy(dcr->media_type, vol->MediaType, sizeof(dcr->media_type)); - dcr->VolCatInfo.Slot = vol->Slot; - dcr->VolCatInfo.InChanger = vol->Slot > 0; + set_dcr_from_vol(dcr, vol); + + Dmsg2(100, "Want Vol=%s Slot=%d\n", vol->VolumeName, vol->Slot); /* * If the MediaType requested for this volume is not the @@ -174,20 +169,12 @@ bool acquire_device_for_read(DCR *dcr) dev->clear_unload(); - if (reserve_volume(dcr, dcr->VolumeName) == NULL) { - Dmsg2(100, "Could not reserve volume %s on %s\n", dcr->VolumeName, - dcr->dev->print_name()); - Jmsg2(jcr, M_FATAL, 0, _("Could not reserve volume %s on %s\n"), dcr->VolumeName, - dcr->dev->print_name()); - goto get_out; - } if (dev->vol && dev->vol->is_swapping()) { dev->vol->set_slot(vol->Slot); Dmsg3(100, "swapping: slot=%d Vol=%s dev=%s\n", dev->vol->get_slot(), dev->vol->vol_name, dev->print_name()); } - init_device_wait_timers(dcr); tape_previously_mounted = dev->can_read() || dev->can_append() || @@ -217,7 +204,10 @@ bool acquire_device_for_read(DCR *dcr) goto get_out; /* error return */ } - dcr->do_swapping(false/*is_writing*/); + dcr->do_unload(); + dcr->do_swapping(false/*!is_writing*/); + dcr->do_load(false /*!is_writing*/); + set_dcr_from_vol(dcr, vol); /* refresh dcr with desired volume info */ /* * This code ensures that the device is ready for @@ -239,10 +229,12 @@ bool acquire_device_for_read(DCR *dcr) vol_label_status = read_dev_volume_label(dcr); switch (vol_label_status) { case VOL_OK: + Dmsg0(50, "Got correct volume.\n"); ok = true; dev->VolCatInfo = dcr->VolCatInfo; /* structure assignment */ break; /* got it */ case VOL_IO_ERROR: + Dmsg0(50, "IO Error\n"); /* * Send error message generated by read_dev_volume_label() * only we really had a tape mounted. This supresses superfluous @@ -253,24 +245,21 @@ bool acquire_device_for_read(DCR *dcr) } goto default_path; case VOL_NAME_ERROR: + Dmsg0(50, "Vol name error.\n"); if (dev->is_volume_to_unload()) { goto default_path; } -// if (tape_initially_mounted) { - tape_initially_mounted = false; -// goto default_path; -// } dev->set_unload(); /* force unload of unwanted tape */ if (!unload_autochanger(dcr, -1)) { /* at least free the device so we can re-open with correct volume */ dev->close(); } dev->set_load(); - ASSERT(0); /* Fall through */ default: Jmsg1(jcr, M_WARNING, 0, "%s", jcr->errmsg); default_path: + Dmsg0(50, "default path\n"); tape_previously_mounted = true; /* @@ -290,15 +279,6 @@ default_path: try_autochanger = false; continue; /* try reading volume mounted */ } - /* Try closing and re-opening */ - dev->close(); - if (dev->open(dcr, OPEN_READ_ONLY) >= 0) { - continue; - } - if (!dev->poll) { - Jmsg3(jcr, M_WARNING, 0, _("Read open device %s Volume \"%s\" failed: ERR=%s\n"), - dev->print_name(), dcr->VolumeName, dev->bstrerror()); - } } /* Mount a specific volume and no other */ @@ -306,7 +286,7 @@ default_path: if (!dir_ask_sysop_to_mount_volume(dcr, ST_READ)) { goto get_out; /* error return */ } - try_autochanger = true; /* permit using autochanger again */ + try_autochanger = true; /* permit trying the autochanger again */ continue; /* try reading again */ } /* end switch */ break; @@ -650,7 +630,7 @@ static void attach_dcr_to_dev(DCR *dcr) JCR *jcr = dcr->jcr; if (jcr) Dmsg1(500, "JobId=%u enter attach_dcr_to_dev\n", (uint32_t)jcr->JobId); - if (!dcr->attached_to_dev && dev->initiated && jcr && jcr->JobType != JT_SYSTEM) { + if (!dcr->attached_to_dev && dev->initiated && jcr && jcr->get_JobType() != JT_SYSTEM) { dev->attached_dcrs->append(dcr); /* attach dcr to device */ dcr->attached_to_dev = true; Dmsg1(500, "JobId=%u attach_dcr_to_dev\n", (uint32_t)jcr->JobId); @@ -694,3 +674,16 @@ void free_dcr(DCR *dcr) } free(dcr); } + +static void set_dcr_from_vol(DCR *dcr, VOL_LIST *vol) +{ + /* + * Note, if we want to be able to work from a .bsr file only + * for disaster recovery, we must "simulate" reading the catalog + */ + bstrncpy(dcr->VolumeName, vol->VolumeName, sizeof(dcr->VolumeName)); + bstrncpy(dcr->VolCatInfo.VolCatName, vol->VolumeName, sizeof(dcr->VolCatInfo.VolCatName)); + bstrncpy(dcr->media_type, vol->MediaType, sizeof(dcr->media_type)); + dcr->VolCatInfo.Slot = vol->Slot; + dcr->VolCatInfo.InChanger = vol->Slot > 0; +}