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(omode));
286 open_dvd_device(dcr, omode);
288 Dmsg1(100, "call open_file_device mode=%s\n", mode_to_str(omode));
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)) {
479 Mmsg(errmsg, _("Could not mount device %s.\n"), print_name());
480 Emsg0(M_FATAL, 0, errmsg);
485 Dmsg5(29, "open dev: %s dev=%s mode=%s part=%d npart=%d\n",
486 is_dvd()?"DVD":"disk", archive_name.c_str(), mode_to_str(omode),
491 * If we are not trying to access the last part, set mode to
492 * OPEN_READ_ONLY as writing would be an error.
494 if (part < num_parts) {
495 omode = OPEN_READ_ONLY;
500 * If we are opening it read-only, it is *probably* on the
501 * DVD, so try the DVD first, otherwise look in the spool dir.
503 if (omode == OPEN_READ_ONLY) {
504 make_mounted_dvd_filename(this, archive_name);
506 make_spooled_dvd_filename(this, archive_name);
509 /* If creating file, give 0640 permissions */
510 Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode),
511 archive_name.c_str(), mode);
512 /* Use system open() */
513 if ((fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
516 Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
518 Dmsg1(29, "open failed: %s", errmsg);
519 if (omode == OPEN_READ_ONLY) {
520 make_spooled_dvd_filename(this, archive_name);
521 /* Use system open() */
522 fd = ::open(archive_name.c_str(), mode, 0640); /* try on spool */
526 /* Get size of file */
527 if (fstat(fd, &filestat) < 0) {
530 Mmsg2(errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(),
532 Dmsg1(29, "open failed: %s", errmsg);
533 /* Use system close() */
537 part_size = filestat.st_size;
541 update_pos_dev(this); /* update position */
542 /* Just created Volume */
543 if (omode == OPEN_READ_WRITE && part_size == 0) {
546 VolCatInfo.VolCatParts = num_parts;
550 Dmsg4(29, "open dev: DVD fd=%d opened, part=%d nump=%d, part_size=%u\n",
551 fd, part, num_parts, part_size);
552 if (is_open() && is_dvd() && (omode != OPEN_READ_ONLY) &&
553 (free_space_errno == 0 || num_parts == part)) {
554 update_free_space_dev(this);
561 bool _rewind_dev(char *file, int line, DEVICE *dev)
563 Dmsg2(100, "rewind_dev called from %s:%d\n", file, line);
564 return rewind_dev(dev);
570 * Returns: true on success
573 bool rewind_dev(DEVICE *dev)
578 Dmsg1(29, "rewind_dev %s\n", dev->print_name());
580 dev->dev_errno = EBADF;
581 Mmsg1(dev->errmsg, _("Bad call to rewind_dev. Device %s not open\n"),
583 Emsg0(M_ABORT, 0, dev->errmsg);
586 dev->state &= ~(ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
587 dev->block_num = dev->file = 0;
590 if (dev->is_tape()) {
591 mt_com.mt_op = MTREW;
593 /* If we get an I/O error on rewind, it is probably because
594 * the drive is actually busy. We loop for (about 5 minutes)
595 * retrying every 5 seconds.
597 for (i=dev->max_rewind_wait; ; i -= 5) {
598 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
600 clrerror_dev(dev, MTREW);
601 if (i == dev->max_rewind_wait) {
602 Dmsg1(200, "Rewind error, %s. retrying ...\n", be.strerror());
604 if (dev->dev_errno == EIO && i > 0) {
605 Dmsg0(200, "Sleeping 5 seconds.\n");
609 Mmsg2(dev->errmsg, _("Rewind error on %s. ERR=%s.\n"),
610 dev->print_name(), be.strerror());
615 } else if (dev->is_file()) {
616 if (lseek_dev(dev, (off_t)0, SEEK_SET) < 0) {
618 dev->dev_errno = errno;
619 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
620 dev->print_name(), be.strerror());
627 void DEVICE::block(int why)
630 block_device(this, why);
634 void DEVICE::unblock()
637 unblock_device(this);
641 const char *DEVICE::print_blocked() const
643 switch (dev_blocked) {
644 case BST_NOT_BLOCKED:
645 return "BST_NOT_BLOCKED";
647 return "BST_UNMOUNTED";
648 case BST_WAITING_FOR_SYSOP:
649 return "BST_WAITING_FOR_SYSOP";
650 case BST_DOING_ACQUIRE:
651 return "BST_DOING_ACQUIRE";
652 case BST_WRITING_LABEL:
653 return "BST_WRITING_LABEL";
654 case BST_UNMOUNTED_WAITING_FOR_SYSOP:
655 return "BST_UNMOUNTED_WAITING_FOR_SYSOP";
659 return "unknown blocked code";
664 * Called to indicate that we have just read an
665 * EOF from the device.
667 void DEVICE::set_ateof()
677 * Called to indicate we are now at the end of the tape, and
678 * writing is not possible.
680 void DEVICE::set_ateot()
682 /* Make tape effectively read-only */
683 state |= (ST_EOF|ST_EOT|ST_WEOT);
688 * Position device to end of medium (end of data)
689 * Returns: true on succes
696 struct mtget mt_stat;
701 dev->dev_errno = EBADF;
702 Mmsg1(dev->errmsg, _("Bad call to eod_dev. Device %s not open\n"),
707 #if defined (__digital__) && defined (__unix__)
708 return dev->fsf(dev->VolCatInfo.VolCatFiles);
711 Dmsg0(29, "eod_dev\n");
715 dev->state &= ~(ST_EOF); /* remove EOF flags */
716 dev->block_num = dev->file = 0;
719 if (dev->state & (ST_FIFO | ST_PROG)) {
722 if (!dev->is_tape()) {
723 pos = lseek_dev(dev, (off_t)0, SEEK_END);
724 // Dmsg1(100, "====== Seek to %lld\n", pos);
727 dev->state |= ST_EOT;
730 dev->dev_errno = errno;
732 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
733 dev->print_name(), be.strerror());
737 if (dev_cap(dev, CAP_FASTFSF) && !dev_cap(dev, CAP_EOM)) {
738 Dmsg0(100,"Using FAST FSF for EOM\n");
739 /* If unknown position, rewind */
740 if (!dev_get_os_pos(dev, &mt_stat)) {
741 if (!rewind_dev(dev)) {
745 mt_com.mt_op = MTFSF;
747 * ***FIXME*** fix code to handle case that INT16_MAX is
750 mt_com.mt_count = INT16_MAX; /* use big positive number */
751 if (mt_com.mt_count < 0) {
752 mt_com.mt_count = INT16_MAX; /* brain damaged system */
756 if (dev_cap(dev, CAP_MTIOCGET) && (dev_cap(dev, CAP_FASTFSF) || dev_cap(dev, CAP_EOM))) {
757 if (dev_cap(dev, CAP_EOM)) {
758 Dmsg0(100,"Using EOM for EOM\n");
759 mt_com.mt_op = MTEOM;
763 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
765 clrerror_dev(dev, mt_com.mt_op);
766 Dmsg1(50, "ioctl error: %s\n", be.strerror());
768 Mmsg2(dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
769 dev->print_name(), be.strerror());
773 if (!dev_get_os_pos(dev, &mt_stat)) {
775 clrerror_dev(dev, -1);
776 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
777 dev->print_name(), be.strerror());
780 Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
782 dev->file = mt_stat.mt_fileno;
788 * Rewind then use FSF until EOT reached
790 if (!rewind_dev(dev)) {
794 * Move file by file to the end of the tape
797 for (file_num=dev->file; !dev->at_eot(); file_num++) {
798 Dmsg0(200, "eod_dev: doing fsf 1\n");
800 Dmsg0(200, "fsf error.\n");
804 * Avoid infinite loop. ***FIXME*** possibly add code
805 * to set EOD or to turn off CAP_FASTFSF if on.
807 if (file_num == (int)dev->file) {
808 struct mtget mt_stat;
809 Dmsg1(100, "fsf did not advance from file %d\n", file_num);
810 if (dev_get_os_pos(dev, &mt_stat)) {
811 Dmsg2(100, "Adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
813 dev->file = mt_stat.mt_fileno;
820 * Some drivers leave us after second EOF when doing
821 * MTEOM, so we must backup so that appending overwrites
824 if (dev_cap(dev, CAP_BSFATEOM)) {
825 struct mtget mt_stat;
826 /* Backup over EOF */
827 ok = bsf_dev(dev, 1);
828 /* If BSF worked and fileno is known (not -1), set file */
829 if (dev_get_os_pos(dev, &mt_stat)) {
830 Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
831 dev->file = mt_stat.mt_fileno;
833 dev->file++; /* wing it -- not correct on all OSes */
836 update_pos_dev(dev); /* update position */
838 Dmsg1(200, "EOD dev->file=%d\n", dev->file);
843 * Set the position of the device -- only for files
844 * For other devices, there is no generic way to do it.
845 * Returns: true on succes
848 bool update_pos_dev(DEVICE *dev)
854 dev->dev_errno = EBADF;
855 Mmsg0(dev->errmsg, _("Bad device call. Device not open\n"));
856 Emsg0(M_FATAL, 0, dev->errmsg);
860 /* Find out where we are */
861 if (dev->is_file()) {
864 pos = lseek_dev(dev, (off_t)0, SEEK_CUR);
867 dev->dev_errno = errno;
868 Pmsg1(000, "Seek error: ERR=%s\n", be.strerror());
869 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
870 dev->print_name(), be.strerror());
873 dev->file_addr = pos;
881 * Return the status of the device. This was meant
882 * to be a generic routine. Unfortunately, it doesn't
883 * seem possible (at least I do not know how to do it
884 * currently), which means that for the moment, this
885 * routine has very little value.
889 uint32_t status_dev(DEVICE *dev)
891 struct mtget mt_stat;
894 if (dev->state & (ST_EOT | ST_WEOT)) {
898 if (dev->state & ST_EOF) {
902 if (dev->is_tape()) {
904 Pmsg0(-20," Bacula status:");
905 Pmsg2(-20," file=%d block=%d\n", dev->file, dev->block_num);
906 if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
908 dev->dev_errno = errno;
909 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
910 dev->print_name(), be.strerror());
913 Pmsg0(-20, " Device status:");
915 #if defined(HAVE_LINUX_OS)
916 if (GMT_EOF(mt_stat.mt_gstat)) {
920 if (GMT_BOT(mt_stat.mt_gstat)) {
924 if (GMT_EOT(mt_stat.mt_gstat)) {
928 if (GMT_SM(mt_stat.mt_gstat)) {
932 if (GMT_EOD(mt_stat.mt_gstat)) {
936 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
938 Pmsg0(-20, " WR_PROT");
940 if (GMT_ONLINE(mt_stat.mt_gstat)) {
942 Pmsg0(-20, " ONLINE");
944 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
946 Pmsg0(-20, " DR_OPEN");
948 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
949 stat |= BMT_IM_REP_EN;
950 Pmsg0(-20, " IM_REP_EN");
952 #endif /* !SunOS && !OSF */
953 if (dev_cap(dev, CAP_MTIOCGET)) {
954 Pmsg2(-20, " file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
956 Pmsg2(-20, " file=%d block=%d\n", -1, -1);
959 stat |= BMT_ONLINE | BMT_BOT;
966 * Load medium in device
967 * Returns: true on success
970 bool load_dev(DEVICE *dev)
977 dev->dev_errno = EBADF;
978 Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
979 Emsg0(M_FATAL, 0, dev->errmsg);
982 if (!(dev->is_tape())) {
986 Dmsg0(200, "stored: MTLOAD command not available\n");
988 dev->dev_errno = ENOTTY; /* function not available */
989 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
990 dev->print_name(), be.strerror());
994 dev->block_num = dev->file = 0;
997 mt_com.mt_op = MTLOAD;
999 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1001 dev->dev_errno = errno;
1002 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1003 dev->print_name(), be.strerror());
1011 * Rewind device and put it offline
1012 * Returns: true on success
1015 bool offline_dev(DEVICE *dev)
1020 dev->dev_errno = EBADF;
1021 Mmsg0(dev->errmsg, _("Bad call to offline_dev. Device not open\n"));
1022 Emsg0(M_FATAL, 0, dev->errmsg);
1025 if (!(dev->is_tape())) {
1029 dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
1030 dev->block_num = dev->file = 0;
1035 mt_com.mt_op = MTUNLOCK;
1036 mt_com.mt_count = 1;
1037 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1039 mt_com.mt_op = MTOFFL;
1040 mt_com.mt_count = 1;
1041 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1043 dev->dev_errno = errno;
1044 Mmsg2(dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1045 dev->print_name(), be.strerror());
1048 Dmsg1(100, "Offlined device %s\n", dev->print_name());
1052 bool offline_or_rewind_dev(DEVICE *dev)
1057 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
1058 return offline_dev(dev);
1061 * Note, this rewind probably should not be here (it wasn't
1062 * in prior versions of Bacula), but on FreeBSD, this is
1063 * needed in the case the tape was "frozen" due to an error
1064 * such as backspacing after writing and EOF. If it is not
1065 * done, all future references to the drive get and I/O error.
1067 clrerror_dev(dev, MTREW);
1068 return rewind_dev(dev);
1073 * Foward space a file
1074 * Returns: true on success
1077 bool DEVICE::fsf(int num)
1079 struct mtget mt_stat;
1085 Mmsg0(errmsg, _("Bad call to fsf_dev. Device not open\n"));
1086 Emsg0(M_FATAL, 0, errmsg);
1095 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1099 Dmsg0(200, "ST_EOF set on entry to FSF\n");
1102 Dmsg0(100, "fsf\n");
1105 * If Fast forward space file is set, then we
1106 * use MTFSF to forward space and MTIOCGET
1107 * to get the file position. We assume that
1108 * the SCSI driver will ensure that we do not
1109 * forward space past the end of the medium.
1111 if (dev_cap(this, CAP_FSF) && dev_cap(this, CAP_MTIOCGET) && dev_cap(this, CAP_FASTFSF)) {
1112 mt_com.mt_op = MTFSF;
1113 mt_com.mt_count = num;
1114 stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1115 if (stat < 0 || !dev_get_os_pos(this, &mt_stat)) {
1118 Dmsg0(200, "Set ST_EOT\n");
1119 clrerror_dev(this, MTFSF);
1120 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1121 print_name(), be.strerror());
1122 Dmsg1(200, "%s", errmsg);
1125 Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1127 file = mt_stat.mt_fileno;
1131 * Here if CAP_FSF is set, and virtually all drives
1132 * these days support it, we read a record, then forward
1133 * space one file. Using this procedure, which is slow,
1134 * is the only way we can be sure that we don't read
1135 * two consecutive EOF marks, which means End of Data.
1137 } else if (dev_cap(this, CAP_FSF)) {
1140 Dmsg0(200, "FSF has cap_fsf\n");
1141 if (max_block_size == 0) {
1142 rbuf_len = DEFAULT_BLOCK_SIZE;
1144 rbuf_len = max_block_size;
1146 rbuf = get_memory(rbuf_len);
1147 mt_com.mt_op = MTFSF;
1148 mt_com.mt_count = 1;
1149 while (num-- && !at_eot()) {
1150 Dmsg0(100, "Doing read before fsf\n");
1151 if ((stat = read(fd, (char *)rbuf, rbuf_len)) < 0) {
1152 if (errno == ENOMEM) { /* tape record exceeds buf len */
1153 stat = rbuf_len; /* This is OK */
1155 * On IBM drives, they return ENOSPC at EOM
1156 * instead of EOF status
1158 } else if (at_eof() && errno == ENOSPC) {
1163 clrerror_dev(this, -1);
1164 Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev_errno,
1166 Mmsg2(errmsg, _("read error on %s. ERR=%s.\n"),
1167 print_name(), be.strerror());
1168 Dmsg1(100, "%s", errmsg);
1172 if (stat == 0) { /* EOF */
1173 update_pos_dev(this);
1174 Dmsg1(100, "End of File mark from read. File=%d\n", file+1);
1175 /* Two reads of zero means end of tape */
1178 Dmsg0(100, "Set ST_EOT\n");
1184 } else { /* Got data */
1189 Dmsg0(100, "Doing MTFSF\n");
1190 stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1191 if (stat < 0) { /* error => EOT */
1194 Dmsg0(100, "Set ST_EOT\n");
1195 clrerror_dev(this, MTFSF);
1196 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1197 print_name(), be.strerror());
1198 Dmsg0(100, "Got < 0 for MTFSF\n");
1199 Dmsg1(100, "%s", errmsg);
1207 * No FSF, so use FSR to simulate it
1210 Dmsg0(200, "Doing FSR for FSF\n");
1211 while (num-- && !at_eot()) {
1212 fsr(INT32_MAX); /* returns -1 on EOF or EOT */
1216 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1222 update_pos_dev(this);
1223 Dmsg1(200, "Return %d from FSF\n", stat);
1225 Dmsg0(200, "ST_EOF set on exit FSF\n");
1227 Dmsg0(200, "ST_EOT set on exit FSF\n");
1228 Dmsg1(200, "Return from FSF file=%d\n", file);
1233 * Backward space a file
1234 * Returns: false on failure
1238 bsf_dev(DEVICE *dev, int num)
1244 dev->dev_errno = EBADF;
1245 Mmsg0(dev->errmsg, _("Bad call to bsf_dev. Device not open\n"));
1246 Emsg0(M_FATAL, 0, dev->errmsg);
1250 if (!dev->is_tape()) {
1251 Mmsg1(dev->errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1255 Dmsg0(29, "bsf_dev\n");
1256 dev->state &= ~(ST_EOT|ST_EOF);
1260 mt_com.mt_op = MTBSF;
1261 mt_com.mt_count = num;
1262 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1265 clrerror_dev(dev, MTBSF);
1266 Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1267 dev->print_name(), be.strerror());
1269 update_pos_dev(dev);
1275 * Foward space num records
1276 * Returns: false on failure
1279 bool DEVICE::fsr(int num)
1286 Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1287 Emsg0(M_FATAL, 0, errmsg);
1294 if (!dev_cap(this, CAP_FSR)) {
1295 Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1299 Dmsg1(29, "fsr %d\n", num);
1300 mt_com.mt_op = MTFSR;
1301 mt_com.mt_count = num;
1302 stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1308 struct mtget mt_stat;
1309 clrerror_dev(this, MTFSR);
1310 Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1311 if (dev_get_os_pos(this, &mt_stat)) {
1312 Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1313 block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1314 file = mt_stat.mt_fileno;
1315 block_num = mt_stat.mt_blkno;
1323 Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1324 num, print_name(), be.strerror());
1326 update_pos_dev(this);
1331 * Backward space a record
1332 * Returns: false on failure
1336 bsr_dev(DEVICE *dev, int num)
1342 dev->dev_errno = EBADF;
1343 Mmsg0(dev->errmsg, _("Bad call to bsr_dev. Device not open\n"));
1344 Emsg0(M_FATAL, 0, dev->errmsg);
1348 if (!dev->is_tape()) {
1352 if (!dev_cap(dev, CAP_BSR)) {
1353 Mmsg1(dev->errmsg, _("ioctl MTBSR not permitted on %s.\n"), dev->print_name());
1357 Dmsg0(29, "bsr_dev\n");
1358 dev->block_num -= num;
1359 dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
1360 mt_com.mt_op = MTBSR;
1361 mt_com.mt_count = num;
1362 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1365 clrerror_dev(dev, MTBSR);
1366 Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1367 dev->print_name(), be.strerror());
1369 update_pos_dev(dev);
1374 * Reposition the device to file, block
1375 * Returns: false on failure
1379 reposition_dev(DEVICE *dev, uint32_t file, uint32_t block)
1382 dev->dev_errno = EBADF;
1383 Mmsg0(dev->errmsg, _("Bad call to reposition_dev. Device not open\n"));
1384 Emsg0(M_FATAL, 0, dev->errmsg);
1388 if (!dev->is_tape()) {
1389 off_t pos = (((off_t)file)<<32) + block;
1390 Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
1391 if (lseek_dev(dev, pos, SEEK_SET) == (off_t)-1) {
1393 dev->dev_errno = errno;
1394 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
1395 dev->print_name(), be.strerror());
1399 dev->block_num = block;
1400 dev->file_addr = pos;
1403 Dmsg4(100, "reposition_dev from %u:%u to %u:%u\n",
1404 dev->file, dev->block_num, file, block);
1405 if (file < dev->file) {
1406 Dmsg0(100, "Rewind_dev\n");
1407 if (!rewind_dev(dev)) {
1411 if (file > dev->file) {
1412 Dmsg1(100, "fsf %d\n", file-dev->file);
1413 if (!dev->fsf(file-dev->file)) {
1414 Dmsg1(100, "fsf failed! ERR=%s\n", strerror_dev(dev));
1417 Dmsg2(100, "wanted_file=%d at_file=%d\n", file, dev->file);
1419 if (block < dev->block_num) {
1420 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1421 Dmsg0(100, "bsf_dev 1\n");
1423 Dmsg0(100, "fsf_dev 1\n");
1425 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1427 if (dev_cap(dev, CAP_POSITIONBLOCKS) && block > dev->block_num) {
1428 /* Ignore errors as Bacula can read to the correct block */
1429 Dmsg1(100, "fsr %d\n", block-dev->block_num);
1430 return dev->fsr(block-dev->block_num);
1438 * Write an end of file on the device
1439 * Returns: 0 on success
1440 * non-zero on failure
1443 weof_dev(DEVICE *dev, int num)
1447 Dmsg0(29, "weof_dev\n");
1450 dev->dev_errno = EBADF;
1451 Mmsg0(dev->errmsg, _("Bad call to weof_dev. Device not open\n"));
1452 Emsg0(M_FATAL, 0, dev->errmsg);
1457 if (!dev->is_tape()) {
1460 if (!dev->can_append()) {
1461 Mmsg0(dev->errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1462 Emsg0(M_FATAL, 0, dev->errmsg);
1466 dev->state &= ~(ST_EOT | ST_EOF); /* remove EOF/EOT flags */
1467 mt_com.mt_op = MTWEOF;
1468 mt_com.mt_count = num;
1469 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1476 clrerror_dev(dev, MTWEOF);
1478 Mmsg2(dev->errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1479 dev->print_name(), be.strerror());
1486 * Return string message with last error in English
1487 * Be careful not to call this routine from within dev.c
1488 * while editing an Mmsg() or you will end up in a recursive
1489 * loop creating a Segmentation Violation.
1492 strerror_dev(DEVICE *dev)
1499 * If implemented in system, clear the tape
1503 clrerror_dev(DEVICE *dev, int func)
1505 const char *msg = NULL;
1506 struct mtget mt_stat;
1509 dev->dev_errno = errno; /* save errno */
1511 dev->VolCatInfo.VolCatErrors++;
1514 if (!dev->is_tape()) {
1517 if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1520 Emsg0(M_ABORT, 0, "Got ENOTTY on read/write!\n");
1524 dev->capabilities &= ~CAP_EOF; /* turn off feature */
1529 dev->capabilities &= ~CAP_EOM; /* turn off feature */
1534 dev->capabilities &= ~CAP_FSF; /* turn off feature */
1538 dev->capabilities &= ~CAP_BSF; /* turn off feature */
1542 dev->capabilities &= ~CAP_FSR; /* turn off feature */
1546 dev->capabilities &= ~CAP_BSR; /* turn off feature */
1567 bsnprintf(buf, sizeof(buf), "unknown func code %d", func);
1572 dev->dev_errno = ENOSYS;
1573 Mmsg1(dev->errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1574 Emsg0(M_ERROR, 0, dev->errmsg);
1577 /* On some systems such as NetBSD, this clears all errors */
1578 ioctl(dev->fd, MTIOCGET, (char *)&mt_stat);
1580 /* Found on Linux */
1584 mt_com.mt_op = MTIOCLRERR;
1585 mt_com.mt_count = 1;
1586 /* Clear any error condition on the tape */
1587 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1588 Dmsg0(200, "Did MTIOCLRERR\n");
1592 /* Typically on FreeBSD */
1595 /* Read and clear SCSI error status */
1596 union mterrstat mt_errstat;
1597 Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev->dev_errno,
1598 strerror(dev->dev_errno));
1599 ioctl(dev->fd, MTIOCERRSTAT, (char *)&mt_errstat);
1603 /* Clear Subsystem Exception OSF1 */
1607 mt_com.mt_op = MTCSE;
1608 mt_com.mt_count = 1;
1609 /* Clear any error condition on the tape */
1610 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1611 Dmsg0(200, "Did MTCSE\n");
1617 * Flush buffer contents
1620 int flush_dev(DEVICE *dev)
1625 static void do_close(DEVICE *dev)
1628 Dmsg1(29, "really close_dev %s\n", dev->print_name());
1633 if (!unmount_dev(dev, 1)) {
1634 Dmsg1(0, "Cannot unmount device %s.\n", dev->print_name());
1637 /* Remove the last part file if it is empty */
1638 if (dev->can_append() && (dev->num_parts > 0)) {
1640 POOL_MEM archive_name(PM_FNAME);
1641 dev->part = dev->num_parts;
1642 Dmsg1(100, "Call make_dvd_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
1643 make_spooled_dvd_filename(dev, archive_name);
1644 /* Check that the part file is empty */
1645 if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
1646 Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
1647 unlink(archive_name.c_str());
1651 /* Clean up device packet so it can be reused */
1653 dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1654 dev->label_type = B_BACULA_LABEL;
1655 dev->file = dev->block_num = 0;
1660 dev->part_start = 0;
1661 dev->EndFile = dev->EndBlock = 0;
1662 memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
1663 memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
1665 stop_thread_timer(dev->tid);
1675 void DEVICE::close()
1677 /*if (fd >= 0 && use_count == 1) {*/
1678 /* No need to check if fd >= 0: it is checked again
1679 * in do_close, and do_close MUST be called for volumes
1680 * splitted in parts, even if fd == -1. */
1681 if (use_count == 1) {
1683 } else if (use_count > 0) {
1688 ASSERT(use_count >= 0);
1693 bool truncate_dev(DEVICE *dev)
1695 Dmsg1(100, "truncate_dev %s\n", dev->print_name());
1696 if (dev->is_tape()) {
1697 return true; /* we don't really truncate tapes */
1698 /* maybe we should rewind and write and eof ???? */
1701 if (dev->is_dvd()) {
1702 Mmsg1(dev->errmsg, _("Truncate DVD %s not supported.\n"), dev->print_name());
1703 return false; /* we cannot truncate DVDs */
1706 if (ftruncate(dev->fd, 0) != 0) {
1708 Mmsg2(dev->errmsg, _("Unable to truncate device %s. ERR=%s\n"),
1709 dev->print_name(), be.strerror());
1715 /* Return the resource name for the device */
1716 const char *DEVICE::name() const
1718 return device->hdr.name;
1722 dev_vol_name(DEVICE *dev)
1724 return dev->VolCatInfo.VolCatName;
1727 uint32_t dev_block(DEVICE *dev)
1729 update_pos_dev(dev);
1730 return dev->block_num;
1733 uint32_t dev_file(DEVICE *dev)
1735 update_pos_dev(dev);
1740 * Free memory allocated for the device
1743 term_dev(DEVICE *dev)
1746 dev->dev_errno = EBADF;
1747 Mmsg0(dev->errmsg, _("Bad call to term_dev. Device not open\n"));
1748 Emsg0(M_FATAL, 0, dev->errmsg);
1751 Dmsg1(29, "term_dev: %s\n", dev->print_name());
1753 if (dev->dev_name) {
1754 free_memory(dev->dev_name);
1755 dev->dev_name = NULL;
1757 if (dev->prt_name) {
1758 free_memory(dev->prt_name);
1759 dev->prt_name = NULL;
1762 free_pool_memory(dev->errmsg);
1765 pthread_mutex_destroy(&dev->mutex);
1766 pthread_cond_destroy(&dev->wait);
1767 pthread_cond_destroy(&dev->wait_next_vol);
1768 pthread_mutex_destroy(&dev->spool_mutex);
1769 rwl_destroy(&dev->lock);
1770 if (dev->attached_dcrs) {
1771 delete dev->attached_dcrs;
1772 dev->attached_dcrs = NULL;
1774 if (dev->state & ST_MALLOC) {
1775 free_pool_memory((POOLMEM *)dev);
1780 * This routine initializes the device wait timers
1782 void init_device_wait_timers(DCR *dcr)
1784 DEVICE *dev = dcr->dev;
1785 JCR *jcr = dcr->jcr;
1787 /* ******FIXME******* put these on config variables */
1788 dev->min_wait = 60 * 60;
1789 dev->max_wait = 24 * 60 * 60;
1790 dev->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1791 dev->wait_sec = dev->min_wait;
1792 dev->rem_wait_sec = dev->wait_sec;
1795 dev->BadVolName[0] = 0;
1797 jcr->min_wait = 60 * 60;
1798 jcr->max_wait = 24 * 60 * 60;
1799 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1800 jcr->wait_sec = jcr->min_wait;
1801 jcr->rem_wait_sec = jcr->wait_sec;
1806 void init_jcr_device_wait_timers(JCR *jcr)
1808 /* ******FIXME******* put these on config variables */
1809 jcr->min_wait = 60 * 60;
1810 jcr->max_wait = 24 * 60 * 60;
1811 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1812 jcr->wait_sec = jcr->min_wait;
1813 jcr->rem_wait_sec = jcr->wait_sec;
1819 * The dev timers are used for waiting on a particular device
1821 * Returns: true if time doubled
1822 * false if max time expired
1824 bool double_dev_wait_time(DEVICE *dev)
1826 dev->wait_sec *= 2; /* double wait time */
1827 if (dev->wait_sec > dev->max_wait) { /* but not longer than maxtime */
1828 dev->wait_sec = dev->max_wait;
1831 dev->rem_wait_sec = dev->wait_sec;
1832 if (dev->num_wait >= dev->max_num_wait) {
1839 void set_os_device_parameters(DEVICE *dev)
1841 #ifdef HAVE_LINUX_OS
1843 if (dev->min_block_size == dev->max_block_size &&
1844 dev->min_block_size == 0) { /* variable block mode */
1845 mt_com.mt_op = MTSETBLK;
1846 mt_com.mt_count = 0;
1847 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1848 clrerror_dev(dev, MTSETBLK);
1850 mt_com.mt_op = MTSETDRVBUFFER;
1851 mt_com.mt_count = MT_ST_CLEARBOOLEANS;
1852 if (!dev_cap(dev, CAP_TWOEOF)) {
1853 mt_com.mt_count |= MT_ST_TWO_FM;
1855 if (dev_cap(dev, CAP_EOM)) {
1856 mt_com.mt_count |= MT_ST_FAST_MTEOM;
1858 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1859 clrerror_dev(dev, MTSETBLK);
1865 #ifdef HAVE_NETBSD_OS
1867 if (dev->min_block_size == dev->max_block_size &&
1868 dev->min_block_size == 0) { /* variable block mode */
1869 mt_com.mt_op = MTSETBSIZ;
1870 mt_com.mt_count = 0;
1871 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1872 clrerror_dev(dev, MTSETBSIZ);
1874 /* Get notified at logical end of tape */
1875 mt_com.mt_op = MTEWARN;
1876 mt_com.mt_count = 1;
1877 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1878 clrerror_dev(dev, MTEWARN);
1884 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
1886 if (dev->min_block_size == dev->max_block_size &&
1887 dev->min_block_size == 0) { /* variable block mode */
1888 mt_com.mt_op = MTSETBSIZ;
1889 mt_com.mt_count = 0;
1890 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1891 clrerror_dev(dev, MTSETBSIZ);
1899 if (dev->min_block_size == dev->max_block_size &&
1900 dev->min_block_size == 0) { /* variable block mode */
1901 mt_com.mt_op = MTSRSZ;
1902 mt_com.mt_count = 0;
1903 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1904 clrerror_dev(dev, MTSRSZ);
1911 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
1913 return dev_cap(dev, CAP_MTIOCGET) &&
1914 ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
1915 mt_stat->mt_fileno >= 0;
1918 static char *modes[] = {
1919 "CREATE_READ_WRITE",
1926 static char *mode_to_str(int mode)
1928 return modes[mode-1];