]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/mount.c
Remove unwanted execute bit
[bacula/bacula] / bacula / src / stored / mount.c
index eb6a29bde68de04b403e2d9ab84107c2b0c2e91c..6175d8bc2611a8600de8da755da00ba3568e9a26 100644 (file)
@@ -10,7 +10,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2002-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2002-2007 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.
@@ -39,7 +39,7 @@
 #include "stored.h"                   /* pull in Storage Deamon headers */
 
 static void mark_volume_not_inchanger(DCR *dcr);
-static int try_autolabel(DCR *dcr);
+static int try_autolabel(DCR *dcr, bool opened);
 
 enum {
    try_next_vol = 1,
@@ -179,7 +179,7 @@ mount_next_vol:
    }
    /* Try autolabel if enabled */
    if (dev->open(dcr, mode) < 0) {
-      try_autolabel(dcr);
+      try_autolabel(dcr, false);      /* try to create a new volume label */
    }
    while (dev->open(dcr, mode) < 0) {
       Dmsg1(150, "open_device failed: ERR=%s\n", dev->bstrerror());
@@ -200,7 +200,7 @@ mount_next_vol:
             dev->unmount(0);
          }
       }
-      if (try_autolabel(dcr) == try_read_vol) {
+      if (try_autolabel(dcr, false) == try_read_vol) {
          break;                       /* created a new volume label */
       }
       /* If DVD, ignore the error, very often you cannot open the device
@@ -247,6 +247,7 @@ read_volume:
       break;                    /* got a Volume */
    case VOL_NAME_ERROR:
       VOLUME_CAT_INFO dcrVolCatInfo, devVolCatInfo;
+      char VolumeName[MAX_NAME_LENGTH];
 
       /* If not removable, Volume is broken */
       if (!dev->is_removable()) {
@@ -272,6 +273,7 @@ read_volume:
       dcrVolCatInfo = dcr->VolCatInfo;      /* structure assignment */
       devVolCatInfo = dev->VolCatInfo;      /* structure assignment */
       /* Check if this is a valid Volume in the pool */
+      bstrncpy(VolumeName, dcr->VolumeName, sizeof(VolumeName));
       bstrncpy(dcr->VolumeName, dev->VolHdr.VolumeName, sizeof(dcr->VolumeName));
       if (!dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) {
          /* Restore desired volume name, note device info out of sync */
@@ -294,6 +296,7 @@ read_volume:
              jcr->dir_bsock->msg);
          ask = true;
          /* Restore saved DCR before continuing */
+         bstrncpy(dcr->VolumeName, VolumeName, sizeof(dcr->VolumeName));
          dcr->VolCatInfo = dcrVolCatInfo;  /* structure assignment */
          goto mount_next_vol;
       }
@@ -316,7 +319,7 @@ read_volume:
       }
       /* Fall through wanted */
    case VOL_NO_LABEL:
-      switch (try_autolabel(dcr)) {
+      switch (try_autolabel(dcr, true)) {
       case try_next_vol:
          goto mount_next_vol;
       case try_read_vol:
@@ -465,10 +468,24 @@ read_volume:
  * As noted above, at this point dcr->VolCatInfo has what
  *   the Director wants and dev->VolCatInfo has info on the
  *   previous tape (or nothing).
+ *
+ * Return codes are:
+ *   try_next_vol        label failed, look for another volume
+ *   try_read_vol        labeled volume, now re-read the label
+ *   try_error           hard error (catalog update)
+ *   try_default         I couldn't do anything
  */
-static int try_autolabel(DCR *dcr)
+static int try_autolabel(DCR *dcr, bool opened)
 {
    DEVICE *dev = dcr->dev;
+
+   if (dev->poll && !dev->is_tape()) {
+      return try_default;       /* if polling, don't try to create new labels */
+   }
+   /* For a tape require it to be opened and read before labeling */
+   if (!opened && dev->is_tape()) {
+      return try_default;
+   }
    if (dev->has_cap(CAP_LABEL) && (dcr->VolCatInfo.VolCatBytes == 0 ||
          (!dev->is_tape() && strcmp(dcr->VolCatInfo.VolCatStatus,
                                 "Recycle") == 0))) {
@@ -477,7 +494,9 @@ static int try_autolabel(DCR *dcr)
       if (!write_new_volume_label_to_dev(dcr, dcr->VolumeName,
              dcr->pool_name, false, /* no relabel */ false /* defer DVD label */)) {
          Dmsg0(150, "!write_vol_label\n");
-         mark_volume_in_error(dcr);
+         if (opened) { 
+            mark_volume_in_error(dcr);
+         }
          return try_next_vol;
       }
       Dmsg0(150, "dir_update_vol_info. Set Append\n");
@@ -491,7 +510,7 @@ static int try_autolabel(DCR *dcr)
       return try_read_vol;   /* read label we just wrote */
    }
    if (!dev->has_cap(CAP_LABEL) && dcr->VolCatInfo.VolCatBytes == 0) {
-      Jmsg(dcr->jcr, M_INFO, 0, _("Warning device %s not configured to autolabel Volumes.\n"), 
+      Jmsg(dcr->jcr, M_WARNING, 0, _("Device %s not configured to autolabel Volumes.\n"), 
          dev->print_name());
    }
    /* If not removable, Volume is broken */