3 * dev.c -- low level operations on device (storage device)
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).
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.
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.
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).
32 Copyright (C) 2000-2005 Kern Sibbald
34 This program is free software; you can redistribute it and/or
35 modify it under the terms of the GNU General Public License
36 version 2 as ammended with additional clauses defined in the
37 file LICENSE in the main source directory.
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
42 the file LICENSE for additional details.
47 * Handling I/O errors and end of tape conditions are a bit tricky.
48 * This is how it is currently done when writting.
49 * On either an I/O error or end of tape,
50 * we will stop writing on the physical device (no I/O recovery is
51 * attempted at least in this daemon). The state flag will be sent
52 * to include ST_EOT, which is ephimeral, and ST_WEOT, which is
53 * persistent. Lots of routines clear ST_EOT, but ST_WEOT is
54 * cleared only when the problem goes away. Now when ST_WEOT
55 * is set all calls to write_block_to_device() call the fix_up
56 * routine. In addition, all threads are blocked
57 * from writing on the tape by calling lock_dev(), and thread other
58 * than the first thread to hit the EOT will block on a condition
59 * variable. The first thread to hit the EOT will continue to
60 * be able to read and write the tape (he sort of tunnels through
61 * the locking mechanism -- see lock_dev() for details).
63 * Now presumably somewhere higher in the chain of command
64 * (device.c), someone will notice the EOT condition and
65 * get a new tape up, get the tape label read, and mark
66 * the label for rewriting. Then this higher level routine
67 * will write the unwritten buffer to the new volume.
68 * Finally, he will release
69 * any blocked threads by doing a broadcast on the condition
70 * variable. At that point, we should be totally back in
71 * business with no lost data.
82 /* Functions in dvd.c */
83 void update_free_space_dev(DEVICE* dev);
86 /* Forward referenced functions */
87 void set_os_device_parameters(DEVICE *dev);
88 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat);
89 static void open_tape_device(DCR *dcr, int mode);
90 static void open_file_device(DCR *dcr, int mode);
91 static void open_dvd_device(DCR *dcr, int mode);
92 static char *mode_to_str(int mode);
95 * Allocate and initialize the DEVICE structure
96 * Note, if dev is non-NULL, it is already allocated,
97 * thus we neither allocate it nor free it. This allows
98 * the caller to put the packet in shared memory.
100 * Note, for a tape, the device->device_name is the device name
101 * (e.g. /dev/nst0), and for a file, the device name
102 * is the directory in which the file will be placed.
106 init_dev(JCR *jcr, DEVRES *device)
114 /* Check that device is available */
115 if (stat(device->device_name, &statp) < 0) {
117 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"),
118 device->device_name, be.strerror());
125 if (S_ISDIR(statp.st_mode)) {
127 } else if (S_ISCHR(statp.st_mode)) {
129 } else if (S_ISFIFO(statp.st_mode)) {
131 } else if (!(device->cap_bits & CAP_REQMOUNT)) {
132 Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory\n"
133 " or have RequiresMount=yes for DVD. st_mode=%x\n"),
134 device->device_name, statp.st_mode);
138 dev = (DEVICE *)get_memory(sizeof(DEVICE));
139 memset(dev, 0, sizeof(DEVICE));
140 dev->state = ST_MALLOC;
142 /* Copy user supplied device parameters from Resource */
143 dev->dev_name = get_memory(strlen(device->device_name)+1);
144 pm_strcpy(dev->dev_name, device->device_name);
145 dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
146 /* We edit "Resource-name" (physical-name) */
147 Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
148 dev->capabilities = device->cap_bits;
149 dev->min_block_size = device->min_block_size;
150 dev->max_block_size = device->max_block_size;
151 dev->max_volume_size = device->max_volume_size;
152 dev->max_file_size = device->max_file_size;
153 dev->volume_capacity = device->volume_capacity;
154 dev->max_rewind_wait = device->max_rewind_wait;
155 dev->max_open_wait = device->max_open_wait;
156 dev->max_open_vols = device->max_open_vols;
157 dev->vol_poll_interval = device->vol_poll_interval;
158 dev->max_spool_size = device->max_spool_size;
159 dev->drive_index = device->drive_index;
160 dev->autoselect = device->autoselect;
161 if (tape) { /* No parts on tapes */
162 dev->max_part_size = 0;
165 dev->max_part_size = device->max_part_size;
168 if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
169 dev->vol_poll_interval = 60;
171 dev->device = device;
174 dev->state |= ST_TAPE;
176 dev->state |= ST_FIFO;
177 dev->capabilities |= CAP_STREAM; /* set stream device */
179 dev->state |= ST_FILE;
182 /* If the device requires mount :
183 * - Check that the mount point is available
184 * - Check that (un)mount commands are defined
186 if (dev->is_file() && dev->requires_mount()) {
187 if (stat(device->mount_point, &statp) < 0) {
189 dev->dev_errno = errno;
190 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat mount point %s: ERR=%s\n"),
191 device->mount_point, be.strerror());
194 if (!device->mount_command || !device->unmount_command) {
195 Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n"));
197 if (!device->write_part_command) {
198 Jmsg0(jcr, M_ERROR_TERM, 0, _("Write part command must be defined for a device which requires mount.\n"));
200 dev->state |= ST_DVD;
203 if (dev->max_block_size > 1000000) {
204 Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
205 dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
206 dev->max_block_size = 0;
208 if (dev->max_block_size % TAPE_BSIZE != 0) {
209 Jmsg2(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size.\n"),
210 dev->max_block_size, dev->print_name());
213 dev->errmsg = get_pool_memory(PM_EMSG);
216 if ((errstat = pthread_mutex_init(&dev->mutex, NULL)) != 0) {
218 dev->dev_errno = errstat;
219 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
220 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
222 if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
224 dev->dev_errno = errstat;
225 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
226 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
228 if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
230 dev->dev_errno = errstat;
231 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
232 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
234 if ((errstat = pthread_mutex_init(&dev->spool_mutex, NULL)) != 0) {
236 dev->dev_errno = errstat;
237 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
238 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
240 if ((errstat = rwl_init(&dev->lock)) != 0) {
242 dev->dev_errno = errstat;
243 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
244 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
248 dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
249 Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
255 * Open the device with the operating system and
256 * initialize buffer pointers.
258 * Returns: -1 on error
261 * Note, for a tape, the VolName is the name we give to the
262 * volume (not really used here), but for a file, the
263 * VolName represents the name of the file to be created/opened.
264 * In the case of a file, the full name is the device name
265 * (archive_name) with the VolName concatenated.
268 DEVICE::open(DCR *dcr, int mode)
271 if (openmode == mode) {
274 ::close(fd); /* use system close so correct mode will be used on open */
277 bstrncpy(VolCatInfo.VolCatName, dcr->VolumeName, sizeof(VolCatInfo.VolCatName));
279 Dmsg4(29, "open dev: tape=%d dev_name=%s vol=%s mode=%s\n", is_tape(),
280 dev_name, VolCatInfo.VolCatName, mode_to_str(mode));
281 state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
282 label_type = B_BACULA_LABEL;
283 if (is_tape() || is_fifo()) {
284 open_tape_device(dcr, mode);
285 } else if (is_dvd()) {
286 Dmsg1(100, "call open_dvd_device mode=%s\n", mode_to_str(mode));
287 open_dvd_device(dcr, mode);
289 Dmsg1(100, "call open_file_device mode=%d\n", mode_to_str(mode));
290 open_file_device(dcr, mode);
295 void DEVICE::set_mode(int new_mode)
298 case CREATE_READ_WRITE:
299 mode = O_CREAT | O_RDWR | O_BINARY;
301 case OPEN_READ_WRITE:
302 if (is_dvd() || is_file()) {
303 mode = O_CREAT | O_RDWR | O_BINARY;
305 mode = O_RDWR | O_BINARY;
309 mode = O_RDONLY | O_BINARY;
311 case OPEN_WRITE_ONLY:
312 mode = O_WRONLY | O_BINARY;
315 Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
319 static void open_tape_device(DCR *dcr, int mode)
321 DEVICE *dev = dcr->dev;
322 int nonblocking = 0;;
326 Dmsg0(29, "open dev: device is tape\n");
329 timeout = dev->max_open_wait;
331 if (dev->open_nowait) {
332 /* Set wait counters to zero for no wait */
333 timeout = ioerrcnt = 0;
334 /* Open drive in non-block mode */
335 nonblocking = O_NONBLOCK;
337 if (dev->is_fifo() && timeout) {
339 dev->tid = start_thread_timer(pthread_self(), timeout);
341 /* If busy retry each second for max_open_wait seconds */
343 Dmsg1(500, "Try open %s\n", dev->dev_name);
344 while ((dev->fd = open(dev->dev_name, dev->mode, MODE_RW+nonblocking)) < 0) {
346 Dmsg2(500, "Open error errno=%d ERR=%s\n", errno, be.strerror());
347 if (errno == EINTR || errno == EAGAIN) {
348 Dmsg0(500, "Continue open\n");
351 /* Busy wait for specified time (default = 5 mins) */
352 if (errno == EBUSY && timeout-- > 0) {
353 Dmsg2(100, "Device %s busy. ERR=%s\n", dev->print_name(), be.strerror());
357 /* IO error (no volume) try 10 times every 6 seconds */
358 if (errno == EIO && ioerrcnt-- > 0) {
360 Dmsg0(500, "Continue open\n");
363 dev->dev_errno = errno;
364 Mmsg2(dev->errmsg, _("Unable to open device %s: ERR=%s\n"),
365 dev->print_name(), be.strerror(dev->dev_errno));
366 /* Stop any open timer we set */
368 stop_thread_timer(dev->tid);
371 Emsg0(M_FATAL, 0, dev->errmsg);
375 /* If opened in non-block mode, close it an open it normally */
381 dev->openmode = mode; /* save open mode */
383 dev->state |= ST_OPENED;
385 update_pos_dev(dev); /* update position */
386 set_os_device_parameters(dev); /* do system dependent stuff */
387 Dmsg0(500, "Open OK\n");
389 /* Stop any open() timer we started */
391 stop_thread_timer(dev->tid);
394 Dmsg1(29, "open dev: tape %d opened\n", dev->fd);
400 static void open_file_device(DCR *dcr, int mode)
402 DEVICE *dev = dcr->dev;
403 POOL_MEM archive_name(PM_FNAME);
406 * Handle opening of File Archive (not a tape)
408 Dmsg3(29, "Enter: open_file_dev: %s dev=%s mode=%s\n", dev->is_dvd()?"DVD":"disk",
409 archive_name.c_str(), mode_to_str(mode));
411 if (dev->VolCatInfo.VolCatName[0] == 0) {
412 Mmsg(dev->errmsg, _("Could not open file device %s. No Volume name given.\n"),
418 pm_strcpy(archive_name, dev->dev_name);
419 if (archive_name.c_str()[strlen(archive_name.c_str())-1] != '/') {
420 pm_strcat(archive_name, "/");
422 pm_strcat(archive_name, dev->VolCatInfo.VolCatName);
424 Dmsg3(29, "open dev: %s dev=%s mode=%s\n", dev->is_dvd()?"DVD":"disk",
425 archive_name.c_str(), mode_to_str(mode));
426 dev->openmode = mode;
429 /* If creating file, give 0640 permissions */
430 Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode, archive_name.c_str(),
431 mode_to_str(dev->mode));
432 if ((dev->fd = open(archive_name.c_str(), dev->mode, 0640)) < 0) {
434 dev->dev_errno = errno;
435 Mmsg2(dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
437 Dmsg1(29, "open failed: %s", dev->errmsg);
438 Emsg0(M_FATAL, 0, dev->errmsg);
441 dev->state |= ST_OPENED;
443 update_pos_dev(dev); /* update position */
445 Dmsg5(29, "open dev: %s fd=%d opened, part=%d/%d, part_size=%u\n",
446 dev->is_dvd()?"DVD":"disk", dev->fd, dev->part, dev->num_parts,
451 * Open a DVD device. N.B. at this point, dcr->VolCatInfo.VolCatName
452 * has the desired Volume name, but there is NO assurance that
453 * any other field of VolCatInfo is correct.
455 static void open_dvd_device(DCR *dcr, int mode)
457 DEVICE *dev = dcr->dev;
458 POOL_MEM archive_name(PM_FNAME);
459 struct stat filestat;
462 * Handle opening of DVD Volume
464 Dmsg3(29, "Enter: open_dvd_dev: %s dev=%s mode=%s\n", dev->is_dvd()?"DVD":"disk",
465 archive_name.c_str(), mode_to_str(mode));
467 if (dev->VolCatInfo.VolCatName[0] == 0) {
468 Mmsg(dev->errmsg, _("Could not open file device %s. No Volume name given.\n"),
474 if (dev->part == 0) {
480 if (mount_dev(dev, 1) < 0) {
481 Mmsg(dev->errmsg, _("Could not mount device %s.\n"),
483 Emsg0(M_FATAL, 0, dev->errmsg);
488 Dmsg3(29, "open dev: %s dev=%s mode=%s\n", dev->is_dvd()?"DVD":"disk",
489 archive_name.c_str(), mode_to_str(mode));
490 dev->openmode = mode;
493 * If we are not trying to access the last part, set mode to
494 * OPEN_READ_ONLY as writing would be an error.
496 if (dev->part < dev->num_parts) {
497 mode = OPEN_READ_ONLY;
502 * If we are opening it read-only, it is *probably* on the
503 * DVD, so try the DVD first, otherwise look in the spool dir.
505 if (mode == OPEN_READ_ONLY) {
506 make_mounted_dvd_filename(dev, archive_name);
508 make_spooled_dvd_filename(dev, archive_name);
511 /* If creating file, give 0640 permissions */
512 Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(mode),
513 archive_name.c_str(), dev->mode);
514 if ((dev->fd = open(archive_name.c_str(), dev->mode, 0640)) < 0) {
516 dev->dev_errno = errno;
517 Mmsg2(dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
519 Dmsg1(29, "open failed: %s", dev->errmsg);
520 if (mode == OPEN_READ_ONLY) {
521 make_spooled_dvd_filename(dev, archive_name);
522 dev->fd = open(archive_name.c_str(), dev->mode, 0640); /* try on spool */
526 /* Get size of file */
527 if (fstat(dev->fd, &filestat) < 0) {
529 dev->dev_errno = errno;
530 Mmsg2(dev->errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(),
532 Dmsg1(29, "open failed: %s", dev->errmsg);
536 dev->part_size = filestat.st_size;
538 dev->state |= ST_OPENED;
540 update_pos_dev(dev); /* update position */
543 Dmsg4(29, "open dev: DVD fd=%d opened, part=%d/%d, part_size=%u\n",
544 dev->fd, dev->part, dev->num_parts, dev->part_size);
545 if (dev->is_open() && dev->is_dvd() && (mode != OPEN_READ_ONLY) &&
546 (dev->free_space_errno == 0 || dev->num_parts == dev->part)) {
547 update_free_space_dev(dev);
554 bool _rewind_dev(char *file, int line, DEVICE *dev)
556 Dmsg2(100, "rewind_dev called from %s:%d\n", file, line);
557 return rewind_dev(dev);
563 * Returns: true on success
566 bool rewind_dev(DEVICE *dev)
571 Dmsg1(29, "rewind_dev %s\n", dev->print_name());
573 dev->dev_errno = EBADF;
574 Mmsg1(dev->errmsg, _("Bad call to rewind_dev. Device %s not open\n"),
576 Emsg0(M_ABORT, 0, dev->errmsg);
579 dev->state &= ~(ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
580 dev->block_num = dev->file = 0;
583 if (dev->is_tape()) {
584 mt_com.mt_op = MTREW;
586 /* If we get an I/O error on rewind, it is probably because
587 * the drive is actually busy. We loop for (about 5 minutes)
588 * retrying every 5 seconds.
590 for (i=dev->max_rewind_wait; ; i -= 5) {
591 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
593 clrerror_dev(dev, MTREW);
594 if (i == dev->max_rewind_wait) {
595 Dmsg1(200, "Rewind error, %s. retrying ...\n", be.strerror());
597 if (dev->dev_errno == EIO && i > 0) {
598 Dmsg0(200, "Sleeping 5 seconds.\n");
602 Mmsg2(dev->errmsg, _("Rewind error on %s. ERR=%s.\n"),
603 dev->print_name(), be.strerror());
608 } else if (dev->is_file()) {
609 if (lseek_dev(dev, (off_t)0, SEEK_SET) < 0) {
611 dev->dev_errno = errno;
612 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
613 dev->print_name(), be.strerror());
620 void DEVICE::block(int why)
623 block_device(this, why);
627 void DEVICE::unblock()
630 unblock_device(this);
635 * Called to indicate that we have just read an
636 * EOF from the device.
638 void DEVICE::set_ateof()
648 * Called to indicate we are now at the end of the tape, and
649 * writing is not possible.
651 void DEVICE::set_ateot()
653 /* Make tape effectively read-only */
654 state |= (ST_EOF|ST_EOT|ST_WEOT);
659 * Position device to end of medium (end of data)
660 * Returns: true on succes
667 struct mtget mt_stat;
672 dev->dev_errno = EBADF;
673 Mmsg1(dev->errmsg, _("Bad call to eod_dev. Device %s not open\n"),
678 #if defined (__digital__) && defined (__unix__)
679 return fsf_dev(dev, dev->VolCatInfo.VolCatFiles);
682 Dmsg0(29, "eod_dev\n");
686 dev->state &= ~(ST_EOF); /* remove EOF flags */
687 dev->block_num = dev->file = 0;
690 if (dev->state & (ST_FIFO | ST_PROG)) {
693 if (!dev->is_tape()) {
694 pos = lseek_dev(dev, (off_t)0, SEEK_END);
695 // Dmsg1(100, "====== Seek to %lld\n", pos);
698 dev->state |= ST_EOT;
701 dev->dev_errno = errno;
703 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
704 dev->print_name(), be.strerror());
708 if (dev_cap(dev, CAP_FASTFSF) && !dev_cap(dev, CAP_EOM)) {
709 Dmsg0(100,"Using FAST FSF for EOM\n");
710 /* If unknown position, rewind */
711 if (!dev_get_os_pos(dev, &mt_stat)) {
712 if (!rewind_dev(dev)) {
716 mt_com.mt_op = MTFSF;
718 * ***FIXME*** fix code to handle case that INT16_MAX is
721 mt_com.mt_count = INT16_MAX; /* use big positive number */
722 if (mt_com.mt_count < 0) {
723 mt_com.mt_count = INT16_MAX; /* brain damaged system */
727 if (dev_cap(dev, CAP_MTIOCGET) && (dev_cap(dev, CAP_FASTFSF) || dev_cap(dev, CAP_EOM))) {
728 if (dev_cap(dev, CAP_EOM)) {
729 Dmsg0(100,"Using EOM for EOM\n");
730 mt_com.mt_op = MTEOM;
734 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
736 clrerror_dev(dev, mt_com.mt_op);
737 Dmsg1(50, "ioctl error: %s\n", be.strerror());
739 Mmsg2(dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
740 dev->print_name(), be.strerror());
744 if (!dev_get_os_pos(dev, &mt_stat)) {
746 clrerror_dev(dev, -1);
747 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
748 dev->print_name(), be.strerror());
751 Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
753 dev->file = mt_stat.mt_fileno;
759 * Rewind then use FSF until EOT reached
761 if (!rewind_dev(dev)) {
765 * Move file by file to the end of the tape
768 for (file_num=dev->file; !dev->at_eot(); file_num++) {
769 Dmsg0(200, "eod_dev: doing fsf 1\n");
770 if (!fsf_dev(dev, 1)) {
771 Dmsg0(200, "fsf_dev error.\n");
775 * Avoid infinite loop. ***FIXME*** possibly add code
776 * to set EOD or to turn off CAP_FASTFSF if on.
778 if (file_num == (int)dev->file) {
779 struct mtget mt_stat;
780 Dmsg1(100, "fsf_dev did not advance from file %d\n", file_num);
781 if (dev_get_os_pos(dev, &mt_stat)) {
782 Dmsg2(100, "Adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
784 dev->file = mt_stat.mt_fileno;
791 * Some drivers leave us after second EOF when doing
792 * MTEOM, so we must backup so that appending overwrites
795 if (dev_cap(dev, CAP_BSFATEOM)) {
796 struct mtget mt_stat;
797 /* Backup over EOF */
798 ok = bsf_dev(dev, 1);
799 /* If BSF worked and fileno is known (not -1), set file */
800 if (dev_get_os_pos(dev, &mt_stat)) {
801 Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
802 dev->file = mt_stat.mt_fileno;
804 dev->file++; /* wing it -- not correct on all OSes */
807 update_pos_dev(dev); /* update position */
809 Dmsg1(200, "EOD dev->file=%d\n", dev->file);
814 * Set the position of the device -- only for files
815 * For other devices, there is no generic way to do it.
816 * Returns: true on succes
819 bool update_pos_dev(DEVICE *dev)
825 dev->dev_errno = EBADF;
826 Mmsg0(dev->errmsg, _("Bad device call. Device not open\n"));
827 Emsg0(M_FATAL, 0, dev->errmsg);
831 /* Find out where we are */
832 if (dev->is_file()) {
835 pos = lseek_dev(dev, (off_t)0, SEEK_CUR);
838 dev->dev_errno = errno;
839 Pmsg1(000, "Seek error: ERR=%s\n", be.strerror());
840 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
841 dev->print_name(), be.strerror());
844 dev->file_addr = pos;
852 * Return the status of the device. This was meant
853 * to be a generic routine. Unfortunately, it doesn't
854 * seem possible (at least I do not know how to do it
855 * currently), which means that for the moment, this
856 * routine has very little value.
860 uint32_t status_dev(DEVICE *dev)
862 struct mtget mt_stat;
865 if (dev->state & (ST_EOT | ST_WEOT)) {
869 if (dev->state & ST_EOF) {
873 if (dev->is_tape()) {
875 Pmsg0(-20," Bacula status:");
876 Pmsg2(-20," file=%d block=%d\n", dev->file, dev->block_num);
877 if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
879 dev->dev_errno = errno;
880 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
881 dev->print_name(), be.strerror());
884 Pmsg0(-20, " Device status:");
886 #if defined(HAVE_LINUX_OS)
887 if (GMT_EOF(mt_stat.mt_gstat)) {
891 if (GMT_BOT(mt_stat.mt_gstat)) {
895 if (GMT_EOT(mt_stat.mt_gstat)) {
899 if (GMT_SM(mt_stat.mt_gstat)) {
903 if (GMT_EOD(mt_stat.mt_gstat)) {
907 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
909 Pmsg0(-20, " WR_PROT");
911 if (GMT_ONLINE(mt_stat.mt_gstat)) {
913 Pmsg0(-20, " ONLINE");
915 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
917 Pmsg0(-20, " DR_OPEN");
919 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
920 stat |= BMT_IM_REP_EN;
921 Pmsg0(-20, " IM_REP_EN");
923 #endif /* !SunOS && !OSF */
924 if (dev_cap(dev, CAP_MTIOCGET)) {
925 Pmsg2(-20, " file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
927 Pmsg2(-20, " file=%d block=%d\n", -1, -1);
930 stat |= BMT_ONLINE | BMT_BOT;
937 * Load medium in device
938 * Returns: true on success
941 bool load_dev(DEVICE *dev)
948 dev->dev_errno = EBADF;
949 Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
950 Emsg0(M_FATAL, 0, dev->errmsg);
953 if (!(dev->is_tape())) {
957 Dmsg0(200, "stored: MTLOAD command not available\n");
959 dev->dev_errno = ENOTTY; /* function not available */
960 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
961 dev->print_name(), be.strerror());
965 dev->block_num = dev->file = 0;
968 mt_com.mt_op = MTLOAD;
970 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
972 dev->dev_errno = errno;
973 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
974 dev->print_name(), be.strerror());
982 * Rewind device and put it offline
983 * Returns: true on success
986 bool offline_dev(DEVICE *dev)
991 dev->dev_errno = EBADF;
992 Mmsg0(dev->errmsg, _("Bad call to offline_dev. Device not open\n"));
993 Emsg0(M_FATAL, 0, dev->errmsg);
996 if (!(dev->is_tape())) {
1000 dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
1001 dev->block_num = dev->file = 0;
1006 mt_com.mt_op = MTUNLOCK;
1007 mt_com.mt_count = 1;
1008 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1010 mt_com.mt_op = MTOFFL;
1011 mt_com.mt_count = 1;
1012 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1014 dev->dev_errno = errno;
1015 Mmsg2(dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1016 dev->print_name(), be.strerror());
1019 Dmsg1(100, "Offlined device %s\n", dev->print_name());
1023 bool offline_or_rewind_dev(DEVICE *dev)
1028 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
1029 return offline_dev(dev);
1032 * Note, this rewind probably should not be here (it wasn't
1033 * in prior versions of Bacula), but on FreeBSD, this is
1034 * needed in the case the tape was "frozen" due to an error
1035 * such as backspacing after writing and EOF. If it is not
1036 * done, all future references to the drive get and I/O error.
1038 clrerror_dev(dev, MTREW);
1039 return rewind_dev(dev);
1044 * Foward space a file
1045 * Returns: true on success
1049 fsf_dev(DEVICE *dev, int num)
1051 struct mtget mt_stat;
1056 dev->dev_errno = EBADF;
1057 Mmsg0(dev->errmsg, _("Bad call to fsf_dev. Device not open\n"));
1058 Emsg0(M_FATAL, 0, dev->errmsg);
1062 if (!dev->is_tape()) {
1065 if (dev->state & ST_EOT) {
1067 Mmsg1(dev->errmsg, _("Device %s at End of Tape.\n"), dev->print_name());
1070 if (dev->state & ST_EOF) {
1071 Dmsg0(200, "ST_EOF set on entry to FSF\n");
1074 Dmsg0(100, "fsf_dev\n");
1077 * If Fast forward space file is set, then we
1078 * use MTFSF to forward space and MTIOCGET
1079 * to get the file position. We assume that
1080 * the SCSI driver will ensure that we do not
1081 * forward space past the end of the medium.
1083 if (dev_cap(dev, CAP_FSF) && dev_cap(dev, CAP_MTIOCGET) && dev_cap(dev, CAP_FASTFSF)) {
1084 mt_com.mt_op = MTFSF;
1085 mt_com.mt_count = num;
1086 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1087 if (stat < 0 || !dev_get_os_pos(dev, &mt_stat)) {
1089 dev->state |= ST_EOT;
1090 Dmsg0(200, "Set ST_EOT\n");
1091 clrerror_dev(dev, MTFSF);
1092 Mmsg2(dev->errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1093 dev->print_name(), be.strerror());
1094 Dmsg1(200, "%s", dev->errmsg);
1097 Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1099 dev->file = mt_stat.mt_fileno;
1103 * Here if CAP_FSF is set, and virtually all drives
1104 * these days support it, we read a record, then forward
1105 * space one file. Using this procedure, which is slow,
1106 * is the only way we can be sure that we don't read
1107 * two consecutive EOF marks, which means End of Data.
1109 } else if (dev_cap(dev, CAP_FSF)) {
1112 Dmsg0(200, "FSF has cap_fsf\n");
1113 if (dev->max_block_size == 0) {
1114 rbuf_len = DEFAULT_BLOCK_SIZE;
1116 rbuf_len = dev->max_block_size;
1118 rbuf = get_memory(rbuf_len);
1119 mt_com.mt_op = MTFSF;
1120 mt_com.mt_count = 1;
1121 while (num-- && !(dev->state & ST_EOT)) {
1122 Dmsg0(100, "Doing read before fsf\n");
1123 if ((stat = read(dev->fd, (char *)rbuf, rbuf_len)) < 0) {
1124 if (errno == ENOMEM) { /* tape record exceeds buf len */
1125 stat = rbuf_len; /* This is OK */
1128 dev->state |= ST_EOT;
1129 clrerror_dev(dev, -1);
1130 Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev->dev_errno,
1132 Mmsg2(dev->errmsg, _("read error on %s. ERR=%s.\n"),
1133 dev->print_name(), be.strerror());
1134 Dmsg1(100, "%s", dev->errmsg);
1138 if (stat == 0) { /* EOF */
1139 update_pos_dev(dev);
1140 Dmsg1(100, "End of File mark from read. File=%d\n", dev->file+1);
1141 /* Two reads of zero means end of tape */
1142 if (dev->state & ST_EOF) {
1143 dev->state |= ST_EOT;
1144 Dmsg0(100, "Set ST_EOT\n");
1150 } else { /* Got data */
1151 dev->state &= ~(ST_EOF|ST_EOT);
1154 Dmsg0(100, "Doing MTFSF\n");
1155 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1156 if (stat < 0) { /* error => EOT */
1158 dev->state |= ST_EOT;
1159 Dmsg0(100, "Set ST_EOT\n");
1160 clrerror_dev(dev, MTFSF);
1161 Mmsg2(dev->errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1162 dev->print_name(), be.strerror());
1163 Dmsg0(100, "Got < 0 for MTFSF\n");
1164 Dmsg1(100, "%s", dev->errmsg);
1172 * No FSF, so use FSR to simulate it
1175 Dmsg0(200, "Doing FSR for FSF\n");
1176 while (num-- && !(dev->state & ST_EOT)) {
1177 dev->fsr(INT32_MAX); /* returns -1 on EOF or EOT */
1179 if (dev->state & ST_EOT) {
1181 Mmsg1(dev->errmsg, _("Device %s at End of Tape.\n"), dev->print_name());
1187 update_pos_dev(dev);
1188 Dmsg1(200, "Return %d from FSF\n", stat);
1189 if (dev->state & ST_EOF)
1190 Dmsg0(200, "ST_EOF set on exit FSF\n");
1191 if (dev->state & ST_EOT)
1192 Dmsg0(200, "ST_EOT set on exit FSF\n");
1193 Dmsg1(200, "Return from FSF file=%d\n", dev->file);
1198 * Backward space a file
1199 * Returns: false on failure
1203 bsf_dev(DEVICE *dev, int num)
1209 dev->dev_errno = EBADF;
1210 Mmsg0(dev->errmsg, _("Bad call to bsf_dev. Device not open\n"));
1211 Emsg0(M_FATAL, 0, dev->errmsg);
1215 if (!dev->is_tape()) {
1216 Mmsg1(dev->errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1220 Dmsg0(29, "bsf_dev\n");
1221 dev->state &= ~(ST_EOT|ST_EOF);
1225 mt_com.mt_op = MTBSF;
1226 mt_com.mt_count = num;
1227 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1230 clrerror_dev(dev, MTBSF);
1231 Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1232 dev->print_name(), be.strerror());
1234 update_pos_dev(dev);
1240 * Foward space num records
1241 * Returns: false on failure
1244 bool DEVICE::fsr(int num)
1251 Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1252 Emsg0(M_FATAL, 0, errmsg);
1259 if (!dev_cap(this, CAP_FSR)) {
1260 Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1264 Dmsg1(29, "fsr %d\n", num);
1265 mt_com.mt_op = MTFSR;
1266 mt_com.mt_count = num;
1267 stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1273 struct mtget mt_stat;
1274 clrerror_dev(this, MTFSR);
1275 Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1276 if (dev_get_os_pos(this, &mt_stat)) {
1277 Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1278 block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1279 file = mt_stat.mt_fileno;
1280 block_num = mt_stat.mt_blkno;
1288 Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1289 num, print_name(), be.strerror());
1291 update_pos_dev(this);
1296 * Backward space a record
1297 * Returns: false on failure
1301 bsr_dev(DEVICE *dev, int num)
1307 dev->dev_errno = EBADF;
1308 Mmsg0(dev->errmsg, _("Bad call to bsr_dev. Device not open\n"));
1309 Emsg0(M_FATAL, 0, dev->errmsg);
1313 if (!dev->is_tape()) {
1317 if (!dev_cap(dev, CAP_BSR)) {
1318 Mmsg1(dev->errmsg, _("ioctl MTBSR not permitted on %s.\n"), dev->print_name());
1322 Dmsg0(29, "bsr_dev\n");
1323 dev->block_num -= num;
1324 dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
1325 mt_com.mt_op = MTBSR;
1326 mt_com.mt_count = num;
1327 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1330 clrerror_dev(dev, MTBSR);
1331 Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1332 dev->print_name(), be.strerror());
1334 update_pos_dev(dev);
1339 * Reposition the device to file, block
1340 * Returns: false on failure
1344 reposition_dev(DEVICE *dev, uint32_t file, uint32_t block)
1347 dev->dev_errno = EBADF;
1348 Mmsg0(dev->errmsg, _("Bad call to reposition_dev. Device not open\n"));
1349 Emsg0(M_FATAL, 0, dev->errmsg);
1353 if (!dev->is_tape()) {
1354 off_t pos = (((off_t)file)<<32) + block;
1355 Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
1356 if (lseek_dev(dev, pos, SEEK_SET) == (off_t)-1) {
1358 dev->dev_errno = errno;
1359 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
1360 dev->print_name(), be.strerror());
1364 dev->block_num = block;
1365 dev->file_addr = pos;
1368 Dmsg4(100, "reposition_dev from %u:%u to %u:%u\n",
1369 dev->file, dev->block_num, file, block);
1370 if (file < dev->file) {
1371 Dmsg0(100, "Rewind_dev\n");
1372 if (!rewind_dev(dev)) {
1376 if (file > dev->file) {
1377 Dmsg1(100, "fsf %d\n", file-dev->file);
1378 if (!fsf_dev(dev, file-dev->file)) {
1379 Dmsg1(100, "fsf failed! ERR=%s\n", strerror_dev(dev));
1382 Dmsg2(100, "wanted_file=%d at_file=%d\n", file, dev->file);
1384 if (block < dev->block_num) {
1385 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1386 Dmsg0(100, "bsf_dev 1\n");
1388 Dmsg0(100, "fsf_dev 1\n");
1390 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1392 if (dev_cap(dev, CAP_POSITIONBLOCKS) && block > dev->block_num) {
1393 /* Ignore errors as Bacula can read to the correct block */
1394 Dmsg1(100, "fsr %d\n", block-dev->block_num);
1395 return dev->fsr(block-dev->block_num);
1403 * Write an end of file on the device
1404 * Returns: 0 on success
1405 * non-zero on failure
1408 weof_dev(DEVICE *dev, int num)
1412 Dmsg0(29, "weof_dev\n");
1415 dev->dev_errno = EBADF;
1416 Mmsg0(dev->errmsg, _("Bad call to weof_dev. Device not open\n"));
1417 Emsg0(M_FATAL, 0, dev->errmsg);
1422 if (!dev->is_tape()) {
1425 if (!dev->can_append()) {
1426 Mmsg0(dev->errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1427 Emsg0(M_FATAL, 0, dev->errmsg);
1431 dev->state &= ~(ST_EOT | ST_EOF); /* remove EOF/EOT flags */
1432 mt_com.mt_op = MTWEOF;
1433 mt_com.mt_count = num;
1434 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1441 clrerror_dev(dev, MTWEOF);
1443 Mmsg2(dev->errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1444 dev->print_name(), be.strerror());
1451 * Return string message with last error in English
1452 * Be careful not to call this routine from within dev.c
1453 * while editing an Mmsg() or you will end up in a recursive
1454 * loop creating a Segmentation Violation.
1457 strerror_dev(DEVICE *dev)
1464 * If implemented in system, clear the tape
1468 clrerror_dev(DEVICE *dev, int func)
1470 const char *msg = NULL;
1471 struct mtget mt_stat;
1474 dev->dev_errno = errno; /* save errno */
1476 dev->VolCatInfo.VolCatErrors++;
1479 if (!dev->is_tape()) {
1482 if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1485 Emsg0(M_ABORT, 0, "Got ENOTTY on read/write!\n");
1489 dev->capabilities &= ~CAP_EOF; /* turn off feature */
1494 dev->capabilities &= ~CAP_EOM; /* turn off feature */
1499 dev->capabilities &= ~CAP_FSF; /* turn off feature */
1503 dev->capabilities &= ~CAP_BSF; /* turn off feature */
1507 dev->capabilities &= ~CAP_FSR; /* turn off feature */
1511 dev->capabilities &= ~CAP_BSR; /* turn off feature */
1532 bsnprintf(buf, sizeof(buf), "unknown func code %d", func);
1537 dev->dev_errno = ENOSYS;
1538 Mmsg1(dev->errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1539 Emsg0(M_ERROR, 0, dev->errmsg);
1542 /* On some systems such as NetBSD, this clears all errors */
1543 ioctl(dev->fd, MTIOCGET, (char *)&mt_stat);
1545 /* Found on Linux */
1549 mt_com.mt_op = MTIOCLRERR;
1550 mt_com.mt_count = 1;
1551 /* Clear any error condition on the tape */
1552 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1553 Dmsg0(200, "Did MTIOCLRERR\n");
1557 /* Typically on FreeBSD */
1560 /* Read and clear SCSI error status */
1561 union mterrstat mt_errstat;
1562 Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev->dev_errno,
1563 strerror(dev->dev_errno));
1564 ioctl(dev->fd, MTIOCERRSTAT, (char *)&mt_errstat);
1568 /* Clear Subsystem Exception OSF1 */
1572 mt_com.mt_op = MTCSE;
1573 mt_com.mt_count = 1;
1574 /* Clear any error condition on the tape */
1575 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1576 Dmsg0(200, "Did MTCSE\n");
1582 * Flush buffer contents
1585 int flush_dev(DEVICE *dev)
1590 static void do_close(DEVICE *dev)
1593 Dmsg1(29, "really close_dev %s\n", dev->print_name());
1598 if (unmount_dev(dev, 1) < 0) {
1599 Dmsg1(0, "Cannot unmount device %s.\n", dev->print_name());
1602 /* Remove the last part file if it is empty */
1603 if (dev->can_append() && (dev->num_parts > 0)) {
1605 POOL_MEM archive_name(PM_FNAME);
1606 dev->part = dev->num_parts;
1607 Dmsg1(100, "Call make_dvd_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
1608 make_spooled_dvd_filename(dev, archive_name);
1609 /* Check that the part file is empty */
1610 if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
1611 Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
1612 unlink(archive_name.c_str());
1616 /* Clean up device packet so it can be reused */
1618 dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1619 dev->label_type = B_BACULA_LABEL;
1620 dev->file = dev->block_num = 0;
1625 dev->part_start = 0;
1626 dev->EndFile = dev->EndBlock = 0;
1627 memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
1628 memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
1630 stop_thread_timer(dev->tid);
1640 void DEVICE::close()
1642 /*if (fd >= 0 && use_count == 1) {*/
1643 /* No need to check if fd >= 0: it is checked again
1644 * in do_close, and do_close MUST be called for volumes
1645 * splitted in parts, even if fd == -1. */
1646 if (use_count == 1) {
1648 } else if (use_count > 0) {
1653 ASSERT(use_count >= 0);
1658 bool truncate_dev(DEVICE *dev)
1660 Dmsg1(100, "truncate_dev %s\n", dev->print_name());
1661 if (dev->is_tape()) {
1662 return true; /* we don't really truncate tapes */
1663 /* maybe we should rewind and write and eof ???? */
1666 if (dev->is_dvd()) {
1667 Mmsg1(dev->errmsg, _("Truncate DVD %s not supported.\n"), dev->print_name());
1668 return false; /* we cannot truncate DVDs */
1671 if (ftruncate(dev->fd, 0) != 0) {
1673 Mmsg2(dev->errmsg, _("Unable to truncate device %s. ERR=%s\n"),
1674 dev->print_name(), be.strerror());
1680 /* Return the resource name for the device */
1681 const char *DEVICE::name() const
1683 return device->hdr.name;
1687 dev_vol_name(DEVICE *dev)
1689 return dev->VolCatInfo.VolCatName;
1692 uint32_t dev_block(DEVICE *dev)
1694 update_pos_dev(dev);
1695 return dev->block_num;
1698 uint32_t dev_file(DEVICE *dev)
1700 update_pos_dev(dev);
1705 * Free memory allocated for the device
1708 term_dev(DEVICE *dev)
1711 dev->dev_errno = EBADF;
1712 Mmsg0(dev->errmsg, _("Bad call to term_dev. Device not open\n"));
1713 Emsg0(M_FATAL, 0, dev->errmsg);
1716 Dmsg1(29, "term_dev: %s\n", dev->print_name());
1718 if (dev->dev_name) {
1719 free_memory(dev->dev_name);
1720 dev->dev_name = NULL;
1722 if (dev->prt_name) {
1723 free_memory(dev->prt_name);
1724 dev->prt_name = NULL;
1727 free_pool_memory(dev->errmsg);
1730 pthread_mutex_destroy(&dev->mutex);
1731 pthread_cond_destroy(&dev->wait);
1732 pthread_cond_destroy(&dev->wait_next_vol);
1733 pthread_mutex_destroy(&dev->spool_mutex);
1734 rwl_destroy(&dev->lock);
1735 if (dev->attached_dcrs) {
1736 delete dev->attached_dcrs;
1737 dev->attached_dcrs = NULL;
1739 if (dev->state & ST_MALLOC) {
1740 free_pool_memory((POOLMEM *)dev);
1745 * This routine initializes the device wait timers
1747 void init_device_wait_timers(DCR *dcr)
1749 DEVICE *dev = dcr->dev;
1750 JCR *jcr = dcr->jcr;
1752 /* ******FIXME******* put these on config variables */
1753 dev->min_wait = 60 * 60;
1754 dev->max_wait = 24 * 60 * 60;
1755 dev->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1756 dev->wait_sec = dev->min_wait;
1757 dev->rem_wait_sec = dev->wait_sec;
1760 dev->BadVolName[0] = 0;
1762 jcr->min_wait = 60 * 60;
1763 jcr->max_wait = 24 * 60 * 60;
1764 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1765 jcr->wait_sec = jcr->min_wait;
1766 jcr->rem_wait_sec = jcr->wait_sec;
1771 void init_jcr_device_wait_timers(JCR *jcr)
1773 /* ******FIXME******* put these on config variables */
1774 jcr->min_wait = 60 * 60;
1775 jcr->max_wait = 24 * 60 * 60;
1776 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1777 jcr->wait_sec = jcr->min_wait;
1778 jcr->rem_wait_sec = jcr->wait_sec;
1784 * The dev timers are used for waiting on a particular device
1786 * Returns: true if time doubled
1787 * false if max time expired
1789 bool double_dev_wait_time(DEVICE *dev)
1791 dev->wait_sec *= 2; /* double wait time */
1792 if (dev->wait_sec > dev->max_wait) { /* but not longer than maxtime */
1793 dev->wait_sec = dev->max_wait;
1796 dev->rem_wait_sec = dev->wait_sec;
1797 if (dev->num_wait >= dev->max_num_wait) {
1804 void set_os_device_parameters(DEVICE *dev)
1806 #ifdef HAVE_LINUX_OS
1808 if (dev->min_block_size == dev->max_block_size &&
1809 dev->min_block_size == 0) { /* variable block mode */
1810 mt_com.mt_op = MTSETBLK;
1811 mt_com.mt_count = 0;
1812 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1813 clrerror_dev(dev, MTSETBLK);
1815 mt_com.mt_op = MTSETDRVBUFFER;
1816 mt_com.mt_count = MT_ST_CLEARBOOLEANS;
1817 if (!dev_cap(dev, CAP_TWOEOF)) {
1818 mt_com.mt_count |= MT_ST_TWO_FM;
1820 if (dev_cap(dev, CAP_EOM)) {
1821 mt_com.mt_count |= MT_ST_FAST_MTEOM;
1823 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1824 clrerror_dev(dev, MTSETBLK);
1830 #ifdef HAVE_NETBSD_OS
1832 if (dev->min_block_size == dev->max_block_size &&
1833 dev->min_block_size == 0) { /* variable block mode */
1834 mt_com.mt_op = MTSETBSIZ;
1835 mt_com.mt_count = 0;
1836 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1837 clrerror_dev(dev, MTSETBSIZ);
1839 /* Get notified at logical end of tape */
1840 mt_com.mt_op = MTEWARN;
1841 mt_com.mt_count = 1;
1842 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1843 clrerror_dev(dev, MTEWARN);
1849 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
1851 if (dev->min_block_size == dev->max_block_size &&
1852 dev->min_block_size == 0) { /* variable block mode */
1853 mt_com.mt_op = MTSETBSIZ;
1854 mt_com.mt_count = 0;
1855 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1856 clrerror_dev(dev, MTSETBSIZ);
1864 if (dev->min_block_size == dev->max_block_size &&
1865 dev->min_block_size == 0) { /* variable block mode */
1866 mt_com.mt_op = MTSRSZ;
1867 mt_com.mt_count = 0;
1868 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1869 clrerror_dev(dev, MTSRSZ);
1876 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
1878 return dev_cap(dev, CAP_MTIOCGET) &&
1879 ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
1880 mt_stat->mt_fileno >= 0;
1883 static char *modes[] = {
1884 "CREATE_READ_WRITE",
1891 static char *mode_to_str(int mode)
1893 return modes[mode-1];