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