X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fmount.c;h=ddc2b5d58f4a4dd42a7f5a5c6bf0b752b6ec541b;hb=9326b2fd753cf4a714d40d5c190ba04b16261510;hp=d88181a9c2b48c090e7a56ed62362dcfd2d61cc3;hpb=8db7c1356fb4030c6e79cf74bac1fb240d55b042;p=bacula%2Fbacula diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index d88181a9c2..ddc2b5d58f 100644 --- a/bacula/src/stored/mount.c +++ b/bacula/src/stored/mount.c @@ -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;