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 amended 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 char *mode_to_str(int mode);
92 * Allocate and initialize the DEVICE structure
93 * Note, if dev is non-NULL, it is already allocated,
94 * thus we neither allocate it nor free it. This allows
95 * the caller to put the packet in shared memory.
97 * Note, for a tape, the device->device_name is the device name
98 * (e.g. /dev/nst0), and for a file, the device name
99 * is the directory in which the file will be placed.
103 init_dev(JCR *jcr, DEVRES *device)
111 /* Check that device is available */
112 if (stat(device->device_name, &statp) < 0) {
114 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"),
115 device->device_name, be.strerror());
122 if (S_ISDIR(statp.st_mode)) {
124 } else if (S_ISCHR(statp.st_mode)) {
126 } else if (S_ISFIFO(statp.st_mode)) {
128 } else if (!(device->cap_bits & CAP_REQMOUNT)) {
129 Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory\n"
130 " or have RequiresMount=yes for DVD. st_mode=%x\n"),
131 device->device_name, statp.st_mode);
135 dev = (DEVICE *)get_memory(sizeof(DEVICE));
136 memset(dev, 0, sizeof(DEVICE));
137 dev->state = ST_MALLOC;
139 /* Copy user supplied device parameters from Resource */
140 dev->dev_name = get_memory(strlen(device->device_name)+1);
141 pm_strcpy(dev->dev_name, device->device_name);
142 dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
143 /* We edit "Resource-name" (physical-name) */
144 Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
145 dev->capabilities = device->cap_bits;
146 dev->min_block_size = device->min_block_size;
147 dev->max_block_size = device->max_block_size;
148 dev->max_volume_size = device->max_volume_size;
149 dev->max_file_size = device->max_file_size;
150 dev->volume_capacity = device->volume_capacity;
151 dev->max_rewind_wait = device->max_rewind_wait;
152 dev->max_open_wait = device->max_open_wait;
153 dev->max_open_vols = device->max_open_vols;
154 dev->vol_poll_interval = device->vol_poll_interval;
155 dev->max_spool_size = device->max_spool_size;
156 dev->drive_index = device->drive_index;
157 dev->autoselect = device->autoselect;
158 if (tape) { /* No parts on tapes */
159 dev->max_part_size = 0;
162 dev->max_part_size = device->max_part_size;
165 if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
166 dev->vol_poll_interval = 60;
168 dev->device = device;
171 dev->state |= ST_TAPE;
173 dev->state |= ST_FIFO;
174 dev->capabilities |= CAP_STREAM; /* set stream device */
176 dev->state |= ST_FILE;
179 /* If the device requires mount :
180 * - Check that the mount point is available
181 * - Check that (un)mount commands are defined
183 if (dev->is_file() && dev->requires_mount()) {
184 if (stat(device->mount_point, &statp) < 0) {
186 dev->dev_errno = errno;
187 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat mount point %s: ERR=%s\n"),
188 device->mount_point, be.strerror());
191 if (!device->mount_command || !device->unmount_command) {
192 Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n"));
194 if (!device->write_part_command) {
195 Jmsg0(jcr, M_ERROR_TERM, 0, _("Write part command must be defined for a device which requires mount.\n"));
197 dev->state |= ST_DVD;
200 if (dev->max_block_size > 1000000) {
201 Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
202 dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
203 dev->max_block_size = 0;
205 if (dev->max_block_size % TAPE_BSIZE != 0) {
206 Jmsg2(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size.\n"),
207 dev->max_block_size, dev->print_name());
210 dev->errmsg = get_pool_memory(PM_EMSG);
213 if ((errstat = pthread_mutex_init(&dev->mutex, NULL)) != 0) {
215 dev->dev_errno = errstat;
216 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
217 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
219 if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
221 dev->dev_errno = errstat;
222 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
223 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
225 if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
227 dev->dev_errno = errstat;
228 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
229 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
231 if ((errstat = pthread_mutex_init(&dev->spool_mutex, NULL)) != 0) {
233 dev->dev_errno = errstat;
234 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
235 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
237 if ((errstat = rwl_init(&dev->lock)) != 0) {
239 dev->dev_errno = errstat;
240 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
241 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
245 dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
246 Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
252 * Open the device with the operating system and
253 * initialize buffer pointers.
255 * Returns: -1 on error
258 * Note, for a tape, the VolName is the name we give to the
259 * volume (not really used here), but for a file, the
260 * VolName represents the name of the file to be created/opened.
261 * In the case of a file, the full name is the device name
262 * (archive_name) with the VolName concatenated.
265 DEVICE::open(DCR *dcr, int omode)
268 if (openmode == omode) {
271 ::close(fd); /* use system close so correct mode will be used on open */
275 bstrncpy(VolCatInfo.VolCatName, dcr->VolumeName, sizeof(VolCatInfo.VolCatName));
278 Dmsg4(29, "open dev: tape=%d dev_name=%s vol=%s mode=%s\n", is_tape(),
279 dev_name, VolCatInfo.VolCatName, mode_to_str(omode));
280 state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
281 label_type = B_BACULA_LABEL;
282 if (is_tape() || is_fifo()) {
283 open_tape_device(omode);
284 } else if (is_dvd()) {
285 Dmsg1(100, "call open_dvd_device mode=%s\n", mode_to_str(mode));
286 open_dvd_device(dcr, omode);
288 Dmsg1(100, "call open_file_device mode=%d\n", mode_to_str(mode));
289 open_file_device(omode);
294 void DEVICE::set_mode(int new_mode)
297 case CREATE_READ_WRITE:
298 mode = O_CREAT | O_RDWR | O_BINARY;
300 case OPEN_READ_WRITE:
301 if (is_dvd() || is_file()) {
302 mode = O_CREAT | O_RDWR | O_BINARY;
304 mode = O_RDWR | O_BINARY;
308 mode = O_RDONLY | O_BINARY;
310 case OPEN_WRITE_ONLY:
311 mode = O_WRONLY | O_BINARY;
314 Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
318 void DEVICE::open_tape_device(int omode)
320 int nonblocking = 0;;
324 Dmsg0(29, "open dev: device is tape\n");
327 timeout = max_open_wait;
330 /* Set wait counters to zero for no wait */
331 timeout = ioerrcnt = 0;
332 /* Open drive in non-block mode */
333 nonblocking = O_NONBLOCK;
335 if (is_fifo() && timeout) {
337 tid = start_thread_timer(pthread_self(), timeout);
339 /* If busy retry each second for max_open_wait seconds */
341 Dmsg1(500, "Try open %s\n", dev_name);
342 /* Use system open() */
343 while ((fd = ::open(dev_name, mode, MODE_RW+nonblocking)) < 0) {
345 Dmsg2(500, "Open error errno=%d ERR=%s\n", errno, be.strerror());
346 if (errno == EINTR || errno == EAGAIN) {
347 Dmsg0(500, "Continue open\n");
350 /* Busy wait for specified time (default = 5 mins) */
351 if (errno == EBUSY && timeout-- > 0) {
352 Dmsg2(100, "Device %s busy. ERR=%s\n", print_name(), be.strerror());
356 /* IO error (no volume) try 10 times every 6 seconds */
357 if (errno == EIO && ioerrcnt-- > 0) {
359 Dmsg0(500, "Continue open\n");
363 Mmsg2(errmsg, _("Unable to open device %s: ERR=%s\n"),
364 print_name(), be.strerror(dev_errno));
365 /* Stop any open timer we set */
367 stop_thread_timer(tid);
370 Emsg0(M_FATAL, 0, errmsg);
374 /* If opened in non-block mode, close it an open it normally */
377 ::close(fd); /* use system close() */
380 openmode = mode; /* save open mode */
384 update_pos_dev(this); /* update position */
385 set_os_device_parameters(this); /* do system dependent stuff */
386 Dmsg0(500, "Open OK\n");
388 /* Stop any open() timer we started */
390 stop_thread_timer(tid);
393 Dmsg1(29, "open dev: tape %d opened\n", fd);
399 void DEVICE::open_file_device(int omode)
401 POOL_MEM archive_name(PM_FNAME);
404 * Handle opening of File Archive (not a tape)
406 Dmsg3(29, "Enter: open_file_dev: %s dev=%s mode=%s\n", is_dvd()?"DVD":"disk",
407 archive_name.c_str(), mode_to_str(omode));
409 if (VolCatInfo.VolCatName[0] == 0) {
410 Mmsg(errmsg, _("Could not open file device %s. No Volume name given.\n"),
416 pm_strcpy(archive_name, dev_name);
417 if (archive_name.c_str()[strlen(archive_name.c_str())-1] != '/') {
418 pm_strcat(archive_name, "/");
420 pm_strcat(archive_name, VolCatInfo.VolCatName);
422 Dmsg3(29, "open dev: %s dev=%s mode=%s\n", is_dvd()?"DVD":"disk",
423 archive_name.c_str(), mode_to_str(omode));
427 /* If creating file, give 0640 permissions */
428 Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode),
429 archive_name.c_str(), mode);
430 /* Use system open() */
431 if ((fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
434 Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
436 Dmsg1(29, "open failed: %s", errmsg);
437 Emsg0(M_FATAL, 0, errmsg);
442 update_pos_dev(this); /* update position */
444 Dmsg5(29, "open dev: %s fd=%d opened, part=%d/%d, part_size=%u\n",
445 is_dvd()?"DVD":"disk", fd, part, num_parts,
450 * Open a DVD device. N.B. at this point, dcr->VolCatInfo.VolCatName
451 * has the desired Volume name, but there is NO assurance that
452 * any other field of VolCatInfo is correct.
454 void DEVICE::open_dvd_device(DCR *dcr, int omode)
456 POOL_MEM archive_name(PM_FNAME);
457 struct stat filestat;
460 * Handle opening of DVD Volume
462 Dmsg3(29, "Enter: open_dvd_dev: %s dev=%s mode=%s\n", is_dvd()?"DVD":"disk",
463 archive_name.c_str(), mode_to_str(omode));
465 if (VolCatInfo.VolCatName[0] == 0) {
466 Mmsg(errmsg, _("Could not open file device %s. No Volume name given.\n"),
478 if (mount_dev(this, 1) < 0) {
479 Mmsg(errmsg, _("Could not mount device %s.\n"), print_name());
480 Emsg0(M_FATAL, 0, errmsg);
485 Dmsg3(29, "open dev: %s dev=%s mode=%s\n", is_dvd()?"DVD":"disk",
486 archive_name.c_str(), mode_to_str(omode));
490 * If we are not trying to access the last part, set mode to
491 * OPEN_READ_ONLY as writing would be an error.
493 if (part < num_parts) {
494 omode = OPEN_READ_ONLY;
499 * If we are opening it read-only, it is *probably* on the
500 * DVD, so try the DVD first, otherwise look in the spool dir.
502 if (omode == OPEN_READ_ONLY) {
503 make_mounted_dvd_filename(this, archive_name);
505 make_spooled_dvd_filename(this, archive_name);
508 /* If creating file, give 0640 permissions */
509 Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode),
510 archive_name.c_str(), mode);
511 /* Use system open() */
512 if ((fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
515 Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
517 Dmsg1(29, "open failed: %s", errmsg);
518 if (omode == OPEN_READ_ONLY) {
519 make_spooled_dvd_filename(this, archive_name);
520 /* Use system open() */
521 fd = ::open(archive_name.c_str(), mode, 0640); /* try on spool */
525 /* Get size of file */
526 if (fstat(fd, &filestat) < 0) {
529 Mmsg2(errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(),
531 Dmsg1(29, "open failed: %s", errmsg);
532 /* Use system close() */
536 part_size = filestat.st_size;
540 update_pos_dev(this); /* update position */
543 Dmsg4(29, "open dev: DVD fd=%d opened, part=%d/%d, part_size=%u\n",
544 fd, part, num_parts, part_size);
545 if (is_open() && is_dvd() && (omode != OPEN_READ_ONLY) &&
546 (free_space_errno == 0 || num_parts == part)) {
547 update_free_space_dev(this);
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);
634 const char *DEVICE::print_blocked() const
636 switch (dev_blocked) {
637 case BST_NOT_BLOCKED:
638 return "BST_NOT_BLOCKED";
640 return "BST_UNMOUNTED";
641 case BST_WAITING_FOR_SYSOP:
642 return "BST_WAITING_FOR_SYSOP";
643 case BST_DOING_ACQUIRE:
644 return "BST_DOING_ACQUIRE";
645 case BST_WRITING_LABEL:
646 return "BST_WRITING_LABEL";
647 case BST_UNMOUNTED_WAITING_FOR_SYSOP:
648 return "BST_UNMOUNTED_WAITING_FOR_SYSOP";
652 return "unknown blocked code";
657 * Called to indicate that we have just read an
658 * EOF from the device.
660 void DEVICE::set_ateof()
670 * Called to indicate we are now at the end of the tape, and
671 * writing is not possible.
673 void DEVICE::set_ateot()
675 /* Make tape effectively read-only */
676 state |= (ST_EOF|ST_EOT|ST_WEOT);
681 * Position device to end of medium (end of data)
682 * Returns: true on succes
689 struct mtget mt_stat;
694 dev->dev_errno = EBADF;
695 Mmsg1(dev->errmsg, _("Bad call to eod_dev. Device %s not open\n"),
700 #if defined (__digital__) && defined (__unix__)
701 return dev->fsf(dev->VolCatInfo.VolCatFiles);
704 Dmsg0(29, "eod_dev\n");
708 dev->state &= ~(ST_EOF); /* remove EOF flags */
709 dev->block_num = dev->file = 0;
712 if (dev->state & (ST_FIFO | ST_PROG)) {
715 if (!dev->is_tape()) {
716 pos = lseek_dev(dev, (off_t)0, SEEK_END);
717 // Dmsg1(100, "====== Seek to %lld\n", pos);
720 dev->state |= ST_EOT;
723 dev->dev_errno = errno;
725 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
726 dev->print_name(), be.strerror());
730 if (dev_cap(dev, CAP_FASTFSF) && !dev_cap(dev, CAP_EOM)) {
731 Dmsg0(100,"Using FAST FSF for EOM\n");
732 /* If unknown position, rewind */
733 if (!dev_get_os_pos(dev, &mt_stat)) {
734 if (!rewind_dev(dev)) {
738 mt_com.mt_op = MTFSF;
740 * ***FIXME*** fix code to handle case that INT16_MAX is
743 mt_com.mt_count = INT16_MAX; /* use big positive number */
744 if (mt_com.mt_count < 0) {
745 mt_com.mt_count = INT16_MAX; /* brain damaged system */
749 if (dev_cap(dev, CAP_MTIOCGET) && (dev_cap(dev, CAP_FASTFSF) || dev_cap(dev, CAP_EOM))) {
750 if (dev_cap(dev, CAP_EOM)) {
751 Dmsg0(100,"Using EOM for EOM\n");
752 mt_com.mt_op = MTEOM;
756 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
758 clrerror_dev(dev, mt_com.mt_op);
759 Dmsg1(50, "ioctl error: %s\n", be.strerror());
761 Mmsg2(dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
762 dev->print_name(), be.strerror());
766 if (!dev_get_os_pos(dev, &mt_stat)) {
768 clrerror_dev(dev, -1);
769 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
770 dev->print_name(), be.strerror());
773 Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
775 dev->file = mt_stat.mt_fileno;
781 * Rewind then use FSF until EOT reached
783 if (!rewind_dev(dev)) {
787 * Move file by file to the end of the tape
790 for (file_num=dev->file; !dev->at_eot(); file_num++) {
791 Dmsg0(200, "eod_dev: doing fsf 1\n");
793 Dmsg0(200, "fsf error.\n");
797 * Avoid infinite loop. ***FIXME*** possibly add code
798 * to set EOD or to turn off CAP_FASTFSF if on.
800 if (file_num == (int)dev->file) {
801 struct mtget mt_stat;
802 Dmsg1(100, "fsf did not advance from file %d\n", file_num);
803 if (dev_get_os_pos(dev, &mt_stat)) {
804 Dmsg2(100, "Adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
806 dev->file = mt_stat.mt_fileno;
813 * Some drivers leave us after second EOF when doing
814 * MTEOM, so we must backup so that appending overwrites
817 if (dev_cap(dev, CAP_BSFATEOM)) {
818 struct mtget mt_stat;
819 /* Backup over EOF */
820 ok = bsf_dev(dev, 1);
821 /* If BSF worked and fileno is known (not -1), set file */
822 if (dev_get_os_pos(dev, &mt_stat)) {
823 Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
824 dev->file = mt_stat.mt_fileno;
826 dev->file++; /* wing it -- not correct on all OSes */
829 update_pos_dev(dev); /* update position */
831 Dmsg1(200, "EOD dev->file=%d\n", dev->file);
836 * Set the position of the device -- only for files
837 * For other devices, there is no generic way to do it.
838 * Returns: true on succes
841 bool update_pos_dev(DEVICE *dev)
847 dev->dev_errno = EBADF;
848 Mmsg0(dev->errmsg, _("Bad device call. Device not open\n"));
849 Emsg0(M_FATAL, 0, dev->errmsg);
853 /* Find out where we are */
854 if (dev->is_file()) {
857 pos = lseek_dev(dev, (off_t)0, SEEK_CUR);
860 dev->dev_errno = errno;
861 Pmsg1(000, "Seek error: ERR=%s\n", be.strerror());
862 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
863 dev->print_name(), be.strerror());
866 dev->file_addr = pos;
874 * Return the status of the device. This was meant
875 * to be a generic routine. Unfortunately, it doesn't
876 * seem possible (at least I do not know how to do it
877 * currently), which means that for the moment, this
878 * routine has very little value.
882 uint32_t status_dev(DEVICE *dev)
884 struct mtget mt_stat;
887 if (dev->state & (ST_EOT | ST_WEOT)) {
891 if (dev->state & ST_EOF) {
895 if (dev->is_tape()) {
897 Pmsg0(-20," Bacula status:");
898 Pmsg2(-20," file=%d block=%d\n", dev->file, dev->block_num);
899 if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
901 dev->dev_errno = errno;
902 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
903 dev->print_name(), be.strerror());
906 Pmsg0(-20, " Device status:");
908 #if defined(HAVE_LINUX_OS)
909 if (GMT_EOF(mt_stat.mt_gstat)) {
913 if (GMT_BOT(mt_stat.mt_gstat)) {
917 if (GMT_EOT(mt_stat.mt_gstat)) {
921 if (GMT_SM(mt_stat.mt_gstat)) {
925 if (GMT_EOD(mt_stat.mt_gstat)) {
929 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
931 Pmsg0(-20, " WR_PROT");
933 if (GMT_ONLINE(mt_stat.mt_gstat)) {
935 Pmsg0(-20, " ONLINE");
937 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
939 Pmsg0(-20, " DR_OPEN");
941 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
942 stat |= BMT_IM_REP_EN;
943 Pmsg0(-20, " IM_REP_EN");
945 #endif /* !SunOS && !OSF */
946 if (dev_cap(dev, CAP_MTIOCGET)) {
947 Pmsg2(-20, " file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
949 Pmsg2(-20, " file=%d block=%d\n", -1, -1);
952 stat |= BMT_ONLINE | BMT_BOT;
959 * Load medium in device
960 * Returns: true on success
963 bool load_dev(DEVICE *dev)
970 dev->dev_errno = EBADF;
971 Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
972 Emsg0(M_FATAL, 0, dev->errmsg);
975 if (!(dev->is_tape())) {
979 Dmsg0(200, "stored: MTLOAD command not available\n");
981 dev->dev_errno = ENOTTY; /* function not available */
982 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
983 dev->print_name(), be.strerror());
987 dev->block_num = dev->file = 0;
990 mt_com.mt_op = MTLOAD;
992 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
994 dev->dev_errno = errno;
995 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
996 dev->print_name(), be.strerror());
1004 * Rewind device and put it offline
1005 * Returns: true on success
1008 bool offline_dev(DEVICE *dev)
1013 dev->dev_errno = EBADF;
1014 Mmsg0(dev->errmsg, _("Bad call to offline_dev. Device not open\n"));
1015 Emsg0(M_FATAL, 0, dev->errmsg);
1018 if (!(dev->is_tape())) {
1022 dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
1023 dev->block_num = dev->file = 0;
1028 mt_com.mt_op = MTUNLOCK;
1029 mt_com.mt_count = 1;
1030 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1032 mt_com.mt_op = MTOFFL;
1033 mt_com.mt_count = 1;
1034 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1036 dev->dev_errno = errno;
1037 Mmsg2(dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1038 dev->print_name(), be.strerror());
1041 Dmsg1(100, "Offlined device %s\n", dev->print_name());
1045 bool offline_or_rewind_dev(DEVICE *dev)
1050 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
1051 return offline_dev(dev);
1054 * Note, this rewind probably should not be here (it wasn't
1055 * in prior versions of Bacula), but on FreeBSD, this is
1056 * needed in the case the tape was "frozen" due to an error
1057 * such as backspacing after writing and EOF. If it is not
1058 * done, all future references to the drive get and I/O error.
1060 clrerror_dev(dev, MTREW);
1061 return rewind_dev(dev);
1066 * Foward space a file
1067 * Returns: true on success
1070 bool DEVICE::fsf(int num)
1072 struct mtget mt_stat;
1078 Mmsg0(errmsg, _("Bad call to fsf_dev. Device not open\n"));
1079 Emsg0(M_FATAL, 0, errmsg);
1088 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1092 Dmsg0(200, "ST_EOF set on entry to FSF\n");
1095 Dmsg0(100, "fsf\n");
1098 * If Fast forward space file is set, then we
1099 * use MTFSF to forward space and MTIOCGET
1100 * to get the file position. We assume that
1101 * the SCSI driver will ensure that we do not
1102 * forward space past the end of the medium.
1104 if (dev_cap(this, CAP_FSF) && dev_cap(this, CAP_MTIOCGET) && dev_cap(this, CAP_FASTFSF)) {
1105 mt_com.mt_op = MTFSF;
1106 mt_com.mt_count = num;
1107 stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1108 if (stat < 0 || !dev_get_os_pos(this, &mt_stat)) {
1111 Dmsg0(200, "Set ST_EOT\n");
1112 clrerror_dev(this, MTFSF);
1113 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1114 print_name(), be.strerror());
1115 Dmsg1(200, "%s", errmsg);
1118 Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1120 file = mt_stat.mt_fileno;
1124 * Here if CAP_FSF is set, and virtually all drives
1125 * these days support it, we read a record, then forward
1126 * space one file. Using this procedure, which is slow,
1127 * is the only way we can be sure that we don't read
1128 * two consecutive EOF marks, which means End of Data.
1130 } else if (dev_cap(this, CAP_FSF)) {
1133 Dmsg0(200, "FSF has cap_fsf\n");
1134 if (max_block_size == 0) {
1135 rbuf_len = DEFAULT_BLOCK_SIZE;
1137 rbuf_len = max_block_size;
1139 rbuf = get_memory(rbuf_len);
1140 mt_com.mt_op = MTFSF;
1141 mt_com.mt_count = 1;
1142 while (num-- && !at_eot()) {
1143 Dmsg0(100, "Doing read before fsf\n");
1144 if ((stat = read(fd, (char *)rbuf, rbuf_len)) < 0) {
1145 if (errno == ENOMEM) { /* tape record exceeds buf len */
1146 stat = rbuf_len; /* This is OK */
1148 * On IBM drives, they return ENOSPC at EOM
1149 * instead of EOF status
1151 } else if (at_eof() && errno == ENOSPC) {
1156 clrerror_dev(this, -1);
1157 Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev_errno,
1159 Mmsg2(errmsg, _("read error on %s. ERR=%s.\n"),
1160 print_name(), be.strerror());
1161 Dmsg1(100, "%s", errmsg);
1165 if (stat == 0) { /* EOF */
1166 update_pos_dev(this);
1167 Dmsg1(100, "End of File mark from read. File=%d\n", file+1);
1168 /* Two reads of zero means end of tape */
1171 Dmsg0(100, "Set ST_EOT\n");
1177 } else { /* Got data */
1182 Dmsg0(100, "Doing MTFSF\n");
1183 stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1184 if (stat < 0) { /* error => EOT */
1187 Dmsg0(100, "Set ST_EOT\n");
1188 clrerror_dev(this, MTFSF);
1189 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1190 print_name(), be.strerror());
1191 Dmsg0(100, "Got < 0 for MTFSF\n");
1192 Dmsg1(100, "%s", errmsg);
1200 * No FSF, so use FSR to simulate it
1203 Dmsg0(200, "Doing FSR for FSF\n");
1204 while (num-- && !at_eot()) {
1205 fsr(INT32_MAX); /* returns -1 on EOF or EOT */
1209 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1215 update_pos_dev(this);
1216 Dmsg1(200, "Return %d from FSF\n", stat);
1218 Dmsg0(200, "ST_EOF set on exit FSF\n");
1220 Dmsg0(200, "ST_EOT set on exit FSF\n");
1221 Dmsg1(200, "Return from FSF file=%d\n", file);
1226 * Backward space a file
1227 * Returns: false on failure
1231 bsf_dev(DEVICE *dev, int num)
1237 dev->dev_errno = EBADF;
1238 Mmsg0(dev->errmsg, _("Bad call to bsf_dev. Device not open\n"));
1239 Emsg0(M_FATAL, 0, dev->errmsg);
1243 if (!dev->is_tape()) {
1244 Mmsg1(dev->errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1248 Dmsg0(29, "bsf_dev\n");
1249 dev->state &= ~(ST_EOT|ST_EOF);
1253 mt_com.mt_op = MTBSF;
1254 mt_com.mt_count = num;
1255 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1258 clrerror_dev(dev, MTBSF);
1259 Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1260 dev->print_name(), be.strerror());
1262 update_pos_dev(dev);
1268 * Foward space num records
1269 * Returns: false on failure
1272 bool DEVICE::fsr(int num)
1279 Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1280 Emsg0(M_FATAL, 0, errmsg);
1287 if (!dev_cap(this, CAP_FSR)) {
1288 Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1292 Dmsg1(29, "fsr %d\n", num);
1293 mt_com.mt_op = MTFSR;
1294 mt_com.mt_count = num;
1295 stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1301 struct mtget mt_stat;
1302 clrerror_dev(this, MTFSR);
1303 Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1304 if (dev_get_os_pos(this, &mt_stat)) {
1305 Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1306 block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1307 file = mt_stat.mt_fileno;
1308 block_num = mt_stat.mt_blkno;
1316 Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1317 num, print_name(), be.strerror());
1319 update_pos_dev(this);
1324 * Backward space a record
1325 * Returns: false on failure
1329 bsr_dev(DEVICE *dev, int num)
1335 dev->dev_errno = EBADF;
1336 Mmsg0(dev->errmsg, _("Bad call to bsr_dev. Device not open\n"));
1337 Emsg0(M_FATAL, 0, dev->errmsg);
1341 if (!dev->is_tape()) {
1345 if (!dev_cap(dev, CAP_BSR)) {
1346 Mmsg1(dev->errmsg, _("ioctl MTBSR not permitted on %s.\n"), dev->print_name());
1350 Dmsg0(29, "bsr_dev\n");
1351 dev->block_num -= num;
1352 dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
1353 mt_com.mt_op = MTBSR;
1354 mt_com.mt_count = num;
1355 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1358 clrerror_dev(dev, MTBSR);
1359 Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1360 dev->print_name(), be.strerror());
1362 update_pos_dev(dev);
1367 * Reposition the device to file, block
1368 * Returns: false on failure
1372 reposition_dev(DEVICE *dev, uint32_t file, uint32_t block)
1375 dev->dev_errno = EBADF;
1376 Mmsg0(dev->errmsg, _("Bad call to reposition_dev. Device not open\n"));
1377 Emsg0(M_FATAL, 0, dev->errmsg);
1381 if (!dev->is_tape()) {
1382 off_t pos = (((off_t)file)<<32) + block;
1383 Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
1384 if (lseek_dev(dev, pos, SEEK_SET) == (off_t)-1) {
1386 dev->dev_errno = errno;
1387 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
1388 dev->print_name(), be.strerror());
1392 dev->block_num = block;
1393 dev->file_addr = pos;
1396 Dmsg4(100, "reposition_dev from %u:%u to %u:%u\n",
1397 dev->file, dev->block_num, file, block);
1398 if (file < dev->file) {
1399 Dmsg0(100, "Rewind_dev\n");
1400 if (!rewind_dev(dev)) {
1404 if (file > dev->file) {
1405 Dmsg1(100, "fsf %d\n", file-dev->file);
1406 if (!dev->fsf(file-dev->file)) {
1407 Dmsg1(100, "fsf failed! ERR=%s\n", strerror_dev(dev));
1410 Dmsg2(100, "wanted_file=%d at_file=%d\n", file, dev->file);
1412 if (block < dev->block_num) {
1413 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1414 Dmsg0(100, "bsf_dev 1\n");
1416 Dmsg0(100, "fsf_dev 1\n");
1418 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1420 if (dev_cap(dev, CAP_POSITIONBLOCKS) && block > dev->block_num) {
1421 /* Ignore errors as Bacula can read to the correct block */
1422 Dmsg1(100, "fsr %d\n", block-dev->block_num);
1423 return dev->fsr(block-dev->block_num);
1431 * Write an end of file on the device
1432 * Returns: 0 on success
1433 * non-zero on failure
1436 weof_dev(DEVICE *dev, int num)
1440 Dmsg0(29, "weof_dev\n");
1443 dev->dev_errno = EBADF;
1444 Mmsg0(dev->errmsg, _("Bad call to weof_dev. Device not open\n"));
1445 Emsg0(M_FATAL, 0, dev->errmsg);
1450 if (!dev->is_tape()) {
1453 if (!dev->can_append()) {
1454 Mmsg0(dev->errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1455 Emsg0(M_FATAL, 0, dev->errmsg);
1459 dev->state &= ~(ST_EOT | ST_EOF); /* remove EOF/EOT flags */
1460 mt_com.mt_op = MTWEOF;
1461 mt_com.mt_count = num;
1462 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1469 clrerror_dev(dev, MTWEOF);
1471 Mmsg2(dev->errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1472 dev->print_name(), be.strerror());
1479 * Return string message with last error in English
1480 * Be careful not to call this routine from within dev.c
1481 * while editing an Mmsg() or you will end up in a recursive
1482 * loop creating a Segmentation Violation.
1485 strerror_dev(DEVICE *dev)
1492 * If implemented in system, clear the tape
1496 clrerror_dev(DEVICE *dev, int func)
1498 const char *msg = NULL;
1499 struct mtget mt_stat;
1502 dev->dev_errno = errno; /* save errno */
1504 dev->VolCatInfo.VolCatErrors++;
1507 if (!dev->is_tape()) {
1510 if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1513 Emsg0(M_ABORT, 0, "Got ENOTTY on read/write!\n");
1517 dev->capabilities &= ~CAP_EOF; /* turn off feature */
1522 dev->capabilities &= ~CAP_EOM; /* turn off feature */
1527 dev->capabilities &= ~CAP_FSF; /* turn off feature */
1531 dev->capabilities &= ~CAP_BSF; /* turn off feature */
1535 dev->capabilities &= ~CAP_FSR; /* turn off feature */
1539 dev->capabilities &= ~CAP_BSR; /* turn off feature */
1560 bsnprintf(buf, sizeof(buf), "unknown func code %d", func);
1565 dev->dev_errno = ENOSYS;
1566 Mmsg1(dev->errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1567 Emsg0(M_ERROR, 0, dev->errmsg);
1570 /* On some systems such as NetBSD, this clears all errors */
1571 ioctl(dev->fd, MTIOCGET, (char *)&mt_stat);
1573 /* Found on Linux */
1577 mt_com.mt_op = MTIOCLRERR;
1578 mt_com.mt_count = 1;
1579 /* Clear any error condition on the tape */
1580 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1581 Dmsg0(200, "Did MTIOCLRERR\n");
1585 /* Typically on FreeBSD */
1588 /* Read and clear SCSI error status */
1589 union mterrstat mt_errstat;
1590 Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev->dev_errno,
1591 strerror(dev->dev_errno));
1592 ioctl(dev->fd, MTIOCERRSTAT, (char *)&mt_errstat);
1596 /* Clear Subsystem Exception OSF1 */
1600 mt_com.mt_op = MTCSE;
1601 mt_com.mt_count = 1;
1602 /* Clear any error condition on the tape */
1603 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1604 Dmsg0(200, "Did MTCSE\n");
1610 * Flush buffer contents
1613 int flush_dev(DEVICE *dev)
1618 static void do_close(DEVICE *dev)
1621 Dmsg1(29, "really close_dev %s\n", dev->print_name());
1626 if (unmount_dev(dev, 1) < 0) {
1627 Dmsg1(0, "Cannot unmount device %s.\n", dev->print_name());
1630 /* Remove the last part file if it is empty */
1631 if (dev->can_append() && (dev->num_parts > 0)) {
1633 POOL_MEM archive_name(PM_FNAME);
1634 dev->part = dev->num_parts;
1635 Dmsg1(100, "Call make_dvd_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
1636 make_spooled_dvd_filename(dev, archive_name);
1637 /* Check that the part file is empty */
1638 if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
1639 Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
1640 unlink(archive_name.c_str());
1644 /* Clean up device packet so it can be reused */
1646 dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1647 dev->label_type = B_BACULA_LABEL;
1648 dev->file = dev->block_num = 0;
1653 dev->part_start = 0;
1654 dev->EndFile = dev->EndBlock = 0;
1655 memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
1656 memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
1658 stop_thread_timer(dev->tid);
1668 void DEVICE::close()
1670 /*if (fd >= 0 && use_count == 1) {*/
1671 /* No need to check if fd >= 0: it is checked again
1672 * in do_close, and do_close MUST be called for volumes
1673 * splitted in parts, even if fd == -1. */
1674 if (use_count == 1) {
1676 } else if (use_count > 0) {
1681 ASSERT(use_count >= 0);
1686 bool truncate_dev(DEVICE *dev)
1688 Dmsg1(100, "truncate_dev %s\n", dev->print_name());
1689 if (dev->is_tape()) {
1690 return true; /* we don't really truncate tapes */
1691 /* maybe we should rewind and write and eof ???? */
1694 if (dev->is_dvd()) {
1695 Mmsg1(dev->errmsg, _("Truncate DVD %s not supported.\n"), dev->print_name());
1696 return false; /* we cannot truncate DVDs */
1699 if (ftruncate(dev->fd, 0) != 0) {
1701 Mmsg2(dev->errmsg, _("Unable to truncate device %s. ERR=%s\n"),
1702 dev->print_name(), be.strerror());
1708 /* Return the resource name for the device */
1709 const char *DEVICE::name() const
1711 return device->hdr.name;
1715 dev_vol_name(DEVICE *dev)
1717 return dev->VolCatInfo.VolCatName;
1720 uint32_t dev_block(DEVICE *dev)
1722 update_pos_dev(dev);
1723 return dev->block_num;
1726 uint32_t dev_file(DEVICE *dev)
1728 update_pos_dev(dev);
1733 * Free memory allocated for the device
1736 term_dev(DEVICE *dev)
1739 dev->dev_errno = EBADF;
1740 Mmsg0(dev->errmsg, _("Bad call to term_dev. Device not open\n"));
1741 Emsg0(M_FATAL, 0, dev->errmsg);
1744 Dmsg1(29, "term_dev: %s\n", dev->print_name());
1746 if (dev->dev_name) {
1747 free_memory(dev->dev_name);
1748 dev->dev_name = NULL;
1750 if (dev->prt_name) {
1751 free_memory(dev->prt_name);
1752 dev->prt_name = NULL;
1755 free_pool_memory(dev->errmsg);
1758 pthread_mutex_destroy(&dev->mutex);
1759 pthread_cond_destroy(&dev->wait);
1760 pthread_cond_destroy(&dev->wait_next_vol);
1761 pthread_mutex_destroy(&dev->spool_mutex);
1762 rwl_destroy(&dev->lock);
1763 if (dev->attached_dcrs) {
1764 delete dev->attached_dcrs;
1765 dev->attached_dcrs = NULL;
1767 if (dev->state & ST_MALLOC) {
1768 free_pool_memory((POOLMEM *)dev);
1773 * This routine initializes the device wait timers
1775 void init_device_wait_timers(DCR *dcr)
1777 DEVICE *dev = dcr->dev;
1778 JCR *jcr = dcr->jcr;
1780 /* ******FIXME******* put these on config variables */
1781 dev->min_wait = 60 * 60;
1782 dev->max_wait = 24 * 60 * 60;
1783 dev->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1784 dev->wait_sec = dev->min_wait;
1785 dev->rem_wait_sec = dev->wait_sec;
1788 dev->BadVolName[0] = 0;
1790 jcr->min_wait = 60 * 60;
1791 jcr->max_wait = 24 * 60 * 60;
1792 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1793 jcr->wait_sec = jcr->min_wait;
1794 jcr->rem_wait_sec = jcr->wait_sec;
1799 void init_jcr_device_wait_timers(JCR *jcr)
1801 /* ******FIXME******* put these on config variables */
1802 jcr->min_wait = 60 * 60;
1803 jcr->max_wait = 24 * 60 * 60;
1804 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1805 jcr->wait_sec = jcr->min_wait;
1806 jcr->rem_wait_sec = jcr->wait_sec;
1812 * The dev timers are used for waiting on a particular device
1814 * Returns: true if time doubled
1815 * false if max time expired
1817 bool double_dev_wait_time(DEVICE *dev)
1819 dev->wait_sec *= 2; /* double wait time */
1820 if (dev->wait_sec > dev->max_wait) { /* but not longer than maxtime */
1821 dev->wait_sec = dev->max_wait;
1824 dev->rem_wait_sec = dev->wait_sec;
1825 if (dev->num_wait >= dev->max_num_wait) {
1832 void set_os_device_parameters(DEVICE *dev)
1834 #ifdef HAVE_LINUX_OS
1836 if (dev->min_block_size == dev->max_block_size &&
1837 dev->min_block_size == 0) { /* variable block mode */
1838 mt_com.mt_op = MTSETBLK;
1839 mt_com.mt_count = 0;
1840 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1841 clrerror_dev(dev, MTSETBLK);
1843 mt_com.mt_op = MTSETDRVBUFFER;
1844 mt_com.mt_count = MT_ST_CLEARBOOLEANS;
1845 if (!dev_cap(dev, CAP_TWOEOF)) {
1846 mt_com.mt_count |= MT_ST_TWO_FM;
1848 if (dev_cap(dev, CAP_EOM)) {
1849 mt_com.mt_count |= MT_ST_FAST_MTEOM;
1851 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1852 clrerror_dev(dev, MTSETBLK);
1858 #ifdef HAVE_NETBSD_OS
1860 if (dev->min_block_size == dev->max_block_size &&
1861 dev->min_block_size == 0) { /* variable block mode */
1862 mt_com.mt_op = MTSETBSIZ;
1863 mt_com.mt_count = 0;
1864 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1865 clrerror_dev(dev, MTSETBSIZ);
1867 /* Get notified at logical end of tape */
1868 mt_com.mt_op = MTEWARN;
1869 mt_com.mt_count = 1;
1870 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1871 clrerror_dev(dev, MTEWARN);
1877 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
1879 if (dev->min_block_size == dev->max_block_size &&
1880 dev->min_block_size == 0) { /* variable block mode */
1881 mt_com.mt_op = MTSETBSIZ;
1882 mt_com.mt_count = 0;
1883 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1884 clrerror_dev(dev, MTSETBSIZ);
1892 if (dev->min_block_size == dev->max_block_size &&
1893 dev->min_block_size == 0) { /* variable block mode */
1894 mt_com.mt_op = MTSRSZ;
1895 mt_com.mt_count = 0;
1896 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1897 clrerror_dev(dev, MTSRSZ);
1904 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
1906 return dev_cap(dev, CAP_MTIOCGET) &&
1907 ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
1908 mt_stat->mt_fileno >= 0;
1911 static char *modes[] = {
1912 "CREATE_READ_WRITE",
1919 static char *mode_to_str(int mode)
1921 return modes[mode-1];