]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/mount.c
Fix crash from unequal volume_lock/unlock calls
[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
41 enum {
42    try_next_vol = 1,
43    try_read_vol,
44    try_error,
45    try_default
46 };
47
48 enum {
49    check_next_vol = 1,
50    check_ok,
51    check_read_vol,
52    check_error
53 };
54
55 /*
56  * If release is set, we rewind the current volume,
57  * which we no longer want, and ask the user (console)
58  * to mount the next volume.
59  *
60  *  Continue trying until we get it, and then ensure
61  *  that we can write on it.
62  *
63  * This routine returns a 0 only if it is REALLY
64  *  impossible to get the requested Volume.
65  *
66  * This routine is entered with the device blocked, but not
67  *   locked.
68  *
69  */
70 bool DCR::mount_next_write_volume()
71 {
72    int retry = 0;
73    bool ask = false, recycle, autochanger;
74    int mode;
75    DCR *dcr = this;
76
77    Dmsg2(150, "Enter mount_next_volume(release=%d) dev=%s\n", dev->must_unload(),
78       dev->print_name());
79
80    init_device_wait_timers(dcr);
81    lock_volumes();
82    
83    /*
84     * Attempt to mount the next volume. If something non-fatal goes
85     *  wrong, we come back here to re-try (new op messages, re-read
86     *  Volume, ...)
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.
324  *   They are unlocked on failure and remain locked on
325  *   success.  The caller must know this!!!
326  */
327 bool DCR::find_a_volume()  
328 {
329    DCR *dcr = this;
330    if (!is_suitable_volume_mounted()) {
331       bool have_vol = false;
332       /* Do we have a candidate volume? */
333       if (dev->vol) {
334          bstrncpy(VolumeName, dev->vol->vol_name, sizeof(VolumeName));
335          have_vol = dir_get_volume_info(this, GET_VOL_INFO_FOR_WRITE);
336       }
337       /*
338        * Get Director's idea of what tape we should have mounted.
339        *    in dcr->VolCatInfo
340        */
341       if (!have_vol) {
342          Dmsg0(200, "Before dir_find_next_appendable_volume.\n");
343          while (!dir_find_next_appendable_volume(dcr)) {
344             Dmsg0(200, "not dir_find_next\n");
345             if (job_canceled(jcr)) {
346                unlock_volumes();
347                return false;
348             }
349             unlock_volumes();
350             if (!dir_ask_sysop_to_create_appendable_volume(dcr)) {
351                lock_volumes();
352                return false;
353              }
354              lock_volumes();
355              Dmsg0(150, "Again dir_find_next_append...\n");
356          }
357       }
358    }
359    if (dcr->haveVolCatInfo()) {
360       return true;
361    }
362    return dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE);
363 }
364
365 int DCR::check_volume_label(bool &ask, bool &autochanger)
366 {
367    int vol_label_status;
368    /*
369     * If we are writing to a stream device, ASSUME the volume label
370     *  is correct.
371     */
372    if (dev->has_cap(CAP_STREAM)) {
373       vol_label_status = VOL_OK;
374       create_volume_label(dev, VolumeName, "Default", false /* not DVD */);
375       dev->VolHdr.LabelType = PRE_LABEL;
376    } else {
377       vol_label_status = read_dev_volume_label(this);
378    }
379    if (job_canceled(jcr)) {
380       goto check_bail_out;
381    }
382
383    Dmsg2(150, "Want dirVol=%s dirStat=%s\n", VolumeName,
384       VolCatInfo.VolCatStatus);
385
386    /*
387     * At this point, dev->VolCatInfo has what is in the drive, if anything,
388     *          and   dcr->VolCatInfo has what the Director wants.
389     */
390    switch (vol_label_status) {
391    case VOL_OK:
392       Dmsg1(150, "Vol OK name=%s\n", dev->VolHdr.VolumeName);
393       dev->VolCatInfo = VolCatInfo;       /* structure assignment */
394       break;                    /* got a Volume */
395    case VOL_NAME_ERROR:
396       VOLUME_CAT_INFO dcrVolCatInfo, devVolCatInfo;
397       char saveVolumeName[MAX_NAME_LENGTH];
398
399       Dmsg2(150, "Vol NAME Error Have=%s, want=%s\n", dev->VolHdr.VolumeName, VolumeName);
400       if (dev->is_volume_to_unload()) {
401          ask = true;
402          goto check_next_volume;
403       }
404
405       /* If not removable, Volume is broken */
406       if (!dev->is_removable()) {
407          Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on device %s.\n"),
408             VolumeName, dev->print_name());
409          mark_volume_in_error();
410          goto check_next_volume;
411       }
412
413       /*
414        * OK, we got a different volume mounted. First save the
415        *  requested Volume info (dcr) structure, then query if
416        *  this volume is really OK. If not, put back the desired
417        *  volume name, mark it not in changer and continue.
418        */
419       dcrVolCatInfo = VolCatInfo;      /* structure assignment */
420       devVolCatInfo = dev->VolCatInfo;      /* structure assignment */
421       /* Check if this is a valid Volume in the pool */
422       bstrncpy(saveVolumeName, VolumeName, sizeof(saveVolumeName));
423       bstrncpy(VolumeName, dev->VolHdr.VolumeName, sizeof(VolumeName));
424       if (!dir_get_volume_info(this, GET_VOL_INFO_FOR_WRITE)) {
425          POOL_MEM vol_info_msg;
426          pm_strcpy(vol_info_msg, jcr->dir_bsock->msg);  /* save error message */
427          /* Restore desired volume name, note device info out of sync */
428          /* This gets the info regardless of the Pool */
429          bstrncpy(VolumeName, dev->VolHdr.VolumeName, sizeof(VolumeName));
430          if (autochanger && !dir_get_volume_info(this, GET_VOL_INFO_FOR_READ)) {
431             /*
432              * If we get here, we know we cannot write on the Volume,
433              *  and we know that we cannot read it either, so it 
434              *  is not in the autochanger.
435              */
436             mark_volume_not_inchanger();
437          }
438          dev->VolCatInfo = devVolCatInfo;    /* structure assignment */
439          dev->set_unload();                  /* unload this volume */
440          Jmsg(jcr, M_WARNING, 0, _("Director wanted Volume \"%s\".\n"
441               "    Current Volume \"%s\" not acceptable because:\n"
442               "    %s"),
443              dcrVolCatInfo.VolCatName, dev->VolHdr.VolumeName,
444              vol_info_msg.c_str());
445          ask = true;
446          /* Restore saved DCR before continuing */
447          bstrncpy(VolumeName, saveVolumeName, sizeof(VolumeName));
448          VolCatInfo = dcrVolCatInfo;  /* structure assignment */
449          goto check_next_volume;
450       }
451       /*
452        * This was not the volume we expected, but it is OK with
453        * the Director, so use it.
454        */
455       Dmsg1(150, "Got new Volume name=%s\n", VolumeName);
456       dev->VolCatInfo = VolCatInfo;   /* structure assignment */
457       Dmsg1(100, "Call reserve_volume=%s\n", dev->VolHdr.VolumeName);
458       if (reserve_volume(this, dev->VolHdr.VolumeName) == NULL) {
459          Jmsg2(jcr, M_WARNING, 0, _("Could not reserve volume %s on %s\n"),
460             dev->VolHdr.VolumeName, dev->print_name());
461          ask = true;
462          dev->setVolCatInfo(false);
463          setVolCatInfo(false);
464          goto check_next_volume;
465       }
466       break;                /* got a Volume */
467    /*
468     * At this point, we assume we have a blank tape mounted.
469     */
470    case VOL_IO_ERROR:
471       if (dev->is_dvd()) {
472          Jmsg(jcr, M_FATAL, 0, "%s", jcr->errmsg);
473          mark_volume_in_error();
474          goto check_bail_out;       /* we could not write on DVD */
475       }
476       /* Fall through wanted */
477    case VOL_NO_LABEL:
478       switch (try_autolabel(true)) {
479       case try_next_vol:
480          goto check_next_volume;
481       case try_read_vol:
482          goto check_read_volume;
483       case try_error:
484          goto check_bail_out;
485       case try_default:
486          break;
487       }
488       /* NOTE! Fall-through wanted. */
489    case VOL_NO_MEDIA:
490    default:
491       Dmsg0(200, "VOL_NO_MEDIA or default.\n");
492       /* Send error message */
493       if (!dev->poll) {
494       } else {
495          Dmsg1(200, "Msg suppressed by poll: %s\n", jcr->errmsg);
496       }
497       ask = true;
498       /* Needed, so the medium can be changed */
499       if (dev->requires_mount()) {
500          dev->close();
501          free_volume(dev);
502       }
503       goto check_next_volume;
504    }
505    return check_ok;
506
507 check_next_volume:
508    dev->setVolCatInfo(false);
509    setVolCatInfo(false);
510    return check_next_vol;
511
512 check_bail_out:
513    return check_error;
514
515 check_read_volume:
516    return check_read_vol;
517
518 }
519
520
521 bool DCR::is_suitable_volume_mounted()
522 {
523    /* Volume mounted? */
524    if (dev->VolHdr.VolumeName[0] == 0 || dev->swap_dev || dev->must_unload()) {
525       return false;                      /* no */
526    }
527    bstrncpy(VolumeName, dev->VolHdr.VolumeName, sizeof(VolumeName));
528    return dir_get_volume_info(this, GET_VOL_INFO_FOR_WRITE);
529 }
530
531 bool DCR::do_unload()
532 {
533    if (dev->must_unload()) {
534       Dmsg1(100, "must_unload release %s\n", dev->print_name());
535       release_volume();
536    }
537    return false;
538 }
539
540 bool DCR::do_load(bool is_writing)
541 {
542    if (dev->must_load()) {
543       Dmsg1(100, "Must load %s\n", dev->print_name());
544       if (autoload_device(this, is_writing, NULL) > 0) {
545          dev->clear_load();
546          return true;
547       }
548       return false;
549    }
550    return true;
551 }
552
553 void DCR::do_swapping(bool is_writing)
554 {
555    /*
556     * See if we are asked to swap the Volume from another device
557     *  if so, unload the other device here, and attach the
558     *  volume to our drive.
559     */
560    if (dev->swap_dev) {
561       if (dev->swap_dev->must_unload()) {
562          if (dev->vol) {
563             dev->swap_dev->set_slot(dev->vol->get_slot());
564          }
565          Dmsg2(100, "Swap unloading slot=%d %s\n", dev->swap_dev->get_slot(),
566                dev->swap_dev->print_name());
567          unload_dev(this, dev->swap_dev);
568       }
569       if (dev->vol) {
570          dev->vol->clear_swapping();
571          Dmsg1(100, "=== set in_use vol=%s\n", dev->vol->vol_name);
572          dev->vol->set_in_use();
573          dev->VolHdr.VolumeName[0] = 0;  /* don't yet have right Volume */
574       } else {
575          Dmsg1(100, "No vol on dev=%s\n", dev->print_name());
576       }
577       if (dev->swap_dev->vol) {
578          Dmsg2(100, "Vol=%s on dev=%s\n", dev->swap_dev->vol->vol_name,
579               dev->swap_dev->print_name());
580       }
581       dev->swap_dev = NULL;
582    }
583 }
584
585
586 /*
587  * Check if the current position on the volume corresponds to
588  *  what is in the catalog.
589  */
590 bool DCR::is_eod_valid()
591 {
592    if (dev->is_dvd()) {
593       char ed1[50], ed2[50];
594       if (dev->VolCatInfo.VolCatBytes == dev->part_start + dev->part_size) {
595          Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\""
596               " part=%d size=%s\n"), VolumeName, 
597               dev->part, edit_uint64(dev->VolCatInfo.VolCatBytes,ed1));
598       } else {
599          Jmsg(jcr, M_ERROR, 0, _("Bacula cannot write on DVD Volume \"%s\" because: "
600               "The sizes do not match! Volume=%s Catalog=%s\n"),
601               VolumeName,
602               edit_uint64(dev->part_start + dev->part_size, ed1),
603               edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
604          mark_volume_in_error();
605          return false;
606       }
607    } else if (dev->is_tape()) {
608       /*
609        * Check if we are positioned on the tape at the same place
610        * that the database says we should be.
611        */
612       if (dev->VolCatInfo.VolCatFiles == dev->get_file()) {
613          Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\" at file=%d.\n"),
614               VolumeName, dev->get_file());
615       } else {
616          Jmsg(jcr, M_ERROR, 0, _("Bacula cannot write on tape Volume \"%s\" because:\n"
617               "The number of files mismatch! Volume=%u Catalog=%u\n"),
618               VolumeName, dev->get_file(), dev->VolCatInfo.VolCatFiles);
619          mark_volume_in_error();
620          return false;
621       }
622    } else if (dev->is_file()) {
623       char ed1[50], ed2[50];
624       boffset_t pos;
625       pos = dev->lseek(this, (boffset_t)0, SEEK_END);
626       if (dev->VolCatInfo.VolCatBytes == (uint64_t)pos) {
627          Jmsg(jcr, M_INFO, 0, _("Ready to append to end of Volume \"%s\""
628               " size=%s\n"), VolumeName, 
629               edit_uint64(dev->VolCatInfo.VolCatBytes, ed1));
630       } else {
631          Mmsg(jcr->errmsg, _("Bacula cannot write on disk Volume \"%s\" because: "
632               "The sizes do not match! Volume=%s Catalog=%s\n"),
633               VolumeName,
634               edit_uint64(pos, ed1),
635               edit_uint64(dev->VolCatInfo.VolCatBytes, ed2));
636          Jmsg(jcr, M_ERROR, 0, jcr->errmsg);
637          Dmsg0(050, jcr->errmsg);
638          mark_volume_in_error();
639          return false;
640       }
641    }
642    return true;
643 }
644
645
646 /*
647  * If permitted, we label the device, make sure we can do
648  *   it by checking that the VolCatBytes is zero => not labeled,
649  *   once the Volume is labeled we don't want to label another
650  *   blank tape with the same name.  For disk, we go ahead and
651  *   label it anyway, because the OS insures that there is only
652  *   one Volume with that name.
653  * As noted above, at this point dcr->VolCatInfo has what
654  *   the Director wants and dev->VolCatInfo has info on the
655  *   previous tape (or nothing).
656  *
657  * Return codes are:
658  *   try_next_vol        label failed, look for another volume
659  *   try_read_vol        labeled volume, now re-read the label
660  *   try_error           hard error (catalog update)
661  *   try_default         I couldn't do anything
662  */
663 int DCR::try_autolabel(bool opened)
664 {
665    DCR *dcr = this;
666
667    if (dev->poll && !dev->is_tape()) {
668       return try_default;       /* if polling, don't try to create new labels */
669    }
670    /* For a tape require it to be opened and read before labeling */
671    if (!opened && dev->is_tape()) {
672       return try_default;
673    }
674    if (dev->has_cap(CAP_LABEL) && (VolCatInfo.VolCatBytes == 0 ||
675          (!dev->is_tape() && strcmp(VolCatInfo.VolCatStatus,
676                                 "Recycle") == 0))) {
677       Dmsg0(150, "Create volume label\n");
678       /* Create a new Volume label and write it to the device */
679       if (!write_new_volume_label_to_dev(dcr, VolumeName,
680              pool_name, false, /* no relabel */ false /* defer DVD label */)) {
681          Dmsg2(150, "write_vol_label failed. vol=%s, pool=%s\n",
682            VolumeName, pool_name);
683          if (opened) { 
684             mark_volume_in_error();
685          }
686          return try_next_vol;
687       }
688       Dmsg0(150, "dir_update_vol_info. Set Append\n");
689       /* Copy Director's info into the device info */
690       dev->VolCatInfo = VolCatInfo;    /* structure assignment */
691       if (!dir_update_volume_info(dcr, true, true)) {  /* indicate tape labeled */
692          return try_error;
693       }
694       Jmsg(dcr->jcr, M_INFO, 0, _("Labeled new Volume \"%s\" on device %s.\n"),
695          VolumeName, dev->print_name());
696       return try_read_vol;   /* read label we just wrote */
697    }
698    if (!dev->has_cap(CAP_LABEL) && VolCatInfo.VolCatBytes == 0) {
699       Jmsg(jcr, M_WARNING, 0, _("Device %s not configured to autolabel Volumes.\n"), 
700          dev->print_name());
701    }
702    /* If not removable, Volume is broken */
703    if (!dev->is_removable()) {
704       Jmsg(jcr, M_WARNING, 0, _("Volume \"%s\" not on device %s.\n"),
705          VolumeName, dev->print_name());
706       mark_volume_in_error();
707       return try_next_vol;
708    }
709    return try_default;
710 }
711
712
713 /*
714  * Mark volume in error in catalog
715  */
716 void DCR::mark_volume_in_error()
717 {
718    Jmsg(jcr, M_INFO, 0, _("Marking Volume \"%s\" in Error in Catalog.\n"),
719         VolumeName);
720    dev->VolCatInfo = VolCatInfo;       /* structure assignment */
721    bstrncpy(dev->VolCatInfo.VolCatStatus, "Error", sizeof(dev->VolCatInfo.VolCatStatus));
722    Dmsg0(150, "dir_update_vol_info. Set Error.\n");
723    dir_update_volume_info(this, false, false);
724    volume_unused(this);
725    Dmsg0(50, "set_unload\n");
726    dev->set_unload();                 /* must get a new volume */
727 }
728
729 /*
730  * The Volume is not in the correct slot, so mark this
731  *   Volume as not being in the Changer.
732  */
733 void DCR::mark_volume_not_inchanger()
734 {
735    Jmsg(jcr, M_ERROR, 0, _("Autochanger Volume \"%s\" not found in slot %d.\n"
736 "    Setting InChanger to zero in catalog.\n"),
737         getVolCatName(), VolCatInfo.Slot);
738    dev->VolCatInfo = VolCatInfo;    /* structure assignment */
739    VolCatInfo.InChanger = false;
740    dev->VolCatInfo.InChanger = false;
741    Dmsg0(400, "update vol info in mount\n");
742    dir_update_volume_info(this, true, false);  /* set new status */
743 }
744
745 /*
746  * Either because we are going to hang a new volume, or because
747  *  of explicit user request, we release the current volume.
748  */
749 void DCR::release_volume()
750 {
751    unload_autochanger(this, -1);
752
753    if (WroteVol) {
754       Jmsg0(jcr, M_ERROR, 0, _("Hey!!!!! WroteVol non-zero !!!!!\n"));
755       Pmsg0(190, "Hey!!!!! WroteVol non-zero !!!!!\n");
756    }
757    /*
758     * First erase all memory of the current volume
759     */
760    free_volume(dev);
761    dev->block_num = dev->file = 0;
762    dev->EndBlock = dev->EndFile = 0;
763    memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
764    dev->clear_volhdr();
765    /* Force re-read of label */
766    dev->clear_labeled();
767    dev->clear_read();
768    dev->clear_append();
769    dev->label_type = B_BACULA_LABEL;
770    VolumeName[0] = 0;
771
772    if (dev->is_open() && (!dev->is_tape() || !dev->has_cap(CAP_ALWAYSOPEN))) {
773       dev->close();
774    }
775
776    /* If we have not closed the device, then at least rewind the tape */
777    if (dev->is_open()) {
778       dev->offline_or_rewind();
779    }
780    Dmsg0(190, "release_volume\n");
781 }
782
783 /*
784  *      Insanity check 
785  *
786  * Check to see if the tape position as defined by the OS is
787  *  the same as our concept.  If it is not, 
788  *  it means the user has probably manually rewound the tape.
789  * Note, we check only if num_writers == 0, but this code will
790  *  also work fine for any number of writers. If num_writers > 0,
791  *  we probably should cancel all jobs using this device, or 
792  *  perhaps even abort the SD, or at a minimum, mark the tape
793  *  in error.  Another strategy with num_writers == 0, would be
794  *  to rewind the tape and do a new eod() request.
795  */
796 bool DCR::is_tape_position_ok()
797 {
798    if (dev->is_tape() && dev->num_writers == 0) {
799       int32_t file = dev->get_os_tape_file();
800       if (file >= 0 && file != (int32_t)dev->get_file()) {
801          Jmsg(jcr, M_ERROR, 0, _("Invalid tape position on volume \"%s\"" 
802               " on device %s. Expected %d, got %d\n"), 
803               dev->VolHdr.VolumeName, dev->print_name(), dev->get_file(), file);
804          /* 
805           * If the current file is greater than zero, it means we probably
806           *  have some bad count of EOF marks, so mark tape in error.  Otherwise
807           *  the operator might have moved the tape, so we just release it
808           *  and try again.
809           */
810          if (file > 0) {
811             mark_volume_in_error();
812          }
813          release_volume();
814          return false;
815       }
816    }
817    return true;
818 }
819
820
821 /*
822  * If we are reading, we come here at the end of the tape
823  *  and see if there are more volumes to be mounted.
824  */
825 bool mount_next_read_volume(DCR *dcr)
826 {
827    DEVICE *dev = dcr->dev;
828    JCR *jcr = dcr->jcr;
829    Dmsg2(90, "NumReadVolumes=%d CurReadVolume=%d\n", jcr->NumReadVolumes, jcr->CurReadVolume);
830
831    volume_unused(dcr);                /* release current volume */
832    /*
833     * End Of Tape -- mount next Volume (if another specified)
834     */
835    if (jcr->NumReadVolumes > 1 && jcr->CurReadVolume < jcr->NumReadVolumes) {
836       dev->close();
837       if (!acquire_device_for_read(dcr)) {
838          Jmsg2(jcr, M_FATAL, 0, _("Cannot open Dev=%s, Vol=%s\n"), dev->print_name(),
839                dcr->VolumeName);
840          return false;
841       }
842       return true;                    /* next volume mounted */
843    }
844    Dmsg0(90, "End of Device reached.\n");
845    return false;
846 }