]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/mount.c
Tweak correct typo pointed out by Arno
[bacula/bacula] / bacula / src / stored / mount.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2002-2010 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version two of the GNU General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  *
30  *  Routines for handling mounting tapes for reading and for
31  *    writing.
32  *
33  *   Kern Sibbald, August MMII
34  *
35  */
36
37 #include "bacula.h"                   /* pull in global headers */
38 #include "stored.h"                   /* pull in Storage Deamon headers */
39
40 enum {
41    try_next_vol = 1,
42    try_read_vol,
43    try_error,
44    try_default
45 };
46
47 enum {
48    check_next_vol = 1,
49    check_ok,
50    check_read_vol,
51    check_error
52 };
53
54 /*
55  * If release is set, we rewind the current volume,
56  * which we no longer want, and ask the user (console)
57  * to mount the next volume.
58  *
59  *  Continue trying until we get it, and then ensure
60  *  that we can write on it.
61  *
62  * This routine returns a 0 only if it is REALLY
63  *  impossible to get the requested Volume.
64  *
65  * This routine is entered with the device blocked, but not
66  *   locked.
67  *
68  */
69 bool DCR::mount_next_write_volume()
70 {
71    int retry = 0;
72    bool ask = false, recycle, autochanger;
73    int mode;
74    DCR *dcr = this;
75
76    Dmsg2(150, "Enter mount_next_volume(release=%d) dev=%s\n", dev->must_unload(),
77       dev->print_name());
78
79    init_device_wait_timers(dcr);
80    
81    /*
82     * Attempt to mount the next volume. If something non-fatal goes
83     *  wrong, we come back here to re-try (new op messages, re-read
84     *  Volume, ...)
85     */
86    lock_volumes();
87
88 mount_next_vol:
89    Dmsg1(150, "mount_next_vol retry=%d\n", retry);
90    /* Ignore retry if this is poll request */
91    if (retry++ > 4) {
92       /* Last ditch effort before giving up, force operator to respond */
93       VolCatInfo.Slot = 0;
94       unlock_volumes();
95       if (!dir_ask_sysop_to_mount_volume(dcr, ST_APPEND)) {
96          Jmsg(jcr, M_FATAL, 0, _("Too many errors trying to mount device %s.\n"),
97               dev->print_name());
98          goto no_lock_bail_out;
99       }
100       lock_volumes();
101       Dmsg1(150, "Continue after dir_ask_sysop_to_mount. must_load=%d\n", dev->must_load());
102    }
103    if (job_canceled(jcr)) {
104       Jmsg(jcr, M_FATAL, 0, _("Job %d canceled.\n"), jcr->JobId);
105       goto bail_out;
106    }
107    recycle = false;
108
109    if (dev->must_unload()) {
110       ask = true;                     /* ask operator to mount tape */
111    }
112    do_unload();
113    do_swapping(true /*is_writing*/);
114    do_load(true /*is_writing*/);
115
116    if (!find_a_volume()) {
117       goto bail_out;
118    }
119
120    if (job_canceled(jcr)) {
121       goto bail_out;
122    }
123    Dmsg3(150, "After find_next_append. Vol=%s Slot=%d Parts=%d\n",
124          getVolCatName(), VolCatInfo.Slot, VolCatInfo.VolCatParts);
125    
126    /*
127     * Get next volume and ready it for append
128     * This code ensures that the device is ready for
129     * writing. We start from the assumption that there
130     * may not be a tape mounted.
131     *
132     * If the device is a file, we create the output
133     * file. If it is a tape, we check the volume name
134     * and move the tape to the end of data.
135     *
136     */
137    dcr->setVolCatInfo(false);   /* out of date when Vols unlocked */
138    if (autoload_device(dcr, true/*writing*/, NULL) > 0) {
139       autochanger = true;
140       ask = false;
141    } else {
142       autochanger = false;
143       VolCatInfo.Slot = 0;
144       ask = retry >= 2;
145    }
146    Dmsg1(150, "autoload_dev returns %d\n", autochanger);
147    /*
148     * If we autochanged to correct Volume or (we have not just
149     *   released the Volume AND we can automount) we go ahead
150     *   and read the label. If there is no tape in the drive,
151     *   we will fail, recurse and ask the operator the next time.
152     */
153    if (!dev->must_unload() && dev->is_tape() && dev->has_cap(CAP_AUTOMOUNT)) {
154       Dmsg0(250, "(1)Ask=0\n");
155       ask = false;                 /* don't ask SYSOP this time */
156    }
157    /* Don't ask if not removable */
158    if (!dev->is_removable()) {
159       Dmsg0(250, "(2)Ask=0\n");
160       ask = false;
161    }
162    Dmsg2(250, "Ask=%d autochanger=%d\n", ask, autochanger);
163
164    if (ask) {
165       unlock_volumes();
166       dcr->setVolCatInfo(false);   /* out of date when Vols unlocked */
167       if (!dir_ask_sysop_to_mount_volume(dcr, ST_APPEND)) {
168          Dmsg0(150, "Error return ask_sysop ...\n");
169          goto no_lock_bail_out;
170       }
171       lock_volumes();
172    }
173    if (job_canceled(jcr)) {
174       goto bail_out;
175    }
176    Dmsg3(150, "want vol=%s devvol=%s dev=%s\n", VolumeName, 
177       dev->VolHdr.VolumeName, dev->print_name());
178
179    if (dev->poll && dev->has_cap(CAP_CLOSEONPOLL)) {
180       dev->close();
181       free_volume(dev);
182    }
183
184    /* Ensure the device is open */
185    if (dev->has_cap(CAP_STREAM)) {
186       mode = OPEN_WRITE_ONLY;
187    } else {
188       mode = OPEN_READ_WRITE;
189    }
190    /* Try autolabel if enabled */
191    if (dev->open(dcr, mode) < 0) {
192       try_autolabel(false);      /* try to create a new volume label */
193    }
194    while (dev->open(dcr, mode) < 0) {
195       Dmsg1(150, "open_device failed: ERR=%s\n", dev->bstrerror());
196       if ((dev->is_file() && dev->is_removable()) || dev->is_dvd()) {
197          bool ok = true;
198          Dmsg0(150, "call scan_dir_for_vol\n");
199          if (dev->is_dvd()) {
200             if (!dev->mount(0)) {
201                ok = false;
202             }
203          }
204          if (ok && dev->scan_dir_for_volume(dcr)) {
205             if (dev->open(dcr, mode) >= 0) {
206                break;                    /* got a valid volume */
207             }
208          }
209          if (ok && dev->is_dvd()) {
210             dev->unmount(0);
211          }
212       }
213       if (try_autolabel(false) == try_read_vol) {
214          break;                       /* created a new volume label */
215       }
216       Jmsg3(jcr, M_WARNING, 0, _("Open device %s Volume \"%s\" failed: ERR=%s\n"),
217             dev->print_name(), dcr->VolumeName, dev->bstrerror());
218       Dmsg0(50, "set_unload\n");
219       dev->set_unload();              /* force ask sysop */
220       ask = true;
221       Dmsg0(150, "goto mount_next_vol\n");
222       goto mount_next_vol;
223    }
224
225    /*
226     * Now check the volume label to make sure we have the right tape mounted
227     */
228 read_volume:
229    switch (check_volume_label(ask, autochanger)) {
230    case check_next_vol:
231       Dmsg0(50, "set_unload\n");
232       dev->set_unload();                 /* want a different Volume */
233       Dmsg0(150, "goto mount_next_vol\n");
234       goto mount_next_vol;
235    case check_read_vol:
236       goto read_volume;
237    case check_error:
238       goto bail_out;
239    case check_ok:
240       break;
241    }
242    /*
243     * Check that volcatinfo is good   
244     */
245    if (!dev->haveVolCatInfo()) {
246       Dmsg0(100, "Do not have volcatinfo\n");
247       if (!find_a_volume()) {
248          goto mount_next_vol;
249       }
250       dev->VolCatInfo = VolCatInfo;      /* structure assignment */
251    }
252
253    /*
254     * See if we have a fresh tape or a tape with data.
255     *
256     * Note, if the LabelType is PRE_LABEL, it was labeled
257     *  but never written. If so, rewrite the label but set as
258     *  VOL_LABEL.  We rewind and return the label (reconstructed)
259     *  in the block so that in the case of a new tape, data can
260     *  be appended just after the block label.  If we are writing
261     *  a second volume, the calling routine will write the label
262     *  before writing the overflow block.
263     *
264     *  If the tape is marked as Recycle, we rewrite the label.
265     */
266    recycle = strcmp(dev->VolCatInfo.VolCatStatus, "Recycle") == 0;
267    if (dev->VolHdr.LabelType == PRE_LABEL || recycle) {
268       if (!rewrite_volume_label(dcr, recycle)) {
269          mark_volume_in_error();
270          goto mount_next_vol;
271       }
272    } else {
273       /*
274        * OK, at this point, we have a valid Bacula label, but
275        * we need to position to the end of the volume, since we are
276        * just now putting it into append mode.
277        */
278       Dmsg1(100, "Device previously written, moving to end of data. Expect %lld bytes\n",
279            dev->VolCatInfo.VolCatBytes);
280       Jmsg(jcr, M_INFO, 0, _("Volume \"%s\" previously written, moving to end of data.\n"),
281          VolumeName);
282
283       if (!dev->eod(dcr)) {
284          Dmsg2(050, "Unable to position to end of data on device %s: ERR=%s\n", 
285             dev->print_name(), dev->bstrerror());
286          Jmsg(jcr, M_ERROR, 0, _("Unable to position to end of data on device %s: ERR=%s\n"),
287             dev->print_name(), dev->bstrerror());
288          mark_volume_in_error();
289          goto mount_next_vol;
290       }
291       if (!is_eod_valid()) {
292          Dmsg0(100, "goto mount_next_vol\n");
293          goto mount_next_vol;
294       }
295
296       dev->VolCatInfo.VolCatMounts++;      /* Update mounts */
297       Dmsg1(150, "update volinfo mounts=%d\n", dev->VolCatInfo.VolCatMounts);
298       if (!dir_update_volume_info(dcr, false, false)) {
299          goto bail_out;
300       }
301       
302       /* Return an empty block */
303       empty_block(block);             /* we used it for reading so set for write */
304    }
305    dev->set_append();
306    Dmsg1(150, "set APPEND, normal return from mount_next_write_volume. dev=%s\n",
307       dev->print_name());
308
309    unlock_volumes();
310    return true;
311
312 bail_out:
313    unlock_volumes();
314
315 no_lock_bail_out:
316    return false;
317 }
318
319 /*
320  * This routine is meant to be called once the first pass
321  *   to ensure that we have a candidate volume to mount.
322  *   Otherwise, we ask the sysop to created one.
323  * Note, the the Volumes are locked on entry and exit.
324  */
325 bool DCR::find_a_volume()
326 {
327    DCR *dcr = this;
328
329    if (!is_suitable_volume_mounted()) {
330       bool have_vol = false;
331       /* Do we have a candidate volume? */
332       if (dev->vol) {
333          bstrncpy(VolumeName, dev->vol->vol_name, sizeof(VolumeName));
334          have_vol = dir_get_volume_info(this, GET_VOL_INFO_FOR_WRITE);
335       }
336       /*
337        * Get Director's idea of what tape we should have mounted.
338        *    in dcr->VolCatInfo
339        */
340       if (!have_vol) {
341          Dmsg0(200, "Before dir_find_next_appendable_volume.\n");
342          while (!dir_find_next_appendable_volume(dcr)) {
343             Dmsg0(200, "not dir_find_next\n");
344             if (job_canceled(jcr)) {
345                return false;
346             }
347             unlock_volumes();
348             if (!dir_ask_sysop_to_create_appendable_volume(dcr)) {
349                lock_volumes();
350                return false;
351              }
352              lock_volumes();
353              if (job_canceled(jcr)) {
354                 return false;
355              }
356              Dmsg0(150, "Again dir_find_next_append...\n");
357          }
358       }
359    }
360    if (dcr->haveVolCatInfo()) {
361       return true;
362    }
363    return dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE);
364 }
365
366 int DCR::check_volume_label(bool &ask, bool &autochanger)
367 {
368    int vol_label_status;
369    /*
370     * If we are writing to a stream device, ASSUME the volume label
371     *  is correct.
372     */
373    if (dev->has_cap(CAP_STREAM)) {
374       vol_label_status = VOL_OK;
375       create_volume_label(dev, VolumeName, "Default", false /* not DVD */);
376       dev->VolHdr.LabelType = PRE_LABEL;
377    } else {
378       vol_label_status = read_dev_volume_label(this);
379    }
380    if (job_canceled(jcr)) {
381       goto check_bail_out;
382    }
383
384    Dmsg2(150, "Want dirVol=%s dirStat=%s\n", VolumeName,
385       VolCatInfo.VolCatStatus);
386
387    /*
388     * At this point, dev->VolCatInfo has what is in the drive, if anything,
389     *          and   dcr->VolCatInfo has what the Director wants.
390     */
391    switch (vol_label_status) {
392    case VOL_OK:
393       Dmsg1(150, "Vol OK name=%s\n", dev->VolHdr.VolumeName);
394       dev->VolCatInfo = VolCatInfo;       /* structure assignment */
395       break;                    /* got a Volume */
396    case VOL_NAME_ERROR:
397       VOLUME_CAT_INFO dcrVolCatInfo, devVolCatInfo;
398       char saveVolumeName[MAX_NAME_LENGTH];
399
400       Dmsg2(150, "Vol NAME Error Have=%s, want=%s\n", dev->VolHdr.VolumeName, VolumeName);
401       if (dev->is_volume_to_unload()) {
402          ask = true;
403          goto check_next_volume;
404       }
405
406       /* If not removable, Volume is broken */
407       if (!dev->is_removable()) {
408          Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on device %s.\n"),
409             VolumeName, dev->print_name());
410          mark_volume_in_error();
411          goto check_next_volume;
412       }
413
414       /*
415        * OK, we got a different volume mounted. First save the
416        *  requested Volume info (dcr) structure, then query if
417        *  this volume is really OK. If not, put back the desired
418        *  volume name, mark it not in changer and continue.
419        */
420       dcrVolCatInfo = VolCatInfo;      /* structure assignment */
421       devVolCatInfo = dev->VolCatInfo;      /* structure assignment */
422       /* Check if this is a valid Volume in the pool */
423       bstrncpy(saveVolumeName, VolumeName, sizeof(saveVolumeName));
424       bstrncpy(VolumeName, dev->VolHdr.VolumeName, sizeof(VolumeName));
425       if (!dir_get_volume_info(this, GET_VOL_INFO_FOR_WRITE)) {
426          POOL_MEM vol_info_msg;
427          pm_strcpy(vol_info_msg, jcr->dir_bsock->msg);  /* save error message */
428          /* Restore desired volume name, note device info out of sync */
429          /* This gets the info regardless of the Pool */
430          bstrncpy(VolumeName, dev->VolHdr.VolumeName, sizeof(VolumeName));
431          if (autochanger && !dir_get_volume_info(this, GET_VOL_INFO_FOR_READ)) {
432             /*
433              * If we get here, we know we cannot write on the Volume,
434              *  and we know that we cannot read it either, so it 
435              *  is not in the autochanger.
436              */
437             mark_volume_not_inchanger();
438          }
439          dev->VolCatInfo = devVolCatInfo;    /* structure assignment */
440          dev->set_unload();                  /* unload this volume */
441          Jmsg(jcr, M_WARNING, 0, _("Director wanted Volume \"%s\".\n"
442               "    Current Volume \"%s\" not acceptable because:\n"
443               "    %s"),
444              dcrVolCatInfo.VolCatName, dev->VolHdr.VolumeName,
445              vol_info_msg.c_str());
446          ask = true;
447          /* Restore saved DCR before continuing */
448          bstrncpy(VolumeName, saveVolumeName, sizeof(VolumeName));
449          VolCatInfo = dcrVolCatInfo;  /* structure assignment */
450          goto check_next_volume;
451       }
452       /*
453        * This was not the volume we expected, but it is OK with
454        * the Director, so use it.
455        */
456       Dmsg1(150, "Got new Volume name=%s\n", VolumeName);
457       dev->VolCatInfo = VolCatInfo;   /* structure assignment */
458       Dmsg1(100, "Call reserve_volume=%s\n", dev->VolHdr.VolumeName);
459       if (reserve_volume(this, dev->VolHdr.VolumeName) == NULL) {
460          Jmsg2(jcr, M_WARNING, 0, _("Could not reserve volume %s on %s\n"),
461             dev->VolHdr.VolumeName, dev->print_name());
462          ask = true;
463          dev->setVolCatInfo(false);
464          setVolCatInfo(false);
465          goto check_next_volume;
466       }
467       break;                /* got a Volume */
468    /*
469     * At this point, we assume we have a blank tape mounted.
470     */
471    case VOL_IO_ERROR:
472       if (dev->is_dvd()) {
473          Jmsg(jcr, M_FATAL, 0, "%s", jcr->errmsg);
474          mark_volume_in_error();
475          goto check_bail_out;       /* we could not write on DVD */
476       }
477       /* Fall through wanted */
478    case VOL_NO_LABEL:
479       switch (try_autolabel(true)) {
480       case try_next_vol:
481          goto check_next_volume;
482       case try_read_vol:
483          goto check_read_volume;
484       case try_error:
485          goto check_bail_out;
486       case try_default:
487          break;
488       }
489       /* NOTE! Fall-through wanted. */
490    case VOL_NO_MEDIA:
491    default:
492       Dmsg0(200, "VOL_NO_MEDIA or default.\n");
493       /* Send error message */
494       if (!dev->poll) {
495       } else {
496          Dmsg1(200, "Msg suppressed by poll: %s\n", jcr->errmsg);
497       }
498       ask = true;
499       /* Needed, so the medium can be changed */
500       if (dev->requires_mount()) {
501          dev->close();
502          free_volume(dev);
503       }
504       goto check_next_volume;
505    }
506    return check_ok;
507
508 check_next_volume:
509    dev->setVolCatInfo(false);
510    setVolCatInfo(false);
511    return check_next_vol;
512
513 check_bail_out:
514    return check_error;
515
516 check_read_volume:
517    return check_read_vol;
518
519 }
520
521
522 bool DCR::is_suitable_volume_mounted()
523 {
524    /* Volume mounted? */
525    if (dev->VolHdr.VolumeName[0] == 0 || dev->swap_dev || dev->must_unload()) {
526       return false;                      /* no */
527    }
528    bstrncpy(VolumeName, dev->VolHdr.VolumeName, sizeof(VolumeName));
529    return dir_get_volume_info(this, GET_VOL_INFO_FOR_WRITE);
530 }
531
532 bool DCR::do_unload()
533 {
534    if (dev->must_unload()) {
535       Dmsg1(100, "must_unload release %s\n", dev->print_name());
536       release_volume();
537    }
538    return false;
539 }
540
541 bool DCR::do_load(bool is_writing)
542 {
543    if (dev->must_load()) {
544       Dmsg1(100, "Must load %s\n", dev->print_name());
545       if (autoload_device(this, is_writing, NULL) > 0) {
546          dev->clear_load();
547          return true;
548       }
549       return false;
550    }
551    return true;
552 }
553
554 void DCR::do_swapping(bool is_writing)
555 {
556    /*
557     * See if we are asked to swap the Volume from another device
558     *  if so, unload the other device here, and attach the
559     *  volume to our drive.
560     */
561    if (dev->swap_dev) {
562       if (dev->swap_dev->must_unload()) {
563          if (dev->vol) {
564             dev->swap_dev->set_slot(dev->vol->get_slot());
565          }
566          Dmsg2(100, "Swap unloading slot=%d %s\n", dev->swap_dev->get_slot(),
567                dev->swap_dev->print_name());
568          unload_dev(this, dev->swap_dev);
569       }
570       if (dev->vol) {
571          dev->vol->clear_swapping();
572          Dmsg1(100, "=== set in_use vol=%s\n", dev->vol->vol_name);
573          dev->vol->set_in_use();
574          dev->VolHdr.VolumeName[0] = 0;  /* don't yet have right Volume */
575       } else {
576          Dmsg1(100, "No vol on dev=%s\n", dev->print_name());
577       }
578       if (dev->swap_dev->vol) {
579          Dmsg2(100, "Vol=%s on dev=%s\n", dev->swap_dev->vol->vol_name,
580               dev->swap_dev->print_name());
581       }
582       dev->swap_dev = NULL;
583    }
584 }
585
586
587 /*
588  * Check if the current position on the volume corresponds to
589  *  what is in the catalog.
590  */
591 bool DCR::is_eod_valid()
592 {
593    if (dev->is_dvd()) {
594       char ed1[50], ed2[50];
595       if (dev->VolCatInfo.VolCatBytes == dev->part_start + dev->part_size) {
596          Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\""
597               " part=%d size=%s\n"), VolumeName, 
598               dev->part, edit_uint64(dev->VolCatInfo.VolCatBytes,ed1));
599       } else {
600          Jmsg(jcr, M_ERROR, 0, _("Bacula cannot write on DVD Volume \"%s\" because: "
601               "The sizes do not match! Volume=%s Catalog=%s\n"),
602               VolumeName,
603               edit_uint64(dev->part_start + dev->part_size, ed1),
604               edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
605          mark_volume_in_error();
606          return false;
607       }
608    } else if (dev->is_tape()) {
609       /*
610        * Check if we are positioned on the tape at the same place
611        * that the database says we should be.
612        */
613       if (dev->VolCatInfo.VolCatFiles == dev->get_file()) {
614          Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\" at file=%d.\n"),
615               VolumeName, dev->get_file());
616       } else if (dev->get_file() > dev->VolCatInfo.VolCatFiles) {
617          Jmsg(jcr, M_WARNING, 0, _("For Volume \"%s\":\n"
618               "The number of files mismatch! Volume=%u Catalog=%u\n"
619               "Correcting Catalog\n"),
620               VolumeName, dev->get_file(), dev->VolCatInfo.VolCatFiles);
621          dev->VolCatInfo.VolCatFiles = dev->get_file();
622          dev->VolCatInfo.VolCatBlocks = dev->get_block_num();
623          if (!dir_update_volume_info(this, false, true)) {
624             Jmsg(jcr, M_WARNING, 0, _("Error updating Catalog\n"));
625             mark_volume_in_error();
626             return false;
627          }
628       } else {
629          Jmsg(jcr, M_ERROR, 0, _("Bacula cannot write on tape Volume \"%s\" because:\n"
630               "The number of files mismatch! Volume=%u Catalog=%u\n"),
631               VolumeName, dev->get_file(), dev->VolCatInfo.VolCatFiles);
632          mark_volume_in_error();
633          return false;
634       }
635    } else if (dev->is_file()) {
636       char ed1[50], ed2[50];
637       boffset_t pos;
638       pos = dev->lseek(this, (boffset_t)0, SEEK_END);
639       if (dev->VolCatInfo.VolCatBytes == (uint64_t)pos) {
640          Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\""
641               " size=%s\n"), VolumeName, 
642               edit_uint64(dev->VolCatInfo.VolCatBytes, ed1));
643       } else if ((uint64_t)pos > dev->VolCatInfo.VolCatBytes) {
644          Jmsg(jcr, M_WARNING, 0, _("For Volume \"%s\":\n"
645               "The sizes do not match! Volume=%s Catalog=%s\n"
646               "Correcting Catalog\n"),
647               VolumeName, edit_uint64(pos, ed1), 
648               edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
649          dev->VolCatInfo.VolCatBytes = (uint64_t)pos;
650          dev->VolCatInfo.VolCatFiles = (uint32_t)(pos >> 32);
651          if (!dir_update_volume_info(this, false, true)) {
652             Jmsg(jcr, M_WARNING, 0, _("Error updating Catalog\n"));
653             mark_volume_in_error();
654             return false;
655          }
656       } else {
657          Mmsg(jcr->errmsg, _("Bacula cannot write on disk Volume \"%s\" because: "
658               "The sizes do not match! Volume=%s Catalog=%s\n"),
659               VolumeName,
660               edit_uint64(pos, ed1),
661               edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
662          Jmsg(jcr, M_ERROR, 0, jcr->errmsg);
663          Dmsg0(050, jcr->errmsg);
664          mark_volume_in_error();
665          return false;
666       }
667    }
668    return true;
669 }
670
671
672 /*
673  * If permitted, we label the device, make sure we can do
674  *   it by checking that the VolCatBytes is zero => not labeled,
675  *   once the Volume is labeled we don't want to label another
676  *   blank tape with the same name.  For disk, we go ahead and
677  *   label it anyway, because the OS insures that there is only
678  *   one Volume with that name.
679  * As noted above, at this point dcr->VolCatInfo has what
680  *   the Director wants and dev->VolCatInfo has info on the
681  *   previous tape (or nothing).
682  *
683  * Return codes are:
684  *   try_next_vol        label failed, look for another volume
685  *   try_read_vol        labeled volume, now re-read the label
686  *   try_error           hard error (catalog update)
687  *   try_default         I couldn't do anything
688  */
689 int DCR::try_autolabel(bool opened)
690 {
691    DCR *dcr = this;
692
693    if (dev->poll && !dev->is_tape()) {
694       return try_default;       /* if polling, don't try to create new labels */
695    }
696    /* For a tape require it to be opened and read before labeling */
697    if (!opened && dev->is_tape()) {
698       return try_default;
699    }
700    if (dev->has_cap(CAP_LABEL) && (VolCatInfo.VolCatBytes == 0 ||
701          (!dev->is_tape() && strcmp(VolCatInfo.VolCatStatus,
702                                 "Recycle") == 0))) {
703       Dmsg0(150, "Create volume label\n");
704       /* Create a new Volume label and write it to the device */
705       if (!write_new_volume_label_to_dev(dcr, VolumeName,
706              pool_name, false, /* no relabel */ false /* defer DVD label */)) {
707          Dmsg2(150, "write_vol_label failed. vol=%s, pool=%s\n",
708            VolumeName, pool_name);
709          if (opened) { 
710             mark_volume_in_error();
711          }
712          return try_next_vol;
713       }
714       Dmsg0(150, "dir_update_vol_info. Set Append\n");
715       /* Copy Director's info into the device info */
716       dev->VolCatInfo = VolCatInfo;    /* structure assignment */
717       if (!dir_update_volume_info(dcr, true, true)) {  /* indicate tape labeled */
718          return try_error;
719       }
720       Jmsg(dcr->jcr, M_INFO, 0, _("Labeled new Volume \"%s\" on device %s.\n"),
721          VolumeName, dev->print_name());
722       return try_read_vol;   /* read label we just wrote */
723    }
724    if (!dev->has_cap(CAP_LABEL) && VolCatInfo.VolCatBytes == 0) {
725       Jmsg(jcr, M_WARNING, 0, _("Device %s not configured to autolabel Volumes.\n"), 
726          dev->print_name());
727    }
728    /* If not removable, Volume is broken */
729    if (!dev->is_removable()) {
730       Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on device %s.\n"),
731          VolumeName, dev->print_name());
732       mark_volume_in_error();
733       return try_next_vol;
734    }
735    return try_default;
736 }
737
738
739 /*
740  * Mark volume in error in catalog
741  */
742 void DCR::mark_volume_in_error()
743 {
744    Jmsg(jcr, M_INFO, 0, _("Marking Volume \"%s\" in Error in Catalog.\n"),
745         VolumeName);
746    dev->VolCatInfo = VolCatInfo;       /* structure assignment */
747    bstrncpy(dev->VolCatInfo.VolCatStatus, "Error", sizeof(dev->VolCatInfo.VolCatStatus));
748    Dmsg0(150, "dir_update_vol_info. Set Error.\n");
749    dir_update_volume_info(this, false, false);
750    volume_unused(this);
751    Dmsg0(50, "set_unload\n");
752    dev->set_unload();                 /* must get a new volume */
753 }
754
755 /*
756  * The Volume is not in the correct slot, so mark this
757  *   Volume as not being in the Changer.
758  */
759 void DCR::mark_volume_not_inchanger()
760 {
761    Jmsg(jcr, M_ERROR, 0, _("Autochanger Volume \"%s\" not found in slot %d.\n"
762 "    Setting InChanger to zero in catalog.\n"),
763         getVolCatName(), VolCatInfo.Slot);
764    dev->VolCatInfo = VolCatInfo;    /* structure assignment */
765    VolCatInfo.InChanger = false;
766    dev->VolCatInfo.InChanger = false;
767    Dmsg0(400, "update vol info in mount\n");
768    dir_update_volume_info(this, true, false);  /* set new status */
769 }
770
771 /*
772  * Either because we are going to hang a new volume, or because
773  *  of explicit user request, we release the current volume.
774  */
775 void DCR::release_volume()
776 {
777    unload_autochanger(this, -1);
778
779    if (WroteVol) {
780       Jmsg0(jcr, M_ERROR, 0, _("Hey!!!!! WroteVol non-zero !!!!!\n"));
781       Pmsg0(190, "Hey!!!!! WroteVol non-zero !!!!!\n");
782    }
783    /*
784     * First erase all memory of the current volume
785     */
786    free_volume(dev);
787    dev->block_num = dev->file = 0;
788    dev->EndBlock = dev->EndFile = 0;
789    memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
790    dev->clear_volhdr();
791    /* Force re-read of label */
792    dev->clear_labeled();
793    dev->clear_read();
794    dev->clear_append();
795    dev->label_type = B_BACULA_LABEL;
796    VolumeName[0] = 0;
797
798    if (dev->is_open() && (!dev->is_tape() || !dev->has_cap(CAP_ALWAYSOPEN))) {
799       dev->close();
800    }
801
802    /* If we have not closed the device, then at least rewind the tape */
803    if (dev->is_open()) {
804       dev->offline_or_rewind();
805    }
806    Dmsg0(190, "release_volume\n");
807 }
808
809 /*
810  *      Insanity check 
811  *
812  * Check to see if the tape position as defined by the OS is
813  *  the same as our concept.  If it is not, 
814  *  it means the user has probably manually rewound the tape.
815  * Note, we check only if num_writers == 0, but this code will
816  *  also work fine for any number of writers. If num_writers > 0,
817  *  we probably should cancel all jobs using this device, or 
818  *  perhaps even abort the SD, or at a minimum, mark the tape
819  *  in error.  Another strategy with num_writers == 0, would be
820  *  to rewind the tape and do a new eod() request.
821  */
822 bool DCR::is_tape_position_ok()
823 {
824    if (dev->is_tape() && dev->num_writers == 0) {
825       int32_t file = dev->get_os_tape_file();
826       if (file >= 0 && file != (int32_t)dev->get_file()) {
827          Jmsg(jcr, M_ERROR, 0, _("Invalid tape position on volume \"%s\"" 
828               " on device %s. Expected %d, got %d\n"), 
829               dev->VolHdr.VolumeName, dev->print_name(), dev->get_file(), file);
830          /* 
831           * If the current file is greater than zero, it means we probably
832           *  have some bad count of EOF marks, so mark tape in error.  Otherwise
833           *  the operator might have moved the tape, so we just release it
834           *  and try again.
835           */
836          if (file > 0) {
837             mark_volume_in_error();
838          }
839          release_volume();
840          return false;
841       }
842    }
843    return true;
844 }
845
846
847 /*
848  * If we are reading, we come here at the end of the tape
849  *  and see if there are more volumes to be mounted.
850  */
851 bool mount_next_read_volume(DCR *dcr)
852 {
853    DEVICE *dev = dcr->dev;
854    JCR *jcr = dcr->jcr;
855    Dmsg2(90, "NumReadVolumes=%d CurReadVolume=%d\n", jcr->NumReadVolumes, jcr->CurReadVolume);
856
857    volume_unused(dcr);                /* release current volume */
858    /*
859     * End Of Tape -- mount next Volume (if another specified)
860     */
861    if (jcr->NumReadVolumes > 1 && jcr->CurReadVolume < jcr->NumReadVolumes) {
862       dev->close();
863       if (!acquire_device_for_read(dcr)) {
864          Jmsg2(jcr, M_FATAL, 0, _("Cannot open Dev=%s, Vol=%s\n"), dev->print_name(),
865                dcr->VolumeName);
866          return false;
867       }
868       return true;                    /* next volume mounted */
869    }
870    Dmsg0(90, "End of Device reached.\n");
871    return false;
872 }