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