]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/mount.c
Back out changes apparently crashing system
[bacula/bacula] / bacula / src / stored / mount.c
index d88181a9c2b48c090e7a56ed62362dcfd2d61cc3..ddc2b5d58f4a4dd42a7f5a5c6bf0b752b6ec541b 100644 (file)
@@ -57,7 +57,8 @@ bool mount_next_write_volume(DCR *dcr, bool release)
    DEV_BLOCK *block = dcr->block;
    int mode;
 
-   Dmsg1(150, "Enter mount_next_volume(release=%d)\n", release);
+   Dmsg2(150, "Enter mount_next_volume(release=%d) dev=%s\n", release,
+      dev->print_name());
 
    init_device_wait_timers(dcr);
 
@@ -164,9 +165,9 @@ mount_next_vol:
       mode = OPEN_READ_WRITE;
    }
    while (dev->open(dcr, mode) < 0) {
-      Dmsg0(000, "open_device failed\n");
+      Dmsg1(150, "open_device failed: ERR=%s\n", dev->bstrerror());
       if (dev->is_file() && dev->is_removable()) {
-         Dmsg0(000, "call scan_dir_for_vol\n");
+         Dmsg0(150, "call scan_dir_for_vol\n");
          if (dev->scan_dir_for_volume(dcr)) {
             break;                    /* got a valid volume */
          }
@@ -193,7 +194,7 @@ read_volume:
     */
    if (dev->has_cap(CAP_STREAM)) {
       vol_label_status = VOL_OK;
-      create_volume_label(dev, dcr->VolumeName, "Default");
+      create_volume_label(dev, dcr->VolumeName, "Default", false /* not DVD */);
       dev->VolHdr.LabelType = PRE_LABEL;
    } else {
       vol_label_status = read_dev_volume_label(dcr);
@@ -215,7 +216,7 @@ read_volume:
       recycle = strcmp(dev->VolCatInfo.VolCatStatus, "Recycle") == 0;
       break;                    /* got a Volume */
    case VOL_NAME_ERROR:
-      VOLUME_CAT_INFO VolCatInfo, devVolCatInfo;
+      VOLUME_CAT_INFO dcrVolCatInfo, devVolCatInfo;
 
       /* If not removable, Volume is broken */
       if (!dev->is_removable()) {
@@ -238,7 +239,7 @@ read_volume:
        *  this volume is really OK. If not, put back the desired
        *  volume name, mark it not in changer and continue.
        */
-      memcpy(&VolCatInfo, &dcr->VolCatInfo, sizeof(VolCatInfo));
+      memcpy(&dcrVolCatInfo, &dcr->VolCatInfo, sizeof(dcrVolCatInfo));
       memcpy(&devVolCatInfo, &dev->VolCatInfo, sizeof(devVolCatInfo));
       /* Check if this is a valid Volume in the pool */
       bstrncpy(dcr->VolumeName, dev->VolHdr.VolumeName, sizeof(dcr->VolumeName));
@@ -247,6 +248,11 @@ read_volume:
          /* This gets the info regardless of the Pool */
          bstrncpy(dcr->VolumeName, dev->VolHdr.VolumeName, sizeof(dcr->VolumeName));
          if (autochanger && !dir_get_volume_info(dcr, GET_VOL_INFO_FOR_READ)) {
+            /*
+             * If we get here, we know we cannot write on the Volume,
+             *  and we know that we cannot read it either, so it 
+             *  is not in the autochanger.
+             */
             mark_volume_not_inchanger(dcr);
          }
          memcpy(&dev->VolCatInfo, &devVolCatInfo, sizeof(dev->VolCatInfo));
@@ -254,12 +260,15 @@ read_volume:
          Jmsg(jcr, M_WARNING, 0, _("Director wanted Volume \"%s\".\n"
               "    Current Volume \"%s\" not acceptable because:\n"
               "    %s"),
-             VolCatInfo.VolCatName, dev->VolHdr.VolumeName,
+             dcrVolCatInfo.VolCatName, dev->VolHdr.VolumeName,
              jcr->dir_bsock->msg);
          ask = true;
+         /* Restore saved DCR before continuing */
+         memcpy(&dcr->VolCatInfo, &dcrVolCatInfo, sizeof(dcr->VolCatInfo));
          goto mount_next_vol;
       }
-      /* This was not the volume we expected, but it is OK with
+      /*
+       * This was not the volume we expected, but it is OK with
        * the Director, so use it.
        */
       Dmsg1(150, "want new name=%s\n", dcr->VolumeName);
@@ -332,25 +341,41 @@ read_volume:
       Dmsg0(200, "Device previously written, moving to end of data\n");
       Jmsg(jcr, M_INFO, 0, _("Volume \"%s\" previously written, moving to end of data.\n"),
          dcr->VolumeName);
-      if (!dev->eod()) {
+      if (!dev->eod(dcr)) {
          Jmsg(jcr, M_ERROR, 0, _("Unable to position to end of data on device %s: ERR=%s\n"),
-            dev->print_name(), strerror_dev(dev));
+            dev->print_name(), dev->bstrerror());
          mark_volume_in_error(dcr);
          goto mount_next_vol;
       }
+      if (dev->is_dvd()) {
+         char ed1[50], ed2[50];
+         if (dev->VolCatInfo.VolCatBytes == dev->part_start + dev->part_size) {
+            Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\""
+                 " part=%d size=%s\n"), dcr->VolumeName, 
+                 dev->part, edit_uint64(dev->VolCatInfo.VolCatBytes,ed1));
+         } else {
+            Jmsg(jcr, M_ERROR, 0, _("I cannot write on Volume \"%s\" because: "
+                 "The sizes do not match! Volume=%s Catalog=%s\n"),
+                 dcr->VolumeName,
+                 edit_uint64(dev->part_start + dev->part_size, ed1),
+                 edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
+            mark_volume_in_error(dcr);
+            goto mount_next_vol;
+         }
+      }
       /* *****FIXME**** we should do some checking for files too */
       if (dev->is_tape()) {
          /*
           * Check if we are positioned on the tape at the same place
           * that the database says we should be.
           */
-         if (dev->VolCatInfo.VolCatFiles == dev_file(dev)) {
+         if (dev->VolCatInfo.VolCatFiles == dev->get_file()) {
             Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\" at file=%d.\n"),
-                 dcr->VolumeName, dev_file(dev));
+                 dcr->VolumeName, dev->get_file());
          } else {
             Jmsg(jcr, M_ERROR, 0, _("I cannot write on Volume \"%s\" because:\n"
-"The number of files mismatch! Volume=%u Catalog=%u\n"),
-                 dcr->VolumeName, dev_file(dev), dev->VolCatInfo.VolCatFiles);
+                 "The number of files mismatch! Volume=%u Catalog=%u\n"),
+                 dcr->VolumeName, dev->get_file(), dev->VolCatInfo.VolCatFiles);
             mark_volume_in_error(dcr);
             goto mount_next_vol;
          }
@@ -394,7 +419,9 @@ read_volume:
       empty_block(block);             /* we used it for reading so set for write */
    }
    dev->set_append();
-   Dmsg0(150, "set APPEND, normal return from read_dev_for_append\n");
+   Dmsg1(150, "set APPEND, normal return from mount_next_write_volume. dev=%s\n",
+      dev->print_name());
+
    return true;
 }
 
@@ -418,7 +445,7 @@ static int try_autolabel(DCR *dcr)
       Dmsg0(150, "Create volume label\n");
       /* Create a new Volume label and write it to the device */
       if (!write_new_volume_label_to_dev(dcr, dcr->VolumeName,
-             dcr->pool_name)) {
+             dcr->pool_name, false, /* no relabel */ false /* defer DVD label */)) {
          Dmsg0(150, "!write_vol_label\n");
          mark_volume_in_error(dcr);
          return try_next_vol;