]> git.sur5r.net Git - bacula/bacula/commitdiff
More calls to volume_unused()
authorKern Sibbald <kern@sibbald.com>
Sun, 6 Jan 2008 09:29:19 +0000 (09:29 +0000)
committerKern Sibbald <kern@sibbald.com>
Sun, 6 Jan 2008 09:29:19 +0000 (09:29 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6243 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/stored/acquire.c
bacula/src/stored/block.c
bacula/src/stored/btape.c
bacula/src/stored/dircmd.c
bacula/src/stored/label.c
bacula/src/stored/read_record.c
bacula/src/stored/reserve.c
bacula/technotes-2.3

index cbd7616f3084a4b6f18374405ce5c267200798ec..198bb858cd0ebc03c0e4e3633d3ea4a3386884ae 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2002-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2002-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -80,6 +80,7 @@ bool acquire_device_for_read(DCR *dcr)
          edit_int64(jcr->JobId, ed1));
       goto get_out;
    }
+   volume_unused(dcr);                /* release any current volume */
    jcr->CurReadVolume++;
    for (i=1; i<jcr->CurReadVolume; i++) {
       vol = vol->next;
index d257f05b63e566746f5fe0cd16f88afa39e1b54c..fc530139a28809395b85055fcf8f9550729bd866 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2001-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2001-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -772,6 +772,7 @@ static bool terminate_writing_volume(DCR *dcr)
    }
 
 bail_out:
+   volume_unused(dcr);                /* mark volume unused */
    dev->set_ateot();                  /* no more writing this tape */
    Dmsg1(50, "*** Leave terminate_writing_volume -- %s\n", ok?"OK":"ERROR");
    return ok;
index 81237ece1bd27e9c9011ae2434920baaaf6dec62..3cd7be3095b70cdb2a0661da327ef79dc7eba3eb 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -2732,6 +2732,7 @@ static bool my_mount_next_read_volume(DCR *dcr)
    Pmsg2(000, _("End of Volume \"%s\" %d records.\n"), dcr->VolumeName,
       quickie_count);
 
+   volume_unused(dcr);                    /* mark volume no longer needed */
    if (LastBlock != block->BlockNumber) {
       VolBytes += block->block_len;
    }
index 95a05e075abd295baa0db0702fcedf11c9656cf1..57e960f94c79b7cd605409734c9ba426eb898320 100644 (file)
@@ -512,6 +512,7 @@ static void label_volume_if_ok(DCR *dcr, char *oldname,
    }
 
 bail_out:
+   volume_unused(dcr);                   /* no longer using */
    if (!dev->is_open()) {
       dev->clear_volhdr();
    }
@@ -548,6 +549,7 @@ static bool read_label(DCR *dcr)
       ok = false;
       break;
    }
+   volume_unused(dcr);
    give_back_device_lock(dev, &hold);
    return ok;
 }
index 5e6c75bfca368026510c2f8622ffa368bb3d7e0a..68fe6f1b522e4ffdf852a153665aeffe59629998 100644 (file)
@@ -257,6 +257,7 @@ int read_dev_volume_label(DCR *dcr)
    return VOL_OK;
 
 bail_out:
+   volume_unused(dcr);                /* mark volume "released" */
    empty_block(block);
    dev->rewind(dcr);
    Dmsg1(150, "return %d\n", stat);
@@ -315,13 +316,15 @@ bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName,
    Dmsg0(150, "write_volume_label()\n");
    empty_block(dcr->block);
 
-   /* If relabeling, truncate the device */
-   if (relabel && !dev->truncate(dcr)) {
-      goto bail_out;
-   }
-
-   if (relabel && !dev->is_tape()) {
-      dev->close_part(dcr);              /* make sure DVD/file closed for rename */
+   if (relabel) {
+      volume_unused(dcr);             /* mark current volume unused */
+      /* Truncate device */
+      if (!dev->truncate(dcr)) {
+         goto bail_out;
+      }
+      if (!dev->is_tape()) {
+         dev->close_part(dcr);        /* make sure DVD/file closed for rename */
+      }
    }
 
    /* Set the new filename for open, ... */
@@ -451,6 +454,7 @@ bool rewrite_volume_label(DCR *dcr, bool recycle)
          return false;
       }
       if (recycle) {
+         volume_unused(dcr);             /* mark volume unused */
          if (!dev->truncate(dcr)) {
             Jmsg2(jcr, M_FATAL, 0, _("Truncate error on device %s: ERR=%s\n"),
                   dev->print_name(), dev->print_errmsg());
index 69707e247d91152f229fd7bf33881cf2c60c53f6..4190d11848b4d62f94bcd618a8917e10e680e95a 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2002-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2002-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -82,6 +82,7 @@ bool read_records(DCR *dcr,
             DEV_RECORD *trec = new_record();
             Jmsg(jcr, M_INFO, 0, _("End of Volume at file %u on device %s, Volume \"%s\"\n"),
                  dev->file, dev->print_name(), dcr->VolumeName);
+            volume_unused(dcr);       /* mark volume unused */
             if (!mount_cb(dcr)) {
                Jmsg(jcr, M_INFO, 0, _("End of all volumes.\n"));
                ok = false;            /* Stop everything */
index 0c15236e13d2055efaf7e8ab291f994f1476b0de..e65c6bb984de589300d4bff38bf85dc738d7d091 100644 (file)
@@ -330,19 +330,20 @@ VOLRES *reserve_volume(DCR *dcr, const char *VolumeName)
       vol = dev->vol;
       /*
        * Make sure we don't remove the current volume we are inserting
-       *  because it was probably inserted by another job.
+       *  because it was probably inserted by another job, or it
+       *  is not being used and is marked as released.
        */
       if (strcmp(vol->vol_name, VolumeName) == 0) {
          Dmsg1(dbglvl, "OK, vol=%s on device.\n", VolumeName);
+         vol->released = false;         /* retake vol if released previously */
          goto get_out;                  /* Volume already on this device */
       } else {
          /* Don't release a volume if it is in use */
-#ifdef xxx
          if (!vol->released) {
+            Dmsg1(dbglvl, "Cannot free vol=%s. It is not released.\n", vol->vol_name);
             vol = NULL;                  /* vol in use */
             goto get_out;
          }
-#endif
          Dmsg2(dbglvl, "reserve_vol free vol=%s at %p\n", vol->vol_name, vol->vol_name);
          unload_autochanger(dcr, -1);   /* unload the volume */
          free_volume(dev);
@@ -475,7 +476,6 @@ void unreserve_device(DCR *dcr)
          dev->num_writers = 0;
       }
    }
-
    volume_unused(dcr);
 }
 
@@ -515,6 +515,10 @@ bool volume_unused(DCR *dcr)
    if (dev->is_tape() || dev->is_autochanger()) {
       return true;
    } else {
+      /*
+       * Note, this frees the volume reservation entry, but the 
+       *   file descriptor remains open with the OS.
+       */
       return free_volume(dev);
    }
 }
index 1d35512bfbac6c388aac8b83d35152ca8937c0b6..6b112fa4af82fb5283b924cc6d5de68723342614 100644 (file)
@@ -1,6 +1,11 @@
               Technical notes on version 2.3
 
 General:
+06Jan08
+kes  A few more tweaks to new reservation code. Make sure to clear
+     vol released flag when retaking volume. When reading label and
+     label is bad mark volume unused. When recycling, mark volume
+     unused so it can be renamed.
 05Jan08
 kes  Fix reserve_volume() so it doesn't release a volume in use
      (i.e. a volume entry not marked released). This should be