]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/mount.c
Fix patches from master
[bacula/bacula] / bacula / src / stored / mount.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2002-2012 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 three of the GNU Affero 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 Affero 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)) {
192       try_autolabel(false);      /* try to create a new volume label */
193    }
194    while (!dev->open(dcr, mode)) {
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)) {
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(210, "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 (!dcr->rewrite_volume_label(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       Dmsg2(100, "Set swap_dev=NULL for dev=%s swap_dev=%s\n",
583          dev->print_name(), dev->swap_dev->print_name());
584       dev->swap_dev = NULL;
585    } else {
586       Dmsg0(100, "No swap_dev set\n");
587    }
588 }
589
590
591 /*
592  * Check if the current position on the volume corresponds to
593  *  what is in the catalog.
594  */
595 bool DCR::is_eod_valid()
596 {
597    if (dev->is_dvd()) {
598       char ed1[50], ed2[50];
599       if (dev->VolCatInfo.VolCatBytes == dev->part_start + dev->part_size) {
600          Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\""
601               " part=%d size=%s\n"), VolumeName, 
602               dev->part, edit_uint64(dev->VolCatInfo.VolCatBytes,ed1));
603       } else {
604          Jmsg(jcr, M_ERROR, 0, _("Bacula cannot write on DVD Volume \"%s\" because: "
605               "The sizes do not match! Volume=%s Catalog=%s\n"),
606               VolumeName,
607               edit_uint64(dev->part_start + dev->part_size, ed1),
608               edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
609          mark_volume_in_error();
610          return false;
611       }
612    } else if (dev->is_tape()) {
613       /*
614        * Check if we are positioned on the tape at the same place
615        * that the database says we should be.
616        */
617       if (dev->VolCatInfo.VolCatFiles == dev->get_file()) {
618          Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\" at file=%d.\n"),
619               VolumeName, dev->get_file());
620       } else if (dev->get_file() > dev->VolCatInfo.VolCatFiles) {
621          Jmsg(jcr, M_WARNING, 0, _("For Volume \"%s\":\n"
622               "The number of files mismatch! Volume=%u Catalog=%u\n"
623               "Correcting Catalog\n"),
624               VolumeName, dev->get_file(), dev->VolCatInfo.VolCatFiles);
625          dev->VolCatInfo.VolCatFiles = dev->get_file();
626          dev->VolCatInfo.VolCatBlocks = dev->get_block_num();
627          if (!dir_update_volume_info(this, false, true)) {
628             Jmsg(jcr, M_WARNING, 0, _("Error updating Catalog\n"));
629             mark_volume_in_error();
630             return false;
631          }
632       } else {
633          Jmsg(jcr, M_ERROR, 0, _("Bacula cannot write on tape Volume \"%s\" because:\n"
634               "The number of files mismatch! Volume=%u Catalog=%u\n"),
635               VolumeName, dev->get_file(), dev->VolCatInfo.VolCatFiles);
636          mark_volume_in_error();
637          return false;
638       }
639    } else if (dev->is_file()) {
640       char ed1[50], ed2[50];
641       boffset_t pos;
642       pos = dev->lseek(this, (boffset_t)0, SEEK_END);
643       if (dev->VolCatInfo.VolCatBytes == (uint64_t)pos) {
644          Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\""
645               " size=%s\n"), VolumeName, 
646               edit_uint64(dev->VolCatInfo.VolCatBytes, ed1));
647       } else if ((uint64_t)pos > dev->VolCatInfo.VolCatBytes) {
648          Jmsg(jcr, M_WARNING, 0, _("For Volume \"%s\":\n"
649               "The sizes do not match! Volume=%s Catalog=%s\n"
650               "Correcting Catalog\n"),
651               VolumeName, edit_uint64(pos, ed1), 
652               edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
653          dev->VolCatInfo.VolCatBytes = (uint64_t)pos;
654          dev->VolCatInfo.VolCatFiles = (uint32_t)(pos >> 32);
655          if (!dir_update_volume_info(this, false, true)) {
656             Jmsg(jcr, M_WARNING, 0, _("Error updating Catalog\n"));
657             mark_volume_in_error();
658             return false;
659          }
660       } else {
661          Mmsg(jcr->errmsg, _("Bacula cannot write on disk Volume \"%s\" because: "
662               "The sizes do not match! Volume=%s Catalog=%s\n"),
663               VolumeName,
664               edit_uint64(pos, ed1),
665               edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
666          Jmsg(jcr, M_ERROR, 0, jcr->errmsg);
667          Dmsg0(050, jcr->errmsg);
668          mark_volume_in_error();
669          return false;
670       }
671    }
672    return true;
673 }
674
675
676 /*
677  * If permitted, we label the device, make sure we can do
678  *   it by checking that the VolCatBytes is zero => not labeled,
679  *   once the Volume is labeled we don't want to label another
680  *   blank tape with the same name.  For disk, we go ahead and
681  *   label it anyway, because the OS insures that there is only
682  *   one Volume with that name.
683  * As noted above, at this point dcr->VolCatInfo has what
684  *   the Director wants and dev->VolCatInfo has info on the
685  *   previous tape (or nothing).
686  *
687  * Return codes are:
688  *   try_next_vol        label failed, look for another volume
689  *   try_read_vol        labeled volume, now re-read the label
690  *   try_error           hard error (catalog update)
691  *   try_default         I couldn't do anything
692  */
693 int DCR::try_autolabel(bool opened)
694 {
695    DCR *dcr = this;
696
697    if (dev->poll && !dev->is_tape()) {
698       return try_default;       /* if polling, don't try to create new labels */
699    }
700    /* For a tape require it to be opened and read before labeling */
701    if (!opened && dev->is_tape()) {
702       return try_default;
703    }
704    if (dev->has_cap(CAP_LABEL) && (VolCatInfo.VolCatBytes == 0 ||
705          (!dev->is_tape() && strcmp(VolCatInfo.VolCatStatus,
706                                 "Recycle") == 0))) {
707       Dmsg0(150, "Create volume label\n");
708       /* Create a new Volume label and write it to the device */
709       if (!write_new_volume_label_to_dev(dcr, VolumeName,
710              pool_name, false, /* no relabel */ false /* defer DVD label */)) {
711          Dmsg2(150, "write_vol_label failed. vol=%s, pool=%s\n",
712            VolumeName, pool_name);
713          if (opened) { 
714             mark_volume_in_error();
715          }
716          return try_next_vol;
717       }
718       Dmsg0(150, "dir_update_vol_info. Set Append\n");
719       /* Copy Director's info into the device info */
720       dev->VolCatInfo = VolCatInfo;    /* structure assignment */
721       if (!dir_update_volume_info(dcr, true, true)) {  /* indicate tape labeled */
722          return try_error;
723       }
724       Jmsg(dcr->jcr, M_INFO, 0, _("Labeled new Volume \"%s\" on device %s.\n"),
725          VolumeName, dev->print_name());
726       return try_read_vol;   /* read label we just wrote */
727    }
728    if (!dev->has_cap(CAP_LABEL) && VolCatInfo.VolCatBytes == 0) {
729       Jmsg(jcr, M_WARNING, 0, _("Device %s not configured to autolabel Volumes.\n"), 
730          dev->print_name());
731    }
732    /* If not removable, Volume is broken */
733    if (!dev->is_removable()) {
734       Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on device %s.\n"),
735          VolumeName, dev->print_name());
736       mark_volume_in_error();
737       return try_next_vol;
738    }
739    return try_default;
740 }
741
742
743 /*
744  * Mark volume in error in catalog
745  */
746 void DCR::mark_volume_in_error()
747 {
748    Jmsg(jcr, M_INFO, 0, _("Marking Volume \"%s\" in Error in Catalog.\n"),
749         VolumeName);
750    dev->VolCatInfo = VolCatInfo;       /* structure assignment */
751    bstrncpy(dev->VolCatInfo.VolCatStatus, "Error", sizeof(dev->VolCatInfo.VolCatStatus));
752    Dmsg0(150, "dir_update_vol_info. Set Error.\n");
753    dir_update_volume_info(this, false, false);
754    volume_unused(this);
755    Dmsg0(50, "set_unload\n");
756    dev->set_unload();                 /* must get a new volume */
757 }
758
759 /*
760  * The Volume is not in the correct slot, so mark this
761  *   Volume as not being in the Changer.
762  */
763 void DCR::mark_volume_not_inchanger()
764 {
765    Jmsg(jcr, M_ERROR, 0, _("Autochanger Volume \"%s\" not found in slot %d.\n"
766 "    Setting InChanger to zero in catalog.\n"),
767         getVolCatName(), VolCatInfo.Slot);
768    dev->VolCatInfo = VolCatInfo;    /* structure assignment */
769    VolCatInfo.InChanger = false;
770    dev->VolCatInfo.InChanger = false;
771    Dmsg0(400, "update vol info in mount\n");
772    dir_update_volume_info(this, true, false);  /* set new status */
773 }
774
775 /*
776  * Either because we are going to hang a new volume, or because
777  *  of explicit user request, we release the current volume.
778  */
779 void DCR::release_volume()
780 {
781    unload_autochanger(this, -1);
782
783    if (WroteVol) {
784       Jmsg0(jcr, M_ERROR, 0, _("Hey!!!!! WroteVol non-zero !!!!!\n"));
785       Pmsg0(190, "Hey!!!!! WroteVol non-zero !!!!!\n");
786    }
787    /*
788     * First erase all memory of the current volume
789     */
790    free_volume(dev);
791    dev->block_num = dev->file = 0;
792    dev->EndBlock = dev->EndFile = 0;
793    memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
794    dev->clear_volhdr();
795    /* Force re-read of label */
796    dev->clear_labeled();
797    dev->clear_read();
798    dev->clear_append();
799    dev->label_type = B_BACULA_LABEL;
800    VolumeName[0] = 0;
801
802    if (dev->is_open() && (!dev->is_tape() || !dev->has_cap(CAP_ALWAYSOPEN))) {
803       dev->close();
804    }
805
806    /* If we have not closed the device, then at least rewind the tape */
807    if (dev->is_open()) {
808       dev->offline_or_rewind();
809    }
810    Dmsg0(190, "release_volume\n");
811 }
812
813 /*
814  *      Insanity check 
815  *
816  * Check to see if the tape position as defined by the OS is
817  *  the same as our concept.  If it is not, 
818  *  it means the user has probably manually rewound the tape.
819  * Note, we check only if num_writers == 0, but this code will
820  *  also work fine for any number of writers. If num_writers > 0,
821  *  we probably should cancel all jobs using this device, or 
822  *  perhaps even abort the SD, or at a minimum, mark the tape
823  *  in error.  Another strategy with num_writers == 0, would be
824  *  to rewind the tape and do a new eod() request.
825  */
826 bool DCR::is_tape_position_ok()
827 {
828    if (dev->is_tape() && dev->num_writers == 0) {
829       int32_t file = dev->get_os_tape_file();
830       if (file >= 0 && file != (int32_t)dev->get_file()) {
831          Jmsg(jcr, M_ERROR, 0, _("Invalid tape position on volume \"%s\"" 
832               " on device %s. Expected %d, got %d\n"), 
833               dev->VolHdr.VolumeName, dev->print_name(), dev->get_file(), file);
834          /* 
835           * If the current file is greater than zero, it means we probably
836           *  have some bad count of EOF marks, so mark tape in error.  Otherwise
837           *  the operator might have moved the tape, so we just release it
838           *  and try again.
839           */
840          if (file > 0) {
841             mark_volume_in_error();
842          }
843          release_volume();
844          return false;
845       }
846    }
847    return true;
848 }
849
850
851 /*
852  * If we are reading, we come here at the end of the tape
853  *  and see if there are more volumes to be mounted.
854  */
855 bool mount_next_read_volume(DCR *dcr)
856 {
857    DEVICE *dev = dcr->dev;
858    JCR *jcr = dcr->jcr;
859    Dmsg2(90, "NumReadVolumes=%d CurReadVolume=%d\n", jcr->NumReadVolumes, jcr->CurReadVolume);
860
861    volume_unused(dcr);                /* release current volume */
862    /*
863     * End Of Tape -- mount next Volume (if another specified)
864     */
865    if (jcr->NumReadVolumes > 1 && jcr->CurReadVolume < jcr->NumReadVolumes) {
866       dev->dlock();
867       dev->close();
868       dev->set_read();
869       dcr->set_reserved();
870       dev->dunlock();
871       if (!acquire_device_for_read(dcr)) {
872          Jmsg2(jcr, M_FATAL, 0, _("Cannot open Dev=%s, Vol=%s\n"), dev->print_name(),
873                dcr->VolumeName);
874          return false;
875       }
876       return true;                    /* next volume mounted */
877    }
878    Dmsg0(90, "End of Device reached.\n");
879    return false;
880 }