]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/dev.c
SQLite performance + misc -- see kes20Jul02
[bacula/bacula] / bacula / src / stored / dev.c
1 /*
2  *
3  *   dev.c  -- low level operations on device (storage device)
4  *
5  *              Kern Sibbald
6  *
7  *     NOTE!!!! None of these routines are reentrant. You must
8  *        use lock_device() and unlock_device() at a higher level,
9  *        or use the xxx_device() equivalents.  By moving the
10  *        thread synchronization to a higher level, we permit
11  *        the higher level routines to "seize" the device and 
12  *        to carry out operations without worrying about who
13  *        set what lock (i.e. race conditions).
14  *
15  *     Note, this is the device dependent code, and my have
16  *           to be modified for each system, but is meant to
17  *           be as "generic" as possible.
18  * 
19  *     The purpose of this code is to develop a SIMPLE Storage
20  *     daemon. More complicated coding (double buffering, writer
21  *     thread, ...) is left for a later version.
22  *
23  *     Unfortunately, I have had to add more and more complication
24  *     to this code. This was not foreseen as noted above, and as
25  *     a consequence has lead to something more contorted than is
26  *     really necessary -- KES.  Note, this contortion has been
27  *     corrected to a large extent by a rewrite (Apr MMI).
28  *
29  *   Version $Id$
30  */
31 /*
32    Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
33
34    This program is free software; you can redistribute it and/or
35    modify it under the terms of the GNU General Public License as
36    published by the Free Software Foundation; either version 2 of
37    the License, or (at your option) any later version.
38
39    This program is distributed in the hope that it will be useful,
40    but WITHOUT ANY WARRANTY; without even the implied warranty of
41    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
42    General Public License for more details.
43
44    You should have received a copy of the GNU General Public
45    License along with this program; if not, write to the Free
46    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
47    MA 02111-1307, USA.
48
49  */
50
51 /*
52  * Handling I/O errors and end of tape conditions are a bit tricky.
53  * This is how it is currently done when writting.
54  * On either an I/O error or end of tape,
55  * we will stop writing on the physical device (no I/O recovery is
56  * attempted at least in this daemon). The state flag will be sent
57  * to include ST_EOT, which is ephimeral, and ST_WEOT, which is
58  * persistent. Lots of routines clear ST_EOT, but ST_WEOT is
59  * cleared only when the problem goes away.  Now when ST_WEOT
60  * is set all calls to write_dev() are handled as usual. However,
61  * in write_block() instead of attempting to write the block to
62  * the physical device, it is chained into a list of blocks written
63  * after the EOT condition.  In addition, all threads are blocked
64  * from writing on the tape by calling lock(), and thread other
65  * than the first thread to hit the EOT will block on a condition
66  * variable. The first thread to hit the EOT will continue to
67  * be able to read and write the tape (he sort of tunnels through
68  * the locking mechanism -- see lock() for details).
69  *
70  * Now presumably somewhere higher in the chain of command 
71  * (device.c), someone will notice the EOT condition and 
72  * get a new tape up, get the tape label read, and mark 
73  * the label for rewriting. Then this higher level routine 
74  * will write the unwritten buffer to the new volume.
75  * Finally, he will release
76  * any blocked threads by doing a broadcast on the condition
77  * variable.  At that point, we should be totally back in 
78  * business with no lost data.
79  */
80
81
82 #include "bacula.h"
83 #include "stored.h"
84
85 /* Forward referenced functions */
86 int dev_is_tape(DEVICE *dev);
87 void clrerror_dev(DEVICE *dev, int func);
88 int fsr_dev(DEVICE *dev, int num);
89
90 extern int debug_level;
91
92 /* 
93  * Allocate and initialize the DEVICE structure
94  * Note, if dev is non-NULL, it is already allocated,
95  * thus we neither allocate it nor free it. This allows
96  * the caller to put the packet in shared memory.
97  *
98  *  Note, for a tape, the dev_name is the device name
99  *     (e.g. /dev/nst0), and for a file, the device name
100  *     is the directory in which the file will be placed.
101  *
102  */
103 DEVICE *
104 init_dev(DEVICE *dev, char *dev_name)
105 {
106    struct stat statp;
107    int tape;
108    int errstat;
109
110    /* Check that device is available */
111    if (stat(dev_name, &statp) < 0) {
112       if (dev) {
113          dev->dev_errno = errno;
114       } 
115       Emsg2(M_FATAL, 0, "Unable to stat device %s : %s\n", dev_name, strerror(errno));
116       return NULL;
117    }
118    tape = FALSE;
119    if (S_ISDIR(statp.st_mode)) {
120       tape = FALSE;
121    } else if (S_ISCHR(statp.st_mode)) {
122       tape = TRUE;
123    } else {
124       if (dev) {
125          dev->dev_errno = ENODEV;
126       }
127       Emsg2(M_FATAL, 0, "%s is an unknown device type. Must be tape or directory. st_mode=%x\n", 
128          dev_name, statp.st_mode);
129       return NULL;
130    }
131    if (!dev) {
132       dev = (DEVICE *)get_memory(sizeof(DEVICE));
133       memset(dev, 0, sizeof(DEVICE));
134       dev->state = ST_MALLOC;
135    } else {
136       memset(dev, 0, sizeof(DEVICE));
137    }
138    if (tape) {
139       dev->state |= ST_TAPE;
140    }
141    dev->dev_name = (char *) get_memory(strlen(dev_name)+1);
142    strcpy(dev->dev_name, dev_name);
143
144    dev->errmsg = (char *) get_pool_memory(PM_EMSG);
145    *dev->errmsg = 0;
146
147    if ((errstat = pthread_mutex_init(&dev->mutex, NULL)) != 0) {
148       dev->dev_errno = errstat;
149       Mmsg1(&dev->errmsg, _("Unable to init mutex: ERR=%s\n"), strerror(errstat));
150       Emsg0(M_FATAL, 0, dev->errmsg);
151    }
152    if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
153       dev->dev_errno = errstat;
154       Mmsg1(&dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), strerror(errstat));
155       Emsg0(M_FATAL, 0, dev->errmsg);
156    }
157    if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
158       dev->dev_errno = errstat;
159       Mmsg1(&dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), strerror(errstat));
160       Emsg0(M_FATAL, 0, dev->errmsg);
161    }
162    dev->fd = -1;
163    Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev_is_tape(dev), dev->dev_name);
164    return dev;
165 }
166
167 /* Open the device with the operating system and
168  * initialize buffer pointers.
169  *
170  * Note, for a tape, the VolName is the name we give to the
171  *    volume (not really used here), but for a file, the
172  *    VolName represents the name of the file to be created/opened.
173  *    In the case of a file, the full name is the device name
174  *    (archive_name) with the VolName concatenated.
175  */
176 int
177 open_dev(DEVICE *dev, char *VolName, int mode)
178 {
179    POOLMEM *archive_name;
180
181    if (dev->state & ST_OPENED) {
182       /*
183        *  *****FIXME***** how to handle two threads wanting
184        *  different volumes mounted???? E.g. one is waiting
185        *  for the next volume to be mounted, and a new job
186        *  starts and snatches up the device.
187        */
188       if (VolName && strcmp(dev->VolCatInfo.VolCatName, VolName) != 0) {
189          return -1;
190       }
191       dev->use_count++;
192       Mmsg2(&dev->errmsg, _("WARNING!!!! device %s opened %d times!!!\n"), 
193             dev->dev_name, dev->use_count);
194       Emsg0(M_WARNING, 0, dev->errmsg);
195       return dev->fd;
196    }
197    if (VolName) {
198       strcpy(dev->VolCatInfo.VolCatName, VolName);
199    }
200
201    Dmsg3(29, "open_dev: tape=%d dev_name=%s vol=%s\n", dev_is_tape(dev), 
202          dev->dev_name, dev->VolCatInfo.VolCatName);
203    dev->state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
204    if (dev->state & ST_TAPE) {
205       int timeout;
206       Dmsg0(29, "open_dev: device is tape\n");
207       if (mode == READ_WRITE) {
208          dev->mode = O_RDWR | O_BINARY;
209       } else {
210          dev->mode = O_RDONLY | O_BINARY;
211       }
212       timeout = dev->max_open_wait;
213       errno = 0;
214       while ((dev->fd = open(dev->dev_name, dev->mode, MODE_RW)) < 0) {
215          if (errno == EBUSY && timeout-- > 0) {
216             Dmsg2(100, "Device %s busy. ERR=%s\n", dev->dev_name, strerror(errno));
217             sleep(1);
218             continue;
219          }
220          dev->dev_errno = errno;
221          Mmsg2(&dev->errmsg, _("stored: unable to open device %s: ERR=%s\n"), 
222                dev->dev_name, strerror(dev->dev_errno));
223          Emsg0(M_FATAL, 0, dev->errmsg);
224          break;
225       }
226       if (dev->fd >= 0) {
227          dev->dev_errno = 0;
228          dev->state |= ST_OPENED;
229          dev->use_count++;
230          update_pos_dev(dev);             /* update position */
231       }
232       Dmsg1(29, "open_dev: tape %d opened\n", dev->fd);
233    } else {
234       /*
235        * Handle opening of file
236        */
237       archive_name = get_pool_memory(PM_FNAME);
238       strcpy(archive_name, dev->dev_name);
239       if (archive_name[strlen(archive_name)] != '/') {
240          strcat(archive_name, "/");
241       }
242       strcat(archive_name, VolName);
243       Dmsg1(29, "open_dev: device is disk %s\n", archive_name);
244       if (mode == READ_WRITE) {
245          dev->mode = O_CREAT | O_RDWR | O_BINARY;
246       } else {
247          dev->mode = O_RDONLY | O_BINARY;
248       }
249       if ((dev->fd = open(archive_name, dev->mode, MODE_RW)) < 0) {
250          dev->dev_errno = errno;
251          Mmsg2(&dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name, strerror(dev->dev_errno));
252          Emsg0(M_FATAL, 0, dev->errmsg);
253       } else {
254          dev->dev_errno = 0;
255          dev->state |= ST_OPENED;
256          dev->use_count++;
257          update_pos_dev(dev);                /* update position */
258       }
259       Dmsg1(29, "open_dev: disk fd=%d opened\n", dev->fd);
260       free_pool_memory(archive_name);
261    }
262    return dev->fd;
263 }
264
265 /*
266  * Rewind the device.
267  *  Returns: 1 on success
268  *           0 on failure
269  */
270 int rewind_dev(DEVICE *dev)
271 {
272    struct mtop mt_com;
273    unsigned int i;
274
275    Dmsg0(29, "rewind_dev\n");
276    if (dev->fd < 0) {
277       dev->dev_errno = EBADF;
278       Mmsg1(&dev->errmsg, _("Bad call to rewind_dev. Device %s not open\n"),
279             dev->dev_name);
280       Emsg0(M_FATAL, 0, dev->errmsg);
281       return 0;
282    }
283    dev->state &= ~(ST_APPEND|ST_READ|ST_EOT | ST_EOF | ST_WEOT);  /* remove EOF/EOT flags */
284    dev->block_num = dev->file = 0;
285    dev->file_bytes = 0;
286    if (dev->state & ST_TAPE) {
287       mt_com.mt_op = MTREW;
288       mt_com.mt_count = 1;
289       /* If we get an I/O error on rewind, it is probably because
290        * the drive is actually busy. We loop for (about 5 minutes)
291        * retrying every 5 seconds.
292        */
293       for (i=dev->max_rewind_wait; ; i -= 5) {
294          if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
295             if (i == dev->max_rewind_wait) {
296                Dmsg1(200, "Rewind error, %s. retrying ...\n", strerror(errno));
297             }
298             clrerror_dev(dev, MTREW);
299             if (dev->dev_errno == EIO && i > 0) {
300                Dmsg0(200, "Sleeping 5 seconds.\n");
301                sleep(5);
302                continue;
303             }
304             Mmsg2(&dev->errmsg, _("Rewind error on %s. ERR=%s.\n"),
305                dev->dev_name, strerror(dev->dev_errno));
306             return 0;
307          }
308          break;
309       }
310    } else {
311       if (lseek(dev->fd, 0, SEEK_SET) < 0) {
312          dev->dev_errno = errno;
313          Mmsg2(&dev->errmsg, _("lseek error on %s. ERR=%s.\n"),
314             dev->dev_name, strerror(dev->dev_errno));
315          return 0;
316       }
317    }
318    return 1;
319 }
320
321 /* 
322  * Position device to end of medium (end of data)
323  *  Returns: 1 on succes
324  *           0 on error
325  */
326 int 
327 eod_dev(DEVICE *dev)
328 {
329    struct mtop mt_com;
330    struct mtget mt_stat;
331    int stat = 0;
332    int32_t pos;
333
334    Dmsg0(29, "eod_dev\n");
335    if (dev->state & ST_EOT) {
336       return 1;
337    }
338    dev->state &= ~(ST_EOF);  /* remove EOF flags */
339    dev->block_num = dev->file = 0;
340    dev->file_bytes = 0;
341    if (!(dev->state & ST_TAPE)) {
342       pos = lseek(dev->fd, 0, SEEK_END);
343       if (pos > 0) {
344          update_pos_dev(dev);
345          dev->state |= ST_EOT;
346          return 1;
347       }
348       return 0;
349    }
350    if (dev->capabilities & CAP_EOM) {
351       mt_com.mt_op = MTEOM;
352       mt_com.mt_count = 1;
353       if ((stat=ioctl(dev->fd, MTIOCTOP, (char *)&mt_com)) < 0) {
354          Dmsg1(50, "ioctl error: %s\n", strerror(dev->dev_errno));
355          clrerror_dev(dev, mt_com.mt_op);
356          update_pos_dev(dev);
357          Mmsg2(&dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
358             dev->dev_name, strerror(dev->dev_errno));
359          return 0;
360       }
361       if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
362          dev->dev_errno = errno;
363          Mmsg2(&dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
364             dev->dev_name, strerror(dev->dev_errno));
365          return 0;
366       }
367       Dmsg2(200, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
368       dev->file = mt_stat.mt_fileno;
369
370    /*
371     * Rewind then use FSF until EOT reached
372     */
373    } else {
374       if (!rewind_dev(dev)) {
375          return 0;
376       }
377       while (!(dev->state & ST_EOT)) {
378          Dmsg0(200, "Do fsf 1\n");
379          if (fsf_dev(dev, 1) < 0) {
380             Dmsg0(200, "fsf_dev return < 0\n");
381             return 0;
382          }
383       }
384    }
385    update_pos_dev(dev);                      /* update position */
386    Dmsg1(200, "EOD dev->file=%d\n", dev->file);
387    return 1;
388 }
389
390 /*
391  * Set the position of the device.
392  *  Returns: 1 on succes
393  *           0 on error
394  */
395 int update_pos_dev(DEVICE *dev)
396 {
397 #ifdef xxxx
398    struct mtget mt_stat;
399 #endif
400    int32_t pos;
401    int stat = 0;
402
403    if (dev->fd < 0) {
404       dev->dev_errno = EBADF;
405       Mmsg0(&dev->errmsg, _("Bad device call. Archive not open\n"));
406       Emsg0(M_FATAL, 0, dev->errmsg);
407       return 0;
408    }
409
410    /* Find out where we are */
411    if (!(dev->state & ST_TAPE)) {
412       dev->file = 0;
413       dev->file_bytes = 0;
414       pos = lseek(dev->fd, 0, SEEK_CUR);
415       if (pos < 0) {
416          Dmsg1(200, "Seek error: ERR=%s\n", strerror(dev->dev_errno));
417          pos = 0;
418          dev->dev_errno = errno;
419          Mmsg2(&dev->errmsg, _("lseek error on %s. ERR=%s.\n"),
420             dev->dev_name, strerror(dev->dev_errno));
421       } else {
422          stat = 1;
423       }
424       return stat;
425    }
426
427 #ifdef REALLY_IMPLEMENTED
428    if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
429       Dmsg1(50, "MTIOCGET error: %s\n", strerror(dev->dev_errno));
430       dev->dev_errno = errno;
431       Mmsg2(&dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
432          dev->dev_name, strerror(dev->dev_errno));
433    } else {
434       stat = 1;
435    }
436    return stat;
437 #endif
438    return 1;
439 }
440
441
442 /* 
443  * Return the status of the device.  This was meant
444  * to be a generic routine. Unfortunately, it doesn't
445  * seem possible (at least I do not know how to do it
446  * currently), which means that for the moment, this
447  * routine has very little value.
448  *
449  *   Returns: 1 on success
450  *            0 on error
451  */
452 int
453 status_dev(DEVICE *dev, uint32_t *status)
454 {
455    struct mtget mt_stat;
456    uint32_t stat = 0;
457
458    if (dev->state & (ST_EOT | ST_WEOT)) {
459       stat |= MT_EOD;
460       Dmsg0(-20, " EOD");
461    }
462    if (dev->state & ST_EOF) {
463       stat |= MT_EOF;
464       Dmsg0(-20, " EOF");
465    }
466    if (dev->state & ST_TAPE) {
467       stat |= MT_TAPE;
468       Dmsg0(-20," Driver status:");
469       Dmsg2(-20," file=%d block=%d\n", dev->file, dev->block_num);
470       if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
471          dev->dev_errno = errno;
472          Mmsg2(&dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
473             dev->dev_name, strerror(dev->dev_errno));
474          return 0;
475       }
476       Dmsg0(-20, " Device status:");
477
478 #if defined(HAVE_LINUX_OS)
479       if (GMT_EOF(mt_stat.mt_gstat)) {
480          stat |= MT_EOF;
481          Dmsg0(-20, " EOF");
482       }
483       if (GMT_BOT(mt_stat.mt_gstat)) {
484          stat |= MT_BOT;
485          Dmsg0(-20, " BOT");
486       }
487       if (GMT_EOT(mt_stat.mt_gstat)) {
488          stat |= MT_EOT;
489          Dmsg0(-20, " EOT");
490       }
491       if (GMT_SM(mt_stat.mt_gstat)) {
492          stat |= MT_SM;
493          Dmsg0(-20, " SM");
494       }
495       if (GMT_EOD(mt_stat.mt_gstat)) {
496          stat |= MT_EOD;
497          Dmsg0(-20, " EOD");
498       }
499       if (GMT_WR_PROT(mt_stat.mt_gstat)) {
500          stat |= MT_WR_PROT;
501          Dmsg0(-20, " WR_PROT");
502       }
503       if (GMT_ONLINE(mt_stat.mt_gstat)) {
504          stat |= MT_ONLINE;
505          Dmsg0(-20, " ONLINE");
506       }
507       if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
508          stat |= MT_DR_OPEN;
509          Dmsg0(-20, " DR_OPEN");       
510       }
511       if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
512          stat |= MT_IM_REP_EN;
513          Dmsg0(-20, " IM_REP_EN");
514       }
515 #endif /* !SunOS && !OSF */
516       Dmsg2(-20, " file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
517    } else {
518       stat |= MT_ONLINE | MT_BOT;
519    }
520    *status = stat; 
521    return 1;
522 }
523
524
525 /*
526  * Load medium in device
527  *  Returns: 1 on success
528  *           0 on failure
529  */
530 int load_dev(DEVICE *dev)
531 {
532 #ifdef MTLOAD
533    struct mtop mt_com;
534 #endif
535
536    if (dev->fd < 0) {
537       dev->dev_errno = EBADF;
538       Mmsg0(&dev->errmsg, _("Bad call to load_dev. Archive not open\n"));
539       Emsg0(M_FATAL, 0, dev->errmsg);
540       return 0;
541    }
542    if (!(dev->state & ST_TAPE)) {
543       return 1;
544    }
545 #ifndef MTLOAD
546    Dmsg0(200, "stored: MTLOAD command not available\n");
547    dev->dev_errno = ENOTTY;           /* function not available */
548    Mmsg2(&dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
549          dev->dev_name, strerror(dev->dev_errno));      return 0;
550    return 0;
551 #else
552
553    dev->block_num = dev->file = 0;
554    dev->file_bytes = 0;
555    mt_com.mt_op = MTLOAD;
556    mt_com.mt_count = 1;
557    if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
558       dev->dev_errno = errno;
559       Mmsg2(&dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
560          dev->dev_name, strerror(dev->dev_errno));      return 0;
561    }
562    return 1;
563 #endif
564 }
565
566 /*
567  * Rewind device and put it offline
568  *  Returns: 1 on success
569  *           0 on failure
570  */
571 int offline_dev(DEVICE *dev)
572 {
573    struct mtop mt_com;
574
575    if (dev->fd < 0) {
576       dev->dev_errno = EBADF;
577       Mmsg0(&dev->errmsg, _("Bad call to load_dev. Archive not open\n"));
578       Emsg0(M_FATAL, 0, dev->errmsg);
579       return 0;
580    }
581    if (!(dev->state & ST_TAPE)) {
582       return 1;
583    }
584
585    dev->block_num = dev->file = 0;
586    dev->file_bytes = 0;
587 #ifdef MTUNLOCK
588    mt_com.mt_op = MTUNLOCK;
589    mt_com.mt_count = 1;
590    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
591 #endif
592    mt_com.mt_op = MTOFFL;
593    mt_com.mt_count = 1;
594    if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
595       dev->dev_errno = errno;
596       Mmsg2(&dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
597          dev->dev_name, strerror(dev->dev_errno));
598       return 0;
599    }
600    Dmsg1(100, "Offlined device %s\n", dev->dev_name);
601    return 1;
602 }
603
604
605 /* 
606  * Foward space a file  
607  */
608 int
609 fsf_dev(DEVICE *dev, int num)
610
611    struct mtop mt_com;
612    int stat;
613    char rbuf[1024];
614
615    if (dev->fd < 0) {
616       dev->dev_errno = EBADF;
617       Mmsg0(&dev->errmsg, _("Bad call to fsf_dev. Archive not open\n"));
618       Emsg0(M_FATAL, 0, dev->errmsg);
619       return -1;
620    }
621
622    if (!(dev->state & ST_TAPE)) {
623       return 0;
624    }
625    if (dev->state & ST_EOT) {
626       dev->dev_errno = 0;
627       Mmsg1(&dev->errmsg, _("Device %s at End of Tape.\n"), dev->dev_name);
628       return -1;
629    }
630    if (dev->state & ST_EOF)
631       Dmsg0(200, "ST_EOF set on entry to FSF\n");
632    if (dev->state & ST_EOT)
633       Dmsg0(200, "ST_EOT set on entry to FSF\n");
634       
635    Dmsg0(29, "fsf_dev\n");
636    dev->block_num = 0;
637    if (dev->capabilities & CAP_FSF) {
638       Dmsg0(200, "FSF has cap_fsf\n");
639       mt_com.mt_op = MTFSF;
640       mt_com.mt_count = 1;
641       while (num-- && !(dev->state & ST_EOT)) {
642          Dmsg0(200, "Doing read for fsf\n");
643          if ((stat = read(dev->fd, rbuf, sizeof(rbuf))) < 0) {
644             if (errno == ENOMEM) {     /* tape record exceeds buf len */
645                stat = sizeof(rbuf);   /* This is OK */
646             } else {
647                dev->state |= ST_EOT;
648                clrerror_dev(dev, -1);
649                Dmsg1(200, "Set ST_EOT read error %d\n", dev->dev_errno);
650                Mmsg2(&dev->errmsg, _("read error on %s. ERR=%s.\n"),
651                   dev->dev_name, strerror(dev->dev_errno));
652                Dmsg1(200, "%s", dev->errmsg);
653                break;
654             }
655          }
656          if (stat == 0) {                /* EOF */
657             update_pos_dev(dev);
658             Dmsg1(200, "End of File mark from read. File=%d\n", dev->file+1);
659             /* Two reads of zero means end of tape */
660             if (dev->state & ST_EOF) {
661                dev->state |= ST_EOT;
662                Dmsg0(200, "Set ST_EOT\n");
663                break;
664             } else {
665                dev->state |= ST_EOF;
666                dev->file++;
667                dev->file_bytes = 0;
668                continue;
669             }
670          } else {                        /* Got data */
671             dev->state &= ~(ST_EOF|ST_EOT);
672          }
673
674          Dmsg0(200, "Doing MT_FSF\n");
675          stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
676          if (stat < 0) {                 /* error => EOT */
677             dev->state |= ST_EOT;
678             Dmsg0(200, "Set ST_EOT\n");
679             clrerror_dev(dev, MTFSF);
680             Mmsg2(&dev->errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
681                dev->dev_name, strerror(dev->dev_errno));
682             Dmsg0(200, "Got < 0 for MT_FSF\n");
683             Dmsg1(200, "%s", dev->errmsg);
684          } else {
685             dev->state |= ST_EOF;     /* just read EOF */
686             dev->file++;
687             dev->file_bytes = 0;
688          }   
689       }
690    
691    /*
692     * No FSF, so use FSR to simulate it
693     */
694    } else {
695       Dmsg0(200, "Doing FSR for FSF\n");
696       while (num-- && !(dev->state & ST_EOT)) {
697          fsr_dev(dev, INT32_MAX);    /* returns -1 on EOF or EOT */
698       }
699       if (dev->state & ST_EOT) {
700          dev->dev_errno = 0;
701          Mmsg1(&dev->errmsg, _("Device %s at End of Tape.\n"), dev->dev_name);
702          stat = -1;
703       } else {
704          stat = 0;
705       }
706    }
707    update_pos_dev(dev);
708    Dmsg1(200, "Return %d from FSF\n", stat);
709    if (dev->state & ST_EOF)
710       Dmsg0(200, "ST_EOF set on exit FSF\n");
711    if (dev->state & ST_EOT)
712       Dmsg0(200, "ST_EOT set on exit FSF\n");
713    Dmsg1(200, "Return from FSF file=%d\n", dev->file);
714    return stat;
715 }
716
717 /* 
718  * Backward space a file  
719  */
720 int
721 bsf_dev(DEVICE *dev, int num)
722
723    struct mtop mt_com;
724    int stat;
725
726    if (dev->fd < 0) {
727       dev->dev_errno = EBADF;
728       Mmsg0(&dev->errmsg, _("Bad call to fsf_dev. Archive not open\n"));
729       Emsg0(M_FATAL, 0, dev->errmsg);
730       return -1;
731    }
732
733    if (!(dev->state & ST_TAPE)) {
734       return 0;
735    }
736    Dmsg0(29, "bsf_dev\n");
737    dev->state &= ~(ST_EOT|ST_EOF);
738    dev->file -= num;
739    dev->file_bytes = 0;
740    mt_com.mt_op = MTBSF;
741    mt_com.mt_count = num;
742    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
743    if (stat < 0) {
744       clrerror_dev(dev, MTBSF);
745       Mmsg2(&dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
746          dev->dev_name, strerror(dev->dev_errno));
747    }
748    update_pos_dev(dev);
749    return stat;
750 }
751
752
753 /* 
754  * Foward space a record
755  */
756 int
757 fsr_dev(DEVICE *dev, int num)
758
759    struct mtop mt_com;
760    int stat;
761
762    if (dev->fd < 0) {
763       dev->dev_errno = EBADF;
764       Mmsg0(&dev->errmsg, _("Bad call to fsf_dev. Archive not open\n"));
765       Emsg0(M_FATAL, 0, dev->errmsg);
766       return -1;
767    }
768
769    if (!(dev->state & ST_TAPE)) {
770       return 0;
771    }
772    Dmsg0(29, "fsr_dev\n");
773    dev->block_num += num;
774    mt_com.mt_op = MTFSR;
775    mt_com.mt_count = num;
776    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
777    if (stat == 0) {
778       dev->state &= ~ST_EOF;
779    } else {
780       if (dev->state & ST_EOF) {
781          dev->state |= ST_EOT;
782       } else {
783          dev->state |= ST_EOF;           /* assume EOF */
784          dev->file++;
785          dev->file_bytes = 0;
786       }
787       clrerror_dev(dev, MTFSR);
788       Mmsg2(&dev->errmsg, _("ioctl MTFSR error on %s. ERR=%s.\n"),
789          dev->dev_name, strerror(dev->dev_errno));
790    }
791    update_pos_dev(dev);
792    return stat;
793 }
794
795 /* 
796  * Backward space a record
797  */
798 int
799 bsr_dev(DEVICE *dev, int num)
800
801    struct mtop mt_com;
802    int stat;
803
804    if (dev->fd < 0) {
805       dev->dev_errno = EBADF;
806       Mmsg0(&dev->errmsg, _("Bad call to fsf_dev. Archive not open\n"));
807       Emsg0(M_FATAL, 0, dev->errmsg);
808       return -1;
809    }
810
811    if (!(dev->state & ST_TAPE)) {
812       return 0;
813    }
814    Dmsg0(29, "bsr_dev\n");
815    dev->block_num -= num;
816    dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
817    mt_com.mt_op = MTBSR;
818    mt_com.mt_count = num;
819    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
820    if (stat < 0) {
821       clrerror_dev(dev, MTBSR);
822       Mmsg2(&dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
823          dev->dev_name, strerror(dev->dev_errno));
824    }
825    update_pos_dev(dev);
826    return stat;
827 }
828
829
830
831 /*
832  * Write an end of file on the device
833  */
834 int 
835 weof_dev(DEVICE *dev, int num)
836
837    struct mtop mt_com;
838    int stat;
839
840    if (dev->fd < 0) {
841       dev->dev_errno = EBADF;
842       Mmsg0(&dev->errmsg, _("Bad call to fsf_dev. Archive not open\n"));
843       Emsg0(M_FATAL, 0, dev->errmsg);
844       return -1;
845    }
846
847    if (!(dev->state & ST_TAPE)) {
848       return 0;
849    }
850    dev->state &= ~(ST_EOT | ST_EOF);  /* remove EOF/EOT flags */
851    dev->block_num = 0;
852    Dmsg0(29, "weof_dev\n");
853    mt_com.mt_op = MTWEOF;
854    mt_com.mt_count = num;
855    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
856    if (stat == 0) {
857       dev->file++;
858       dev->file_bytes = 0;
859    } else {
860       clrerror_dev(dev, MTWEOF);
861       Mmsg2(&dev->errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
862          dev->dev_name, strerror(dev->dev_errno));
863    }
864    return stat;
865 }
866
867 /*
868  * Return string message with last error in English
869  *  Be careful not to call this routine from within dev.c
870  *  while editing an Mmsg(&) or you will end up in a recursive
871  *  loop creating a Segmentation Violation.
872  */
873 char *
874 strerror_dev(DEVICE *dev)
875 {
876    return dev->errmsg;
877 }
878
879
880 /*
881  * If implemented in system, clear the tape
882  * error status.
883  */
884 void
885 clrerror_dev(DEVICE *dev, int func)
886 {
887    char *msg = NULL;
888
889    dev->dev_errno = errno;         /* save errno */
890    if (errno == EIO) {
891       dev->VolCatInfo.VolCatErrors++;
892    }
893
894    if (!(dev->state & ST_TAPE)) {
895       return;
896    }
897    if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
898       switch (func) {
899          case -1:
900             Emsg0(M_ABORT, 0, "Got ENOTTY on read/write!\n");
901             break;
902          case MTWEOF:
903             msg = "WTWEOF";
904             dev->capabilities &= ~CAP_EOF; /* turn off feature */
905             break;
906          case MTEOM:
907             msg = "WTEOM";
908             dev->capabilities &= ~CAP_EOM; /* turn off feature */
909             break;
910          case MTFSF:
911             msg = "MTFSF";
912             dev->capabilities &= ~CAP_FSF; /* turn off feature */
913             break;
914          case MTBSF:
915             msg = "MTBSF";
916             dev->capabilities &= ~CAP_BSF; /* turn off feature */
917             break;
918          case MTFSR:
919             msg = "MTFSR";
920             dev->capabilities &= ~CAP_FSR; /* turn off feature */
921             break;
922          case MTBSR:
923             msg = "MTBSR";
924             dev->capabilities &= ~CAP_BSR; /* turn off feature */
925             break;
926          default:
927             msg = "Unknown";
928             break;
929       }
930       if (msg != NULL) {
931          dev->dev_errno = ENOSYS;
932          Mmsg1(&dev->errmsg, _("This device does not support %s.\n"), msg);
933          Emsg0(M_ERROR, 0, dev->errmsg);
934       }
935    }
936 #ifdef MTIOCLRERR
937 {
938    struct mtop mt_com;
939    int stat;
940    mt_com.mt_op = MTIOCLRERR;
941    mt_com.mt_count = 1;
942    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
943    Dmsg0(200, "Did MTIOCLRERR\n");
944 }
945 #endif
946 }
947
948 /*
949  * Flush buffer contents
950  *  No longer used.
951  */
952 int flush_dev(DEVICE *dev)
953 {
954    return 1;
955 }
956
957 static void do_close(DEVICE *dev)
958 {
959
960    Dmsg0(29, "really close_dev\n");
961    close(dev->fd);
962    /* Clean up device packet so it can be reused */
963    dev->fd = -1;
964    dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
965    dev->block_num = 0;
966    dev->file = 0;
967    dev->file_bytes = 0;
968    dev->LastBlockNumWritten = 0;
969    memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
970    memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
971    dev->use_count--;
972 }
973
974 /* 
975  * Close the device
976  */
977 void
978 close_dev(DEVICE *dev)
979 {
980    if (!dev) {
981       Mmsg0(&dev->errmsg, _("Bad call to fsf_dev. Archive not open\n"));
982       Emsg0(M_FATAL, 0, dev->errmsg);
983       return;
984    }
985    if (dev->fd >= 0 && dev->use_count == 1) {
986       do_close(dev);
987    } else {    
988       Dmsg0(29, "close_dev but in use so leave open.\n");
989       dev->use_count--;
990    }
991 }
992
993 /*
994  * Used when unmounting the device
995  */
996 void force_close_dev(DEVICE *dev)
997 {
998    if (!dev) {
999       Mmsg0(&dev->errmsg, _("Bad call to fsf_dev. Archive not open\n"));
1000       Emsg0(M_FATAL, 0, dev->errmsg);
1001       return;
1002    }
1003    Dmsg0(29, "really close_dev\n");
1004    do_close(dev);
1005 }
1006
1007 int truncate_dev(DEVICE *dev)
1008 {
1009    if (dev->state & ST_TAPE) {
1010       return 1;
1011    }
1012    if (ftruncate(dev->fd, 0) != 0) {
1013       Mmsg1(&dev->errmsg, _("Unable to truncate device. ERR=%s\n"), strerror(errno));
1014       return 0;
1015    }
1016    return 1;
1017 }
1018
1019 int 
1020 dev_is_tape(DEVICE *dev)
1021 {  
1022    return (dev->state & ST_TAPE) ? 1 : 0;
1023 }
1024
1025 char *
1026 dev_name(DEVICE *dev)
1027 {
1028    return dev->dev_name;
1029 }
1030
1031 char *
1032 dev_vol_name(DEVICE *dev)
1033 {
1034    return dev->VolCatInfo.VolCatName;
1035 }
1036
1037 uint32_t dev_block(DEVICE *dev)
1038 {
1039    update_pos_dev(dev);
1040    return dev->block_num;
1041 }
1042
1043 uint32_t dev_file(DEVICE *dev)
1044 {
1045    update_pos_dev(dev);
1046    return dev->file;
1047 }
1048
1049 /* 
1050  * Free memory allocated for the device
1051  */
1052 void
1053 term_dev(DEVICE *dev)
1054 {
1055    if (!dev) {
1056       dev->dev_errno = EBADF;
1057       Mmsg0(&dev->errmsg, _("Bad call to fsf_dev. Archive not open\n"));
1058       Emsg0(M_FATAL, 0, dev->errmsg);
1059       return;
1060    }
1061    close_dev(dev);
1062    Dmsg0(29, "term_dev\n");
1063    if (dev->dev_name) {
1064       free_memory(dev->dev_name);
1065       dev->dev_name = NULL;
1066    }
1067    if (dev->errmsg) {
1068       free_pool_memory(dev->errmsg);
1069       dev->errmsg = NULL;
1070    }
1071    pthread_mutex_destroy(&dev->mutex);
1072    pthread_cond_destroy(&dev->wait);
1073    pthread_cond_destroy(&dev->wait_next_vol);
1074    if (dev->state & ST_MALLOC) {
1075       free_pool_memory((POOLMEM *)dev);
1076    }
1077 }