]> git.sur5r.net Git - bacula/bacula/commitdiff
Free Volume in several places. Fixes virtual-changer problem
authorKern Sibbald <kern@sibbald.com>
Sun, 23 Aug 2009 07:58:52 +0000 (09:58 +0200)
committerKern Sibbald <kern@sibbald.com>
Sun, 23 Aug 2009 07:58:52 +0000 (09:58 +0200)
     and possibly bug #1346.

bacula/src/stored/acquire.c
bacula/src/stored/dircmd.c
bacula/src/stored/label.c
bacula/src/stored/mount.c
bacula/technotes

index dc3b7269c358983cddddf164cee55897348d5310..1d382d1f58f36b1d36e743ff537088a45a590653 100644 (file)
@@ -245,7 +245,8 @@ bool acquire_device_for_read(DCR *dcr)
          }
          goto default_path;
       case VOL_NAME_ERROR:
-         Dmsg0(50, "Vol name error.\n");
+         Dmsg3(50, "Vol name=%s want=%s drv=%s.\n", dev->VolHdr.VolumeName, 
+               dcr->VolumeName, dev->print_name());
          if (dev->is_volume_to_unload()) {
             goto default_path;
          }
@@ -253,6 +254,7 @@ bool acquire_device_for_read(DCR *dcr)
          if (!unload_autochanger(dcr, -1)) {
             /* at least free the device so we can re-open with correct volume */
             dev->close();                                                          
+            free_volume(dev);
          }
          dev->set_load();
          /* Fall through */
@@ -267,6 +269,7 @@ default_path:
           */
          if (dev->requires_mount()) {
             dev->close();
+            free_volume(dev);
          }
          
          /* Call autochanger only once unless ask_sysop called */
@@ -511,6 +514,7 @@ bool release_device(DCR *dcr)
    if (dev->num_writers == 0 && (!dev->is_tape() || !dev->has_cap(CAP_ALWAYSOPEN))) {
       dvd_remove_empty_part(dcr);        /* get rid of any empty spool part */
       dev->close();
+      free_volume(dev);
    }
 
    /* Fire off Alert command and include any output */
index 3e1e613c6fd0bd9a1631971f50ceafa8e08dc8bc..4f4a2d72f92967f6c3b04b52749ea28b9584191f 100644 (file)
@@ -814,6 +814,7 @@ static bool unmount_cmd(JCR *jcr)
             if (!unload_autochanger(dcr, -1)) {
                /* ***FIXME**** what is this ????  */
                dev->close();
+               free_volume(dev);
             }
             if (dev->is_unmountable() && !dev->unmount(0)) {
                dir->fsend(_("3907 %s"), dev->bstrerror());
@@ -845,6 +846,7 @@ static bool unmount_cmd(JCR *jcr)
             clear_thread_id(dev->no_wait_id);
             if (!unload_autochanger(dcr, -1)) {
                dev->close();
+               free_volume(dev);
             }
             if (dev->is_unmountable() && !dev->unmount(0)) {
                dir->fsend(_("3907 %s"), dev->bstrerror());
index 48656a4f3f1a1b292b184ad6b9eb1adc3dd6c1e1..cfb43128f0f036114f250fdadf76f5e54dac8e9d 100644 (file)
@@ -237,6 +237,7 @@ int read_dev_volume_label(DCR *dcr)
    if (reserve_volume(dcr, dev->VolHdr.VolumeName) == NULL) {
       Mmsg2(jcr->errmsg, _("Could not reserve volume %s on %s\n"),
            dev->VolHdr.VolumeName, dev->print_name());
+      Dmsg2(150, "Could not reserve volume %s on %s\n", dev->VolHdr.VolumeName, dev->print_name());
       stat = VOL_NAME_ERROR;
       goto bail_out;
    }
index 06d48b36d14fbae78382fbea0608f1b1fbd07825..ea8571c757c1191851f68031eb4873ef53c091e9 100644 (file)
@@ -145,6 +145,7 @@ mount_next_vol:
       autochanger = false;
       VolCatInfo.Slot = 0;
       ask = retry >= 2;
+      do_find = true;           /* do find_a_volume if we retry */
    }
    Dmsg1(150, "autoload_dev returns %d\n", autochanger);
    /*
@@ -180,6 +181,7 @@ mount_next_vol:
 
    if (dev->poll && dev->has_cap(CAP_CLOSEONPOLL)) {
       dev->close();
+      free_volume(dev);
    }
 
    /* Ensure the device is open */
@@ -474,6 +476,7 @@ int DCR::check_volume_label(bool &ask, bool &autochanger)
       /* Needed, so the medium can be changed */
       if (dev->requires_mount()) {
          dev->close();
+         free_volume(dev);
       }
       goto check_next_volume;
    }
@@ -544,6 +547,12 @@ void DCR::do_swapping(bool is_writing)
          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 */
+      } else {
+         Dmsg1(100, "No vol on dev=%s\n", dev->print_name());
+      }
+      if (dev->swap_dev->vol) {
+         Dmsg2(100, "Vol=%s on dev=%s\n", dev->swap_dev->vol->vol_name,
+              dev->swap_dev->print_name());
       }
       dev->swap_dev = NULL;
    }
index 68fcabf08700b555a914f873c0e6c8f3e930fdda..3242f0e63a3ace9c43f9612b54ae3ca428727409 100644 (file)
@@ -2,6 +2,10 @@
           
 General:
 
+23Aug09
+kes  Free Volume in several places. Fixes virtual-changer problem
+     and possibly bug #1346.
+kes  Add SD Volume debug code
 22Aug09
 kes  Don't print different filesystem. Will not descend 
      message if directory explicitly excluded