]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/acquire.c
17Mar06
[bacula/bacula] / bacula / src / stored / acquire.c
index 4d32968cfc13a05e5d2ea2f6a69d478404b9bca0..34b28609862e99a480acad067d92bee711086fbf 100644 (file)
@@ -47,7 +47,9 @@ bool acquire_device_for_read(DCR *dcr)
    bool try_autochanger = true;
    int i;
    int vol_label_status;
+   int retry = 0;
    
+   Dmsg1(50, "jcr->dcr=%p\n", jcr->dcr);
    dev->block(BST_DOING_ACQUIRE);
 
    if (dev->num_writers > 0) {
@@ -84,6 +86,9 @@ bool acquire_device_for_read(DCR *dcr)
       RCTX rctx;
       DIRSTORE *store;
       int stat;
+      DCR *dcr_save = jcr->dcr;
+
+      jcr->dcr = NULL;
       memset(&rctx, 0, sizeof(RCTX));
       rctx.jcr = jcr;
       jcr->reserve_msgs = New(alist(10, not_owned_by_alist));
@@ -132,10 +137,13 @@ bool acquire_device_for_read(DCR *dcr)
          /* error */
          Jmsg1(jcr, M_FATAL, 0, _("No suitable device found to read Volume \"%s\"\n"),
             vol->VolumeName);
+         jcr->dcr = dcr_save;
          goto get_out;
       }
+      jcr->dcr = dcr_save;
    }
 
+
    init_device_wait_timers(dcr);
 
    tape_previously_mounted = dev->can_read() || dev->can_append() ||
@@ -149,7 +157,11 @@ bool acquire_device_for_read(DCR *dcr)
       Jmsg1(jcr, M_WARNING, 0, "%s", jcr->errmsg);
    }
    
-   for (i=0; i<5; i++) {
+   for ( ;; ) {
+      /* If not polling limit retries */
+      if (!dev->poll && retry++ > 10) {
+         break;
+      }
       dev->clear_labeled();              /* force reread of label */
       if (job_canceled(jcr)) {
          Mmsg1(dev->errmsg, _("Job %d canceled.\n"), jcr->JobId);
@@ -198,6 +210,12 @@ bool acquire_device_for_read(DCR *dcr)
             tape_initially_mounted = false;
             goto default_path;
          }
+         /* If polling and got a previous bad name, ignore it */
+         if (dev->poll && strcmp(dev->BadVolName, dev->VolHdr.VolumeName) == 0) {
+            goto default_path;
+         } else {
+             bstrncpy(dev->BadVolName, dev->VolHdr.VolumeName, sizeof(dev->BadVolName));
+         }
          /* Fall through */
       default:
          Jmsg1(jcr, M_WARNING, 0, "%s", jcr->errmsg);
@@ -255,6 +273,7 @@ get_out:
    }
    V(dev->mutex);
    dev->unblock();
+   Dmsg1(50, "jcr->dcr=%p\n", jcr->dcr);
    return ok;
 }