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 get_filename(DEVICE *dev, char *VolName, POOL_MEM& archive_name);
84 void update_free_space_dev(DEVICE* dev);
87 /* Forward referenced functions */
88 void set_os_device_parameters(DEVICE *dev);
89 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat);
90 static void open_tape_device(DEVICE *dev, int mode);
91 static void open_file_device(DEVICE *dev, int mode);
94 * Allocate and initialize the DEVICE structure
95 * Note, if dev is non-NULL, it is already allocated,
96 * thus we neither allocate it nor free it. This allows
97 * the caller to put the packet in shared memory.
99 * Note, for a tape, the device->device_name is the device name
100 * (e.g. /dev/nst0), and for a file, the device name
101 * is the directory in which the file will be placed.
105 init_dev(JCR *jcr, DEVRES *device)
113 /* Check that device is available */
114 if (stat(device->device_name, &statp) < 0) {
116 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"),
117 device->device_name, be.strerror());
124 if (S_ISDIR(statp.st_mode)) {
126 } else if (S_ISCHR(statp.st_mode)) {
128 } else if (S_ISFIFO(statp.st_mode)) {
130 } else if (!(device->cap_bits & CAP_REQMOUNT)) {
131 Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory. st_mode=%x\n"),
132 device->device_name, statp.st_mode);
136 dev = (DEVICE *)get_memory(sizeof(DEVICE));
137 memset(dev, 0, sizeof(DEVICE));
138 dev->state = ST_MALLOC;
140 /* Copy user supplied device parameters from Resource */
141 dev->dev_name = get_memory(strlen(device->device_name)+1);
142 pm_strcpy(dev->dev_name, device->device_name);
143 dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
144 /* We edit "Resource-name" (physical-name) */
145 Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
146 dev->capabilities = device->cap_bits;
147 dev->min_block_size = device->min_block_size;
148 dev->max_block_size = device->max_block_size;
149 dev->max_volume_size = device->max_volume_size;
150 dev->max_file_size = device->max_file_size;
151 dev->volume_capacity = device->volume_capacity;
152 dev->max_rewind_wait = device->max_rewind_wait;
153 dev->max_open_wait = device->max_open_wait;
154 dev->max_open_vols = device->max_open_vols;
155 dev->vol_poll_interval = device->vol_poll_interval;
156 dev->max_spool_size = device->max_spool_size;
157 dev->drive_index = device->drive_index;
158 dev->autoselect = device->autoselect;
159 if (tape) { /* No parts on tapes */
160 dev->max_part_size = 0;
163 dev->max_part_size = device->max_part_size;
166 if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
167 dev->vol_poll_interval = 60;
169 dev->device = device;
172 dev->state |= ST_TAPE;
174 dev->state |= ST_FIFO;
175 dev->capabilities |= CAP_STREAM; /* set stream device */
177 dev->state |= ST_FILE;
180 /* If the device requires mount :
181 * - Check that the mount point is available
182 * - Check that (un)mount commands are defined
184 if (dev->is_file() && device->cap_bits & CAP_REQMOUNT) {
185 if (stat(device->mount_point, &statp) < 0) {
187 dev->dev_errno = errno;
188 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat mount point %s: ERR=%s\n"),
189 device->mount_point, be.strerror());
192 if (!device->mount_command || !device->unmount_command) {
193 Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n"));
195 if (!device->write_part_command) {
196 Jmsg0(jcr, M_ERROR_TERM, 0, _("Write part command must be defined for a device which requires mount.\n"));
198 dev->state |= ST_DVD;
201 if (dev->max_block_size > 1000000) {
202 Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
203 dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
204 dev->max_block_size = 0;
206 if (dev->max_block_size % TAPE_BSIZE != 0) {
207 Jmsg2(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size.\n"),
208 dev->max_block_size, dev->print_name());
211 dev->errmsg = get_pool_memory(PM_EMSG);
214 if ((errstat = pthread_mutex_init(&dev->mutex, NULL)) != 0) {
216 dev->dev_errno = errstat;
217 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
218 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
220 if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
222 dev->dev_errno = errstat;
223 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
224 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
226 if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
228 dev->dev_errno = errstat;
229 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
230 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
232 if ((errstat = pthread_mutex_init(&dev->spool_mutex, NULL)) != 0) {
234 dev->dev_errno = errstat;
235 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
236 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
238 if ((errstat = rwl_init(&dev->lock)) != 0) {
240 dev->dev_errno = errstat;
241 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
242 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
246 dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
247 Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
253 * Open the device with the operating system and
254 * initialize buffer pointers.
256 * Returns: -1 on error
259 * Note, for a tape, the VolName is the name we give to the
260 * volume (not really used here), but for a file, the
261 * VolName represents the name of the file to be created/opened.
262 * In the case of a file, the full name is the device name
263 * (archive_name) with the VolName concatenated.
266 DEVICE::open(char *VolName, int mode)
269 if (openmode == mode) {
272 ::close(fd); /* use system close so correct mode will be used on open */
276 bstrncpy(VolCatInfo.VolCatName, VolName, sizeof(VolCatInfo.VolCatName));
278 VolCatInfo.VolCatName[0] = 0;
281 Dmsg3(29, "open dev: tape=%d dev_name=%s vol=%s\n", is_tape(),
282 dev_name, VolCatInfo.VolCatName);
283 state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
284 label_type = B_BACULA_LABEL;
285 if (is_tape() || is_fifo()) {
286 open_tape_device(this, mode);
288 open_file_device(this, mode);
293 static void open_tape_device(DEVICE *dev, int mode)
295 int nonblocking = 0;;
299 Dmsg0(29, "open dev: device is tape\n");
301 if (mode == OPEN_READ_WRITE) {
302 dev->mode = O_RDWR | O_BINARY;
303 } else if (mode == OPEN_READ_ONLY) {
304 dev->mode = O_RDONLY | O_BINARY;
305 } else if (mode == OPEN_WRITE_ONLY) {
306 dev->mode = O_WRONLY | O_BINARY;
308 Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
310 timeout = dev->max_open_wait;
312 if (dev->open_nowait) {
313 /* Set wait counters to zero for no wait */
314 timeout = ioerrcnt = 0;
315 /* Open drive in non-block mode */
316 nonblocking = O_NONBLOCK;
318 if (dev->is_fifo() && timeout) {
320 dev->tid = start_thread_timer(pthread_self(), timeout);
322 /* If busy retry each second for max_open_wait seconds */
324 Dmsg1(500, "Try open %s\n", dev->dev_name);
325 while ((dev->fd = open(dev->dev_name, dev->mode, MODE_RW+nonblocking)) < 0) {
327 Dmsg2(500, "Open error errno=%d ERR=%s\n", errno, be.strerror());
328 if (errno == EINTR || errno == EAGAIN) {
329 Dmsg0(500, "Continue open\n");
332 /* Busy wait for specified time (default = 5 mins) */
333 if (errno == EBUSY && timeout-- > 0) {
334 Dmsg2(100, "Device %s busy. ERR=%s\n", dev->print_name(), be.strerror());
338 /* IO error (no volume) try 10 times every 6 seconds */
339 if (errno == EIO && ioerrcnt-- > 0) {
341 Dmsg0(500, "Continue open\n");
344 dev->dev_errno = errno;
345 Mmsg2(dev->errmsg, _("Unable to open device %s: ERR=%s\n"),
346 dev->print_name(), be.strerror(dev->dev_errno));
347 /* Stop any open timer we set */
349 stop_thread_timer(dev->tid);
352 Emsg0(M_FATAL, 0, dev->errmsg);
356 /* If opened in non-block mode, close it an open it normally */
362 dev->openmode = mode; /* save open mode */
364 dev->state |= ST_OPENED;
366 update_pos_dev(dev); /* update position */
367 set_os_device_parameters(dev); /* do system dependent stuff */
368 Dmsg0(500, "Open OK\n");
370 /* Stop any open() timer we started */
372 stop_thread_timer(dev->tid);
375 Dmsg1(29, "open dev: tape %d opened\n", dev->fd);
379 * Open a file or DVD device
381 static void open_file_device(DEVICE *dev, int mode)
383 POOL_MEM archive_name(PM_FNAME);
384 struct stat filestat;
386 * Handle opening of File Archive (not a tape)
388 if (dev->part == 0) {
393 /* if num_parts has not been set, but VolCatInfo is available, copy
394 * it from the VolCatInfo.VolCatParts */
395 if (dev->num_parts < dev->VolCatInfo.VolCatParts) {
396 dev->num_parts = dev->VolCatInfo.VolCatParts;
399 if (dev->VolCatInfo.VolCatName[0] == 0) {
400 Mmsg(dev->errmsg, _("Could not open file device %s. No Volume name given.\n"),
405 get_filename(dev, dev->VolCatInfo.VolCatName, archive_name);
407 if (mount_dev(dev, 1) < 0) {
408 Mmsg(dev->errmsg, _("Could not mount device %s.\n"),
410 Emsg0(M_FATAL, 0, dev->errmsg);
415 Dmsg3(29, "open dev: device is %s (mode:%d)\n", dev->is_dvd()?"DVD":"disk",
416 archive_name.c_str(), mode);
417 dev->openmode = mode;
420 * If we are not trying to access the last part, set mode to
421 * OPEN_READ_ONLY as writing would be an error.
423 if (dev->part < dev->num_parts) {
424 mode = OPEN_READ_ONLY;
427 if (mode == OPEN_READ_WRITE) {
428 dev->mode = O_CREAT | O_RDWR | O_BINARY;
429 } else if (mode == OPEN_READ_ONLY) {
430 dev->mode = O_RDONLY | O_BINARY;
431 } else if (mode == OPEN_WRITE_ONLY) {
432 dev->mode = O_WRONLY | O_BINARY;
434 Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
436 /* If creating file, give 0640 permissions */
437 Dmsg2(29, "open(%s, 0x%x, 0640)\n", archive_name.c_str(), dev->mode);
438 if ((dev->fd = open(archive_name.c_str(), dev->mode, 0640)) < 0) {
440 dev->dev_errno = errno;
441 Mmsg2(dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
443 Emsg0(M_FATAL, 0, dev->errmsg);
446 dev->state |= ST_OPENED;
448 update_pos_dev(dev); /* update position */
449 if (fstat(dev->fd, &filestat) < 0) {
451 dev->dev_errno = errno;
452 Mmsg2(dev->errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(),
454 Emsg0(M_FATAL, 0, dev->errmsg);
456 dev->part_size = filestat.st_size;
459 Dmsg5(29, "open dev: %s fd=%d opened, part=%d/%d, part_size=%u\n",
460 dev->is_dvd()?"DVD":"disk", dev->fd, dev->part, dev->num_parts,
462 if (dev->is_dvd() && (dev->mode != OPEN_READ_ONLY) &&
463 (dev->free_space_errno == 0 || dev->num_parts == dev->part)) {
464 update_free_space_dev(dev);
470 bool _rewind_dev(char *file, int line, DEVICE *dev)
472 Dmsg2(100, "rewind_dev called from %s:%d\n", file, line);
473 return rewind_dev(dev);
479 * Returns: true on success
482 bool rewind_dev(DEVICE *dev)
487 Dmsg1(29, "rewind_dev %s\n", dev->print_name());
489 dev->dev_errno = EBADF;
490 Mmsg1(dev->errmsg, _("Bad call to rewind_dev. Device %s not open\n"),
492 Emsg0(M_ABORT, 0, dev->errmsg);
495 dev->state &= ~(ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
496 dev->block_num = dev->file = 0;
499 if (dev->is_tape()) {
500 mt_com.mt_op = MTREW;
502 /* If we get an I/O error on rewind, it is probably because
503 * the drive is actually busy. We loop for (about 5 minutes)
504 * retrying every 5 seconds.
506 for (i=dev->max_rewind_wait; ; i -= 5) {
507 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
509 clrerror_dev(dev, MTREW);
510 if (i == dev->max_rewind_wait) {
511 Dmsg1(200, "Rewind error, %s. retrying ...\n", be.strerror());
513 if (dev->dev_errno == EIO && i > 0) {
514 Dmsg0(200, "Sleeping 5 seconds.\n");
518 Mmsg2(dev->errmsg, _("Rewind error on %s. ERR=%s.\n"),
519 dev->print_name(), be.strerror());
524 } else if (dev->is_file()) {
525 if (lseek_dev(dev, (off_t)0, SEEK_SET) < 0) {
527 dev->dev_errno = errno;
528 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
529 dev->print_name(), be.strerror());
536 void DEVICE::block(int why)
539 block_device(this, why);
543 void DEVICE::unblock()
546 unblock_device(this);
551 * Called to indicate that we have just read an
552 * EOF from the device.
554 void DEVICE::set_ateof()
564 * Called to indicate we are now at the end of the tape, and
565 * writing is not possible.
567 void DEVICE::set_ateot()
569 /* Make tape effectively read-only */
570 state |= (ST_EOF|ST_EOT|ST_WEOT);
575 * Position device to end of medium (end of data)
576 * Returns: true on succes
583 struct mtget mt_stat;
588 dev->dev_errno = EBADF;
589 Mmsg1(dev->errmsg, _("Bad call to eod_dev. Device %s not open\n"),
594 #if defined (__digital__) && defined (__unix__)
595 return fsf_dev(dev, dev->VolCatInfo.VolCatFiles);
598 Dmsg0(29, "eod_dev\n");
602 dev->state &= ~(ST_EOF); /* remove EOF flags */
603 dev->block_num = dev->file = 0;
606 if (dev->state & (ST_FIFO | ST_PROG)) {
609 if (!dev->is_tape()) {
610 pos = lseek_dev(dev, (off_t)0, SEEK_END);
611 // Dmsg1(100, "====== Seek to %lld\n", pos);
614 dev->state |= ST_EOT;
617 dev->dev_errno = errno;
619 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
620 dev->print_name(), be.strerror());
624 if (dev_cap(dev, CAP_FASTFSF) && !dev_cap(dev, CAP_EOM)) {
625 Dmsg0(100,"Using FAST FSF for EOM\n");
626 /* If unknown position, rewind */
627 if (!dev_get_os_pos(dev, &mt_stat)) {
628 if (!rewind_dev(dev)) {
632 mt_com.mt_op = MTFSF;
634 * ***FIXME*** fix code to handle case that INT16_MAX is
637 mt_com.mt_count = INT16_MAX; /* use big positive number */
638 if (mt_com.mt_count < 0) {
639 mt_com.mt_count = INT16_MAX; /* brain damaged system */
643 if (dev_cap(dev, CAP_MTIOCGET) && (dev_cap(dev, CAP_FASTFSF) || dev_cap(dev, CAP_EOM))) {
644 if (dev_cap(dev, CAP_EOM)) {
645 Dmsg0(100,"Using EOM for EOM\n");
646 mt_com.mt_op = MTEOM;
650 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
652 clrerror_dev(dev, mt_com.mt_op);
653 Dmsg1(50, "ioctl error: %s\n", be.strerror());
655 Mmsg2(dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
656 dev->print_name(), be.strerror());
660 if (!dev_get_os_pos(dev, &mt_stat)) {
662 clrerror_dev(dev, -1);
663 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
664 dev->print_name(), be.strerror());
667 Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
669 dev->file = mt_stat.mt_fileno;
675 * Rewind then use FSF until EOT reached
677 if (!rewind_dev(dev)) {
681 * Move file by file to the end of the tape
684 for (file_num=dev->file; !dev->at_eot(); file_num++) {
685 Dmsg0(200, "eod_dev: doing fsf 1\n");
686 if (!fsf_dev(dev, 1)) {
687 Dmsg0(200, "fsf_dev error.\n");
691 * Avoid infinite loop. ***FIXME*** possibly add code
692 * to set EOD or to turn off CAP_FASTFSF if on.
694 if (file_num == (int)dev->file) {
695 struct mtget mt_stat;
696 Dmsg1(100, "fsf_dev did not advance from file %d\n", file_num);
697 if (dev_get_os_pos(dev, &mt_stat)) {
698 Dmsg2(100, "Adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
700 dev->file = mt_stat.mt_fileno;
707 * Some drivers leave us after second EOF when doing
708 * MTEOM, so we must backup so that appending overwrites
711 if (dev_cap(dev, CAP_BSFATEOM)) {
712 struct mtget mt_stat;
713 /* Backup over EOF */
714 ok = bsf_dev(dev, 1);
715 /* If BSF worked and fileno is known (not -1), set file */
716 if (dev_get_os_pos(dev, &mt_stat)) {
717 Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
718 dev->file = mt_stat.mt_fileno;
720 dev->file++; /* wing it -- not correct on all OSes */
723 update_pos_dev(dev); /* update position */
725 Dmsg1(200, "EOD dev->file=%d\n", dev->file);
730 * Set the position of the device -- only for files
731 * For other devices, there is no generic way to do it.
732 * Returns: true on succes
735 bool update_pos_dev(DEVICE *dev)
741 dev->dev_errno = EBADF;
742 Mmsg0(dev->errmsg, _("Bad device call. Device not open\n"));
743 Emsg0(M_FATAL, 0, dev->errmsg);
747 /* Find out where we are */
748 if (dev->is_file()) {
751 pos = lseek_dev(dev, (off_t)0, SEEK_CUR);
754 dev->dev_errno = errno;
755 Pmsg1(000, "Seek error: ERR=%s\n", be.strerror());
756 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
757 dev->print_name(), be.strerror());
760 dev->file_addr = pos;
768 * Return the status of the device. This was meant
769 * to be a generic routine. Unfortunately, it doesn't
770 * seem possible (at least I do not know how to do it
771 * currently), which means that for the moment, this
772 * routine has very little value.
776 uint32_t status_dev(DEVICE *dev)
778 struct mtget mt_stat;
781 if (dev->state & (ST_EOT | ST_WEOT)) {
785 if (dev->state & ST_EOF) {
789 if (dev->is_tape()) {
791 Pmsg0(-20," Bacula status:");
792 Pmsg2(-20," file=%d block=%d\n", dev->file, dev->block_num);
793 if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
795 dev->dev_errno = errno;
796 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
797 dev->print_name(), be.strerror());
800 Pmsg0(-20, " Device status:");
802 #if defined(HAVE_LINUX_OS)
803 if (GMT_EOF(mt_stat.mt_gstat)) {
807 if (GMT_BOT(mt_stat.mt_gstat)) {
811 if (GMT_EOT(mt_stat.mt_gstat)) {
815 if (GMT_SM(mt_stat.mt_gstat)) {
819 if (GMT_EOD(mt_stat.mt_gstat)) {
823 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
825 Pmsg0(-20, " WR_PROT");
827 if (GMT_ONLINE(mt_stat.mt_gstat)) {
829 Pmsg0(-20, " ONLINE");
831 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
833 Pmsg0(-20, " DR_OPEN");
835 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
836 stat |= BMT_IM_REP_EN;
837 Pmsg0(-20, " IM_REP_EN");
839 #endif /* !SunOS && !OSF */
840 if (dev_cap(dev, CAP_MTIOCGET)) {
841 Pmsg2(-20, " file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
843 Pmsg2(-20, " file=%d block=%d\n", -1, -1);
846 stat |= BMT_ONLINE | BMT_BOT;
853 * Load medium in device
854 * Returns: true on success
857 bool load_dev(DEVICE *dev)
864 dev->dev_errno = EBADF;
865 Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
866 Emsg0(M_FATAL, 0, dev->errmsg);
869 if (!(dev->is_tape())) {
873 Dmsg0(200, "stored: MTLOAD command not available\n");
875 dev->dev_errno = ENOTTY; /* function not available */
876 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
877 dev->print_name(), be.strerror());
881 dev->block_num = dev->file = 0;
884 mt_com.mt_op = MTLOAD;
886 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
888 dev->dev_errno = errno;
889 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
890 dev->print_name(), be.strerror());
898 * Rewind device and put it offline
899 * Returns: true on success
902 bool offline_dev(DEVICE *dev)
907 dev->dev_errno = EBADF;
908 Mmsg0(dev->errmsg, _("Bad call to offline_dev. Device not open\n"));
909 Emsg0(M_FATAL, 0, dev->errmsg);
912 if (!(dev->is_tape())) {
916 dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
917 dev->block_num = dev->file = 0;
922 mt_com.mt_op = MTUNLOCK;
924 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
926 mt_com.mt_op = MTOFFL;
928 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
930 dev->dev_errno = errno;
931 Mmsg2(dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
932 dev->print_name(), be.strerror());
935 Dmsg1(100, "Offlined device %s\n", dev->print_name());
939 bool offline_or_rewind_dev(DEVICE *dev)
944 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
945 return offline_dev(dev);
948 * Note, this rewind probably should not be here (it wasn't
949 * in prior versions of Bacula), but on FreeBSD, this is
950 * needed in the case the tape was "frozen" due to an error
951 * such as backspacing after writing and EOF. If it is not
952 * done, all future references to the drive get and I/O error.
954 clrerror_dev(dev, MTREW);
955 return rewind_dev(dev);
960 * Foward space a file
961 * Returns: true on success
965 fsf_dev(DEVICE *dev, int num)
967 struct mtget mt_stat;
972 dev->dev_errno = EBADF;
973 Mmsg0(dev->errmsg, _("Bad call to fsf_dev. Device not open\n"));
974 Emsg0(M_FATAL, 0, dev->errmsg);
978 if (!dev->is_tape()) {
981 if (dev->state & ST_EOT) {
983 Mmsg1(dev->errmsg, _("Device %s at End of Tape.\n"), dev->print_name());
986 if (dev->state & ST_EOF) {
987 Dmsg0(200, "ST_EOF set on entry to FSF\n");
990 Dmsg0(100, "fsf_dev\n");
993 * If Fast forward space file is set, then we
994 * use MTFSF to forward space and MTIOCGET
995 * to get the file position. We assume that
996 * the SCSI driver will ensure that we do not
997 * forward space past the end of the medium.
999 if (dev_cap(dev, CAP_FSF) && dev_cap(dev, CAP_MTIOCGET) && dev_cap(dev, CAP_FASTFSF)) {
1000 mt_com.mt_op = MTFSF;
1001 mt_com.mt_count = num;
1002 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1003 if (stat < 0 || !dev_get_os_pos(dev, &mt_stat)) {
1005 dev->state |= ST_EOT;
1006 Dmsg0(200, "Set ST_EOT\n");
1007 clrerror_dev(dev, MTFSF);
1008 Mmsg2(dev->errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1009 dev->print_name(), be.strerror());
1010 Dmsg1(200, "%s", dev->errmsg);
1013 Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1015 dev->file = mt_stat.mt_fileno;
1019 * Here if CAP_FSF is set, and virtually all drives
1020 * these days support it, we read a record, then forward
1021 * space one file. Using this procedure, which is slow,
1022 * is the only way we can be sure that we don't read
1023 * two consecutive EOF marks, which means End of Data.
1025 } else if (dev_cap(dev, CAP_FSF)) {
1028 Dmsg0(200, "FSF has cap_fsf\n");
1029 if (dev->max_block_size == 0) {
1030 rbuf_len = DEFAULT_BLOCK_SIZE;
1032 rbuf_len = dev->max_block_size;
1034 rbuf = get_memory(rbuf_len);
1035 mt_com.mt_op = MTFSF;
1036 mt_com.mt_count = 1;
1037 while (num-- && !(dev->state & ST_EOT)) {
1038 Dmsg0(100, "Doing read before fsf\n");
1039 if ((stat = read(dev->fd, (char *)rbuf, rbuf_len)) < 0) {
1040 if (errno == ENOMEM) { /* tape record exceeds buf len */
1041 stat = rbuf_len; /* This is OK */
1044 dev->state |= ST_EOT;
1045 clrerror_dev(dev, -1);
1046 Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev->dev_errno,
1048 Mmsg2(dev->errmsg, _("read error on %s. ERR=%s.\n"),
1049 dev->print_name(), be.strerror());
1050 Dmsg1(100, "%s", dev->errmsg);
1054 if (stat == 0) { /* EOF */
1055 update_pos_dev(dev);
1056 Dmsg1(100, "End of File mark from read. File=%d\n", dev->file+1);
1057 /* Two reads of zero means end of tape */
1058 if (dev->state & ST_EOF) {
1059 dev->state |= ST_EOT;
1060 Dmsg0(100, "Set ST_EOT\n");
1066 } else { /* Got data */
1067 dev->state &= ~(ST_EOF|ST_EOT);
1070 Dmsg0(100, "Doing MTFSF\n");
1071 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1072 if (stat < 0) { /* error => EOT */
1074 dev->state |= ST_EOT;
1075 Dmsg0(100, "Set ST_EOT\n");
1076 clrerror_dev(dev, MTFSF);
1077 Mmsg2(dev->errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1078 dev->print_name(), be.strerror());
1079 Dmsg0(100, "Got < 0 for MTFSF\n");
1080 Dmsg1(100, "%s", dev->errmsg);
1088 * No FSF, so use FSR to simulate it
1091 Dmsg0(200, "Doing FSR for FSF\n");
1092 while (num-- && !(dev->state & ST_EOT)) {
1093 dev->fsr(INT32_MAX); /* returns -1 on EOF or EOT */
1095 if (dev->state & ST_EOT) {
1097 Mmsg1(dev->errmsg, _("Device %s at End of Tape.\n"), dev->print_name());
1103 update_pos_dev(dev);
1104 Dmsg1(200, "Return %d from FSF\n", stat);
1105 if (dev->state & ST_EOF)
1106 Dmsg0(200, "ST_EOF set on exit FSF\n");
1107 if (dev->state & ST_EOT)
1108 Dmsg0(200, "ST_EOT set on exit FSF\n");
1109 Dmsg1(200, "Return from FSF file=%d\n", dev->file);
1114 * Backward space a file
1115 * Returns: false on failure
1119 bsf_dev(DEVICE *dev, int num)
1125 dev->dev_errno = EBADF;
1126 Mmsg0(dev->errmsg, _("Bad call to bsf_dev. Device not open\n"));
1127 Emsg0(M_FATAL, 0, dev->errmsg);
1131 if (!dev->is_tape()) {
1132 Mmsg1(dev->errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1136 Dmsg0(29, "bsf_dev\n");
1137 dev->state &= ~(ST_EOT|ST_EOF);
1141 mt_com.mt_op = MTBSF;
1142 mt_com.mt_count = num;
1143 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1146 clrerror_dev(dev, MTBSF);
1147 Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1148 dev->print_name(), be.strerror());
1150 update_pos_dev(dev);
1156 * Foward space num records
1157 * Returns: false on failure
1160 bool DEVICE::fsr(int num)
1167 Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1168 Emsg0(M_FATAL, 0, errmsg);
1175 if (!dev_cap(this, CAP_FSR)) {
1176 Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1180 Dmsg1(29, "fsr %d\n", num);
1181 mt_com.mt_op = MTFSR;
1182 mt_com.mt_count = num;
1183 stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1189 struct mtget mt_stat;
1190 clrerror_dev(this, MTFSR);
1191 Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1192 if (dev_get_os_pos(this, &mt_stat)) {
1193 Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1194 block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1195 file = mt_stat.mt_fileno;
1196 block_num = mt_stat.mt_blkno;
1204 Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1205 num, print_name(), be.strerror());
1207 update_pos_dev(this);
1212 * Backward space a record
1213 * Returns: false on failure
1217 bsr_dev(DEVICE *dev, int num)
1223 dev->dev_errno = EBADF;
1224 Mmsg0(dev->errmsg, _("Bad call to bsr_dev. Device not open\n"));
1225 Emsg0(M_FATAL, 0, dev->errmsg);
1229 if (!dev->is_tape()) {
1233 if (!dev_cap(dev, CAP_BSR)) {
1234 Mmsg1(dev->errmsg, _("ioctl MTBSR not permitted on %s.\n"), dev->print_name());
1238 Dmsg0(29, "bsr_dev\n");
1239 dev->block_num -= num;
1240 dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
1241 mt_com.mt_op = MTBSR;
1242 mt_com.mt_count = num;
1243 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1246 clrerror_dev(dev, MTBSR);
1247 Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1248 dev->print_name(), be.strerror());
1250 update_pos_dev(dev);
1255 * Reposition the device to file, block
1256 * Returns: false on failure
1260 reposition_dev(DEVICE *dev, uint32_t file, uint32_t block)
1263 dev->dev_errno = EBADF;
1264 Mmsg0(dev->errmsg, _("Bad call to reposition_dev. Device not open\n"));
1265 Emsg0(M_FATAL, 0, dev->errmsg);
1269 if (!dev->is_tape()) {
1270 off_t pos = (((off_t)file)<<32) + block;
1271 Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
1272 if (lseek_dev(dev, pos, SEEK_SET) == (off_t)-1) {
1274 dev->dev_errno = errno;
1275 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
1276 dev->print_name(), be.strerror());
1280 dev->block_num = block;
1281 dev->file_addr = pos;
1284 Dmsg4(100, "reposition_dev from %u:%u to %u:%u\n",
1285 dev->file, dev->block_num, file, block);
1286 if (file < dev->file) {
1287 Dmsg0(100, "Rewind_dev\n");
1288 if (!rewind_dev(dev)) {
1292 if (file > dev->file) {
1293 Dmsg1(100, "fsf %d\n", file-dev->file);
1294 if (!fsf_dev(dev, file-dev->file)) {
1295 Dmsg1(100, "fsf failed! ERR=%s\n", strerror_dev(dev));
1298 Dmsg2(100, "wanted_file=%d at_file=%d\n", file, dev->file);
1300 if (block < dev->block_num) {
1301 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1302 Dmsg0(100, "bsf_dev 1\n");
1304 Dmsg0(100, "fsf_dev 1\n");
1306 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1308 if (dev_cap(dev, CAP_POSITIONBLOCKS) && block > dev->block_num) {
1309 /* Ignore errors as Bacula can read to the correct block */
1310 Dmsg1(100, "fsr %d\n", block-dev->block_num);
1311 return dev->fsr(block-dev->block_num);
1319 * Write an end of file on the device
1320 * Returns: 0 on success
1321 * non-zero on failure
1324 weof_dev(DEVICE *dev, int num)
1328 Dmsg0(29, "weof_dev\n");
1331 dev->dev_errno = EBADF;
1332 Mmsg0(dev->errmsg, _("Bad call to weof_dev. Device not open\n"));
1333 Emsg0(M_FATAL, 0, dev->errmsg);
1338 if (!dev->is_tape()) {
1341 if (!dev->can_append()) {
1342 Mmsg0(dev->errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1343 Emsg0(M_FATAL, 0, dev->errmsg);
1347 dev->state &= ~(ST_EOT | ST_EOF); /* remove EOF/EOT flags */
1348 mt_com.mt_op = MTWEOF;
1349 mt_com.mt_count = num;
1350 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1357 clrerror_dev(dev, MTWEOF);
1359 Mmsg2(dev->errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1360 dev->print_name(), be.strerror());
1367 * Return string message with last error in English
1368 * Be careful not to call this routine from within dev.c
1369 * while editing an Mmsg() or you will end up in a recursive
1370 * loop creating a Segmentation Violation.
1373 strerror_dev(DEVICE *dev)
1380 * If implemented in system, clear the tape
1384 clrerror_dev(DEVICE *dev, int func)
1386 const char *msg = NULL;
1387 struct mtget mt_stat;
1390 dev->dev_errno = errno; /* save errno */
1392 dev->VolCatInfo.VolCatErrors++;
1395 if (!dev->is_tape()) {
1398 if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1401 Emsg0(M_ABORT, 0, "Got ENOTTY on read/write!\n");
1405 dev->capabilities &= ~CAP_EOF; /* turn off feature */
1410 dev->capabilities &= ~CAP_EOM; /* turn off feature */
1415 dev->capabilities &= ~CAP_FSF; /* turn off feature */
1419 dev->capabilities &= ~CAP_BSF; /* turn off feature */
1423 dev->capabilities &= ~CAP_FSR; /* turn off feature */
1427 dev->capabilities &= ~CAP_BSR; /* turn off feature */
1448 bsnprintf(buf, sizeof(buf), "unknown func code %d", func);
1453 dev->dev_errno = ENOSYS;
1454 Mmsg1(dev->errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1455 Emsg0(M_ERROR, 0, dev->errmsg);
1458 /* On some systems such as NetBSD, this clears all errors */
1459 ioctl(dev->fd, MTIOCGET, (char *)&mt_stat);
1461 /* Found on Linux */
1465 mt_com.mt_op = MTIOCLRERR;
1466 mt_com.mt_count = 1;
1467 /* Clear any error condition on the tape */
1468 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1469 Dmsg0(200, "Did MTIOCLRERR\n");
1473 /* Typically on FreeBSD */
1476 /* Read and clear SCSI error status */
1477 union mterrstat mt_errstat;
1478 Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev->dev_errno,
1479 strerror(dev->dev_errno));
1480 ioctl(dev->fd, MTIOCERRSTAT, (char *)&mt_errstat);
1484 /* Clear Subsystem Exception OSF1 */
1488 mt_com.mt_op = MTCSE;
1489 mt_com.mt_count = 1;
1490 /* Clear any error condition on the tape */
1491 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1492 Dmsg0(200, "Did MTCSE\n");
1498 * Flush buffer contents
1501 int flush_dev(DEVICE *dev)
1506 static void do_close(DEVICE *dev)
1509 Dmsg1(29, "really close_dev %s\n", dev->print_name());
1514 if (unmount_dev(dev, 1) < 0) {
1515 Dmsg1(0, "Cannot unmount device %s.\n", dev->print_name());
1518 /* Remove the last part file if it is empty */
1519 if (dev->can_append() && (dev->num_parts > 0)) {
1521 POOL_MEM archive_name(PM_FNAME);
1522 dev->part = dev->num_parts;
1523 get_filename(dev, dev->VolCatInfo.VolCatName, archive_name);
1524 /* Check that the part file is empty */
1525 if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
1526 unlink(archive_name.c_str());
1530 /* Clean up device packet so it can be reused */
1532 dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1533 dev->label_type = B_BACULA_LABEL;
1534 dev->file = dev->block_num = 0;
1539 dev->part_start = 0;
1540 dev->EndFile = dev->EndBlock = 0;
1541 memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
1542 memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
1544 stop_thread_timer(dev->tid);
1554 void DEVICE::close()
1556 /*if (fd >= 0 && use_count == 1) {*/
1557 /* No need to check if fd >= 0: it is checked again
1558 * in do_close, and do_close MUST be called for volumes
1559 * splitted in parts, even if fd == -1. */
1560 if (use_count == 1) {
1562 } else if (use_count > 0) {
1567 ASSERT(use_count >= 0);
1572 bool truncate_dev(DEVICE *dev)
1574 Dmsg1(100, "truncate_dev %s\n", dev->print_name());
1575 if (dev->is_tape()) {
1576 return true; /* we don't really truncate tapes */
1577 /* maybe we should rewind and write and eof ???? */
1580 /* If there is more than one part, open the first one, and then truncate it. */
1581 if (dev->num_parts > 0) {
1583 dev->VolCatInfo.VolCatParts = 0;
1584 if (open_first_part(dev) < 0) {
1586 Mmsg1(dev->errmsg, "Unable to truncate device, because I'm unable to open the first part. ERR=%s\n", be.strerror());
1590 if (ftruncate(dev->fd, 0) != 0) {
1592 Mmsg1(dev->errmsg, _("Unable to truncate device. ERR=%s\n"), be.strerror());
1598 /* Return the resource name for the device */
1599 const char *DEVICE::name() const
1601 return device->hdr.name;
1605 dev_vol_name(DEVICE *dev)
1607 return dev->VolCatInfo.VolCatName;
1610 uint32_t dev_block(DEVICE *dev)
1612 update_pos_dev(dev);
1613 return dev->block_num;
1616 uint32_t dev_file(DEVICE *dev)
1618 update_pos_dev(dev);
1623 * Free memory allocated for the device
1626 term_dev(DEVICE *dev)
1629 dev->dev_errno = EBADF;
1630 Mmsg0(dev->errmsg, _("Bad call to term_dev. Device not open\n"));
1631 Emsg0(M_FATAL, 0, dev->errmsg);
1635 Dmsg0(29, "term_dev\n");
1636 if (dev->dev_name) {
1637 free_memory(dev->dev_name);
1638 dev->dev_name = NULL;
1640 if (dev->prt_name) {
1641 free_memory(dev->prt_name);
1642 dev->prt_name = NULL;
1645 free_pool_memory(dev->errmsg);
1648 pthread_mutex_destroy(&dev->mutex);
1649 pthread_cond_destroy(&dev->wait);
1650 pthread_cond_destroy(&dev->wait_next_vol);
1651 pthread_mutex_destroy(&dev->spool_mutex);
1652 rwl_destroy(&dev->lock);
1653 if (dev->attached_dcrs) {
1654 delete dev->attached_dcrs;
1655 dev->attached_dcrs = NULL;
1657 if (dev->state & ST_MALLOC) {
1658 free_pool_memory((POOLMEM *)dev);
1663 * This routine initializes the device wait timers
1665 void init_device_wait_timers(DCR *dcr)
1667 DEVICE *dev = dcr->dev;
1668 JCR *jcr = dcr->jcr;
1670 /* ******FIXME******* put these on config variables */
1671 dev->min_wait = 60 * 60;
1672 dev->max_wait = 24 * 60 * 60;
1673 dev->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1674 dev->wait_sec = dev->min_wait;
1675 dev->rem_wait_sec = dev->wait_sec;
1678 dev->BadVolName[0] = 0;
1680 jcr->min_wait = 60 * 60;
1681 jcr->max_wait = 24 * 60 * 60;
1682 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1683 jcr->wait_sec = jcr->min_wait;
1684 jcr->rem_wait_sec = jcr->wait_sec;
1689 void init_jcr_device_wait_timers(JCR *jcr)
1691 /* ******FIXME******* put these on config variables */
1692 jcr->min_wait = 60 * 60;
1693 jcr->max_wait = 24 * 60 * 60;
1694 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1695 jcr->wait_sec = jcr->min_wait;
1696 jcr->rem_wait_sec = jcr->wait_sec;
1702 * The dev timers are used for waiting on a particular device
1704 * Returns: true if time doubled
1705 * false if max time expired
1707 bool double_dev_wait_time(DEVICE *dev)
1709 dev->wait_sec *= 2; /* double wait time */
1710 if (dev->wait_sec > dev->max_wait) { /* but not longer than maxtime */
1711 dev->wait_sec = dev->max_wait;
1714 dev->rem_wait_sec = dev->wait_sec;
1715 if (dev->num_wait >= dev->max_num_wait) {
1722 void set_os_device_parameters(DEVICE *dev)
1724 #ifdef HAVE_LINUX_OS
1726 if (dev->min_block_size == dev->max_block_size &&
1727 dev->min_block_size == 0) { /* variable block mode */
1728 mt_com.mt_op = MTSETBLK;
1729 mt_com.mt_count = 0;
1730 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1731 clrerror_dev(dev, MTSETBLK);
1733 mt_com.mt_op = MTSETDRVBUFFER;
1734 mt_com.mt_count = MT_ST_CLEARBOOLEANS;
1735 if (!dev_cap(dev, CAP_TWOEOF)) {
1736 mt_com.mt_count |= MT_ST_TWO_FM;
1738 if (dev_cap(dev, CAP_EOM)) {
1739 mt_com.mt_count |= MT_ST_FAST_MTEOM;
1741 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1742 clrerror_dev(dev, MTSETBLK);
1748 #ifdef HAVE_NETBSD_OS
1750 if (dev->min_block_size == dev->max_block_size &&
1751 dev->min_block_size == 0) { /* variable block mode */
1752 mt_com.mt_op = MTSETBSIZ;
1753 mt_com.mt_count = 0;
1754 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1755 clrerror_dev(dev, MTSETBSIZ);
1757 /* Get notified at logical end of tape */
1758 mt_com.mt_op = MTEWARN;
1759 mt_com.mt_count = 1;
1760 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1761 clrerror_dev(dev, MTEWARN);
1767 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
1769 if (dev->min_block_size == dev->max_block_size &&
1770 dev->min_block_size == 0) { /* variable block mode */
1771 mt_com.mt_op = MTSETBSIZ;
1772 mt_com.mt_count = 0;
1773 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1774 clrerror_dev(dev, MTSETBSIZ);
1782 if (dev->min_block_size == dev->max_block_size &&
1783 dev->min_block_size == 0) { /* variable block mode */
1784 mt_com.mt_op = MTSRSZ;
1785 mt_com.mt_count = 0;
1786 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1787 clrerror_dev(dev, MTSRSZ);
1794 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
1796 return dev_cap(dev, CAP_MTIOCGET) &&
1797 ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
1798 mt_stat->mt_fileno >= 0;