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