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