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