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);
92 static void open_dvd_device(DEVICE *dev, int mode);
95 * Allocate and initialize the DEVICE structure
96 * Note, if dev is non-NULL, it is already allocated,
97 * thus we neither allocate it nor free it. This allows
98 * the caller to put the packet in shared memory.
100 * Note, for a tape, the device->device_name is the device name
101 * (e.g. /dev/nst0), and for a file, the device name
102 * is the directory in which the file will be placed.
106 init_dev(JCR *jcr, DEVRES *device)
114 /* Check that device is available */
115 if (stat(device->device_name, &statp) < 0) {
117 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"),
118 device->device_name, be.strerror());
125 if (S_ISDIR(statp.st_mode)) {
127 } else if (S_ISCHR(statp.st_mode)) {
129 } else if (S_ISFIFO(statp.st_mode)) {
131 } else if (!(device->cap_bits & CAP_REQMOUNT)) {
132 Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory. st_mode=%x\n"),
133 device->device_name, statp.st_mode);
137 dev = (DEVICE *)get_memory(sizeof(DEVICE));
138 memset(dev, 0, sizeof(DEVICE));
139 dev->state = ST_MALLOC;
141 /* Copy user supplied device parameters from Resource */
142 dev->dev_name = get_memory(strlen(device->device_name)+1);
143 pm_strcpy(dev->dev_name, device->device_name);
144 dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
145 /* We edit "Resource-name" (physical-name) */
146 Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
147 dev->capabilities = device->cap_bits;
148 dev->min_block_size = device->min_block_size;
149 dev->max_block_size = device->max_block_size;
150 dev->max_volume_size = device->max_volume_size;
151 dev->max_file_size = device->max_file_size;
152 dev->volume_capacity = device->volume_capacity;
153 dev->max_rewind_wait = device->max_rewind_wait;
154 dev->max_open_wait = device->max_open_wait;
155 dev->max_open_vols = device->max_open_vols;
156 dev->vol_poll_interval = device->vol_poll_interval;
157 dev->max_spool_size = device->max_spool_size;
158 dev->drive_index = device->drive_index;
159 dev->autoselect = device->autoselect;
160 if (tape) { /* No parts on tapes */
161 dev->max_part_size = 0;
164 dev->max_part_size = device->max_part_size;
167 if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
168 dev->vol_poll_interval = 60;
170 dev->device = device;
173 dev->state |= ST_TAPE;
175 dev->state |= ST_FIFO;
176 dev->capabilities |= CAP_STREAM; /* set stream device */
178 dev->state |= ST_FILE;
181 /* If the device requires mount :
182 * - Check that the mount point is available
183 * - Check that (un)mount commands are defined
185 if (dev->is_file() && dev->requires_mount()) {
186 if (stat(device->mount_point, &statp) < 0) {
188 dev->dev_errno = errno;
189 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat mount point %s: ERR=%s\n"),
190 device->mount_point, be.strerror());
193 if (!device->mount_command || !device->unmount_command) {
194 Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n"));
196 if (!device->write_part_command) {
197 Jmsg0(jcr, M_ERROR_TERM, 0, _("Write part command must be defined for a device which requires mount.\n"));
199 dev->state |= ST_DVD;
202 if (dev->max_block_size > 1000000) {
203 Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
204 dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
205 dev->max_block_size = 0;
207 if (dev->max_block_size % TAPE_BSIZE != 0) {
208 Jmsg2(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size.\n"),
209 dev->max_block_size, dev->print_name());
212 dev->errmsg = get_pool_memory(PM_EMSG);
215 if ((errstat = pthread_mutex_init(&dev->mutex, NULL)) != 0) {
217 dev->dev_errno = errstat;
218 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
219 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
221 if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
223 dev->dev_errno = errstat;
224 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
225 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
227 if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
229 dev->dev_errno = errstat;
230 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
231 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
233 if ((errstat = pthread_mutex_init(&dev->spool_mutex, NULL)) != 0) {
235 dev->dev_errno = errstat;
236 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
237 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
239 if ((errstat = rwl_init(&dev->lock)) != 0) {
241 dev->dev_errno = errstat;
242 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
243 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
247 dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
248 Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
254 * Open the device with the operating system and
255 * initialize buffer pointers.
257 * Returns: -1 on error
260 * Note, for a tape, the VolName is the name we give to the
261 * volume (not really used here), but for a file, the
262 * VolName represents the name of the file to be created/opened.
263 * In the case of a file, the full name is the device name
264 * (archive_name) with the VolName concatenated.
267 DEVICE::open(char *VolName, int mode)
270 if (openmode == mode) {
273 ::close(fd); /* use system close so correct mode will be used on open */
277 bstrncpy(VolCatInfo.VolCatName, VolName, sizeof(VolCatInfo.VolCatName));
279 VolCatInfo.VolCatName[0] = 0;
282 Dmsg4(29, "open dev: tape=%d dev_name=%s vol=%s mode=%d\n", is_tape(),
283 dev_name, VolCatInfo.VolCatName, mode);
284 state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
285 label_type = B_BACULA_LABEL;
286 if (is_tape() || is_fifo()) {
287 open_tape_device(this, mode);
288 } else if (is_dvd()) {
289 Dmsg1(100, "call open_dvd_device mode=%d\n", mode);
290 open_dvd_device(this, mode);
292 Dmsg1(100, "call open_file_device mode=%d\n", mode);
293 open_file_device(this, mode);
298 void DEVICE::set_mode(int new_mode)
301 case CREATE_READ_WRITE:
302 mode = O_CREAT | O_RDWR | O_BINARY;
304 case OPEN_READ_WRITE:
305 if (is_dvd() || is_file()) {
306 mode = O_CREAT | O_RDWR | O_BINARY;
308 mode = O_RDWR | O_BINARY;
312 mode = O_RDONLY | O_BINARY;
314 case OPEN_WRITE_ONLY:
315 mode = O_WRONLY | O_BINARY;
318 Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
322 static void open_tape_device(DEVICE *dev, int mode)
324 int nonblocking = 0;;
328 Dmsg0(29, "open dev: device is tape\n");
331 timeout = dev->max_open_wait;
333 if (dev->open_nowait) {
334 /* Set wait counters to zero for no wait */
335 timeout = ioerrcnt = 0;
336 /* Open drive in non-block mode */
337 nonblocking = O_NONBLOCK;
339 if (dev->is_fifo() && timeout) {
341 dev->tid = start_thread_timer(pthread_self(), timeout);
343 /* If busy retry each second for max_open_wait seconds */
345 Dmsg1(500, "Try open %s\n", dev->dev_name);
346 while ((dev->fd = open(dev->dev_name, dev->mode, MODE_RW+nonblocking)) < 0) {
348 Dmsg2(500, "Open error errno=%d ERR=%s\n", errno, be.strerror());
349 if (errno == EINTR || errno == EAGAIN) {
350 Dmsg0(500, "Continue open\n");
353 /* Busy wait for specified time (default = 5 mins) */
354 if (errno == EBUSY && timeout-- > 0) {
355 Dmsg2(100, "Device %s busy. ERR=%s\n", dev->print_name(), be.strerror());
359 /* IO error (no volume) try 10 times every 6 seconds */
360 if (errno == EIO && ioerrcnt-- > 0) {
362 Dmsg0(500, "Continue open\n");
365 dev->dev_errno = errno;
366 Mmsg2(dev->errmsg, _("Unable to open device %s: ERR=%s\n"),
367 dev->print_name(), be.strerror(dev->dev_errno));
368 /* Stop any open timer we set */
370 stop_thread_timer(dev->tid);
373 Emsg0(M_FATAL, 0, dev->errmsg);
377 /* If opened in non-block mode, close it an open it normally */
383 dev->openmode = mode; /* save open mode */
385 dev->state |= ST_OPENED;
387 update_pos_dev(dev); /* update position */
388 set_os_device_parameters(dev); /* do system dependent stuff */
389 Dmsg0(500, "Open OK\n");
391 /* Stop any open() timer we started */
393 stop_thread_timer(dev->tid);
396 Dmsg1(29, "open dev: tape %d opened\n", dev->fd);
402 static void open_file_device(DEVICE *dev, int mode)
404 POOL_MEM archive_name(PM_FNAME);
407 * Handle opening of File Archive (not a tape)
409 Dmsg3(29, "Enter: open_file_dev: %s dev=%s mode=%d\n", dev->is_dvd()?"DVD":"disk",
410 archive_name.c_str(), mode);
412 if (dev->VolCatInfo.VolCatName[0] == 0) {
413 Mmsg(dev->errmsg, _("Could not open file device %s. No Volume name given.\n"),
419 Dmsg1(100, "Call get_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
420 get_filename(dev, dev->VolCatInfo.VolCatName, archive_name);
422 Dmsg3(29, "open dev: %s dev=%s mode=%d\n", dev->is_dvd()?"DVD":"disk",
423 archive_name.c_str(), mode);
424 dev->openmode = mode;
427 /* If creating file, give 0640 permissions */
428 Dmsg3(29, "mode=%d open(%s, 0x%x, 0640)\n", mode, archive_name.c_str(), dev->mode);
429 if ((dev->fd = open(archive_name.c_str(), dev->mode, 0640)) < 0) {
431 dev->dev_errno = errno;
432 Mmsg2(dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
434 Dmsg1(29, "open failed: %s", dev->errmsg);
435 Emsg0(M_FATAL, 0, dev->errmsg);
438 dev->state |= ST_OPENED;
440 update_pos_dev(dev); /* update position */
442 Dmsg5(29, "open dev: %s fd=%d opened, part=%d/%d, part_size=%u\n",
443 dev->is_dvd()?"DVD":"disk", dev->fd, dev->part, dev->num_parts,
450 static void open_dvd_device(DEVICE *dev, int mode)
452 POOL_MEM archive_name(PM_FNAME);
453 struct stat filestat;
456 * Handle opening of File Archive (not a tape)
458 Dmsg3(29, "Enter: open_file_dev: %s dev=%s mode=%d\n", dev->is_dvd()?"DVD":"disk",
459 archive_name.c_str(), mode);
461 if (dev->VolCatInfo.VolCatName[0] == 0) {
462 Mmsg(dev->errmsg, _("Could not open file device %s. No Volume name given.\n"),
468 if (dev->part == 0) {
473 /* if num_parts has not been set, but VolCatInfo is available, copy
474 * it from the VolCatInfo.VolCatParts */
475 if (dev->num_parts < dev->VolCatInfo.VolCatParts) {
476 dev->num_parts = dev->VolCatInfo.VolCatParts;
479 Dmsg1(100, "Call get_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
480 get_filename(dev, dev->VolCatInfo.VolCatName, archive_name);
482 if (mount_dev(dev, 1) < 0) {
483 Mmsg(dev->errmsg, _("Could not mount device %s.\n"),
485 Emsg0(M_FATAL, 0, dev->errmsg);
490 Dmsg3(29, "open dev: %s dev=%s mode=%d\n", dev->is_dvd()?"DVD":"disk",
491 archive_name.c_str(), mode);
492 dev->openmode = mode;
495 * If we are not trying to access the last part, set mode to
496 * OPEN_READ_ONLY as writing would be an error.
498 if (dev->part < dev->num_parts) {
499 mode = OPEN_READ_ONLY;
503 /* If creating file, give 0640 permissions */
504 Dmsg3(29, "mode=%d open(%s, 0x%x, 0640)\n", mode, archive_name.c_str(), dev->mode);
505 if ((dev->fd = open(archive_name.c_str(), dev->mode, 0640)) < 0) {
507 dev->dev_errno = errno;
508 Mmsg2(dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
510 Dmsg1(29, "open failed: %s", dev->errmsg);
512 /* Get size of file */
513 if (fstat(dev->fd, &filestat) < 0) {
515 dev->dev_errno = errno;
516 Mmsg2(dev->errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(),
518 Dmsg1(29, "open failed: %s", dev->errmsg);
522 dev->part_size = filestat.st_size;
524 dev->state |= ST_OPENED;
526 update_pos_dev(dev); /* update position */
529 Dmsg4(29, "open dev: DVD fd=%d opened, part=%d/%d, part_size=%u\n",
530 dev->fd, dev->part, dev->num_parts, dev->part_size);
531 if (dev->is_open() && dev->is_dvd() && (mode != OPEN_READ_ONLY) &&
532 (dev->free_space_errno == 0 || dev->num_parts == dev->part)) {
533 update_free_space_dev(dev);
540 bool _rewind_dev(char *file, int line, DEVICE *dev)
542 Dmsg2(100, "rewind_dev called from %s:%d\n", file, line);
543 return rewind_dev(dev);
549 * Returns: true on success
552 bool rewind_dev(DEVICE *dev)
557 Dmsg1(29, "rewind_dev %s\n", dev->print_name());
559 dev->dev_errno = EBADF;
560 Mmsg1(dev->errmsg, _("Bad call to rewind_dev. Device %s not open\n"),
562 Emsg0(M_ABORT, 0, dev->errmsg);
565 dev->state &= ~(ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
566 dev->block_num = dev->file = 0;
569 if (dev->is_tape()) {
570 mt_com.mt_op = MTREW;
572 /* If we get an I/O error on rewind, it is probably because
573 * the drive is actually busy. We loop for (about 5 minutes)
574 * retrying every 5 seconds.
576 for (i=dev->max_rewind_wait; ; i -= 5) {
577 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
579 clrerror_dev(dev, MTREW);
580 if (i == dev->max_rewind_wait) {
581 Dmsg1(200, "Rewind error, %s. retrying ...\n", be.strerror());
583 if (dev->dev_errno == EIO && i > 0) {
584 Dmsg0(200, "Sleeping 5 seconds.\n");
588 Mmsg2(dev->errmsg, _("Rewind error on %s. ERR=%s.\n"),
589 dev->print_name(), be.strerror());
594 } else if (dev->is_file()) {
595 if (lseek_dev(dev, (off_t)0, SEEK_SET) < 0) {
597 dev->dev_errno = errno;
598 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
599 dev->print_name(), be.strerror());
606 void DEVICE::block(int why)
609 block_device(this, why);
613 void DEVICE::unblock()
616 unblock_device(this);
621 * Called to indicate that we have just read an
622 * EOF from the device.
624 void DEVICE::set_ateof()
634 * Called to indicate we are now at the end of the tape, and
635 * writing is not possible.
637 void DEVICE::set_ateot()
639 /* Make tape effectively read-only */
640 state |= (ST_EOF|ST_EOT|ST_WEOT);
645 * Position device to end of medium (end of data)
646 * Returns: true on succes
653 struct mtget mt_stat;
658 dev->dev_errno = EBADF;
659 Mmsg1(dev->errmsg, _("Bad call to eod_dev. Device %s not open\n"),
664 #if defined (__digital__) && defined (__unix__)
665 return fsf_dev(dev, dev->VolCatInfo.VolCatFiles);
668 Dmsg0(29, "eod_dev\n");
672 dev->state &= ~(ST_EOF); /* remove EOF flags */
673 dev->block_num = dev->file = 0;
676 if (dev->state & (ST_FIFO | ST_PROG)) {
679 if (!dev->is_tape()) {
680 pos = lseek_dev(dev, (off_t)0, SEEK_END);
681 // Dmsg1(100, "====== Seek to %lld\n", pos);
684 dev->state |= ST_EOT;
687 dev->dev_errno = errno;
689 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
690 dev->print_name(), be.strerror());
694 if (dev_cap(dev, CAP_FASTFSF) && !dev_cap(dev, CAP_EOM)) {
695 Dmsg0(100,"Using FAST FSF for EOM\n");
696 /* If unknown position, rewind */
697 if (!dev_get_os_pos(dev, &mt_stat)) {
698 if (!rewind_dev(dev)) {
702 mt_com.mt_op = MTFSF;
704 * ***FIXME*** fix code to handle case that INT16_MAX is
707 mt_com.mt_count = INT16_MAX; /* use big positive number */
708 if (mt_com.mt_count < 0) {
709 mt_com.mt_count = INT16_MAX; /* brain damaged system */
713 if (dev_cap(dev, CAP_MTIOCGET) && (dev_cap(dev, CAP_FASTFSF) || dev_cap(dev, CAP_EOM))) {
714 if (dev_cap(dev, CAP_EOM)) {
715 Dmsg0(100,"Using EOM for EOM\n");
716 mt_com.mt_op = MTEOM;
720 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
722 clrerror_dev(dev, mt_com.mt_op);
723 Dmsg1(50, "ioctl error: %s\n", be.strerror());
725 Mmsg2(dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
726 dev->print_name(), be.strerror());
730 if (!dev_get_os_pos(dev, &mt_stat)) {
732 clrerror_dev(dev, -1);
733 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
734 dev->print_name(), be.strerror());
737 Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
739 dev->file = mt_stat.mt_fileno;
745 * Rewind then use FSF until EOT reached
747 if (!rewind_dev(dev)) {
751 * Move file by file to the end of the tape
754 for (file_num=dev->file; !dev->at_eot(); file_num++) {
755 Dmsg0(200, "eod_dev: doing fsf 1\n");
756 if (!fsf_dev(dev, 1)) {
757 Dmsg0(200, "fsf_dev error.\n");
761 * Avoid infinite loop. ***FIXME*** possibly add code
762 * to set EOD or to turn off CAP_FASTFSF if on.
764 if (file_num == (int)dev->file) {
765 struct mtget mt_stat;
766 Dmsg1(100, "fsf_dev did not advance from file %d\n", file_num);
767 if (dev_get_os_pos(dev, &mt_stat)) {
768 Dmsg2(100, "Adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
770 dev->file = mt_stat.mt_fileno;
777 * Some drivers leave us after second EOF when doing
778 * MTEOM, so we must backup so that appending overwrites
781 if (dev_cap(dev, CAP_BSFATEOM)) {
782 struct mtget mt_stat;
783 /* Backup over EOF */
784 ok = bsf_dev(dev, 1);
785 /* If BSF worked and fileno is known (not -1), set file */
786 if (dev_get_os_pos(dev, &mt_stat)) {
787 Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
788 dev->file = mt_stat.mt_fileno;
790 dev->file++; /* wing it -- not correct on all OSes */
793 update_pos_dev(dev); /* update position */
795 Dmsg1(200, "EOD dev->file=%d\n", dev->file);
800 * Set the position of the device -- only for files
801 * For other devices, there is no generic way to do it.
802 * Returns: true on succes
805 bool update_pos_dev(DEVICE *dev)
811 dev->dev_errno = EBADF;
812 Mmsg0(dev->errmsg, _("Bad device call. Device not open\n"));
813 Emsg0(M_FATAL, 0, dev->errmsg);
817 /* Find out where we are */
818 if (dev->is_file()) {
821 pos = lseek_dev(dev, (off_t)0, SEEK_CUR);
824 dev->dev_errno = errno;
825 Pmsg1(000, "Seek error: ERR=%s\n", be.strerror());
826 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
827 dev->print_name(), be.strerror());
830 dev->file_addr = pos;
838 * Return the status of the device. This was meant
839 * to be a generic routine. Unfortunately, it doesn't
840 * seem possible (at least I do not know how to do it
841 * currently), which means that for the moment, this
842 * routine has very little value.
846 uint32_t status_dev(DEVICE *dev)
848 struct mtget mt_stat;
851 if (dev->state & (ST_EOT | ST_WEOT)) {
855 if (dev->state & ST_EOF) {
859 if (dev->is_tape()) {
861 Pmsg0(-20," Bacula status:");
862 Pmsg2(-20," file=%d block=%d\n", dev->file, dev->block_num);
863 if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
865 dev->dev_errno = errno;
866 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
867 dev->print_name(), be.strerror());
870 Pmsg0(-20, " Device status:");
872 #if defined(HAVE_LINUX_OS)
873 if (GMT_EOF(mt_stat.mt_gstat)) {
877 if (GMT_BOT(mt_stat.mt_gstat)) {
881 if (GMT_EOT(mt_stat.mt_gstat)) {
885 if (GMT_SM(mt_stat.mt_gstat)) {
889 if (GMT_EOD(mt_stat.mt_gstat)) {
893 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
895 Pmsg0(-20, " WR_PROT");
897 if (GMT_ONLINE(mt_stat.mt_gstat)) {
899 Pmsg0(-20, " ONLINE");
901 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
903 Pmsg0(-20, " DR_OPEN");
905 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
906 stat |= BMT_IM_REP_EN;
907 Pmsg0(-20, " IM_REP_EN");
909 #endif /* !SunOS && !OSF */
910 if (dev_cap(dev, CAP_MTIOCGET)) {
911 Pmsg2(-20, " file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
913 Pmsg2(-20, " file=%d block=%d\n", -1, -1);
916 stat |= BMT_ONLINE | BMT_BOT;
923 * Load medium in device
924 * Returns: true on success
927 bool load_dev(DEVICE *dev)
934 dev->dev_errno = EBADF;
935 Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
936 Emsg0(M_FATAL, 0, dev->errmsg);
939 if (!(dev->is_tape())) {
943 Dmsg0(200, "stored: MTLOAD command not available\n");
945 dev->dev_errno = ENOTTY; /* function not available */
946 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
947 dev->print_name(), be.strerror());
951 dev->block_num = dev->file = 0;
954 mt_com.mt_op = MTLOAD;
956 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
958 dev->dev_errno = errno;
959 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
960 dev->print_name(), be.strerror());
968 * Rewind device and put it offline
969 * Returns: true on success
972 bool offline_dev(DEVICE *dev)
977 dev->dev_errno = EBADF;
978 Mmsg0(dev->errmsg, _("Bad call to offline_dev. Device not open\n"));
979 Emsg0(M_FATAL, 0, dev->errmsg);
982 if (!(dev->is_tape())) {
986 dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
987 dev->block_num = dev->file = 0;
992 mt_com.mt_op = MTUNLOCK;
994 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
996 mt_com.mt_op = MTOFFL;
998 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1000 dev->dev_errno = errno;
1001 Mmsg2(dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1002 dev->print_name(), be.strerror());
1005 Dmsg1(100, "Offlined device %s\n", dev->print_name());
1009 bool offline_or_rewind_dev(DEVICE *dev)
1014 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
1015 return offline_dev(dev);
1018 * Note, this rewind probably should not be here (it wasn't
1019 * in prior versions of Bacula), but on FreeBSD, this is
1020 * needed in the case the tape was "frozen" due to an error
1021 * such as backspacing after writing and EOF. If it is not
1022 * done, all future references to the drive get and I/O error.
1024 clrerror_dev(dev, MTREW);
1025 return rewind_dev(dev);
1030 * Foward space a file
1031 * Returns: true on success
1035 fsf_dev(DEVICE *dev, int num)
1037 struct mtget mt_stat;
1042 dev->dev_errno = EBADF;
1043 Mmsg0(dev->errmsg, _("Bad call to fsf_dev. Device not open\n"));
1044 Emsg0(M_FATAL, 0, dev->errmsg);
1048 if (!dev->is_tape()) {
1051 if (dev->state & ST_EOT) {
1053 Mmsg1(dev->errmsg, _("Device %s at End of Tape.\n"), dev->print_name());
1056 if (dev->state & ST_EOF) {
1057 Dmsg0(200, "ST_EOF set on entry to FSF\n");
1060 Dmsg0(100, "fsf_dev\n");
1063 * If Fast forward space file is set, then we
1064 * use MTFSF to forward space and MTIOCGET
1065 * to get the file position. We assume that
1066 * the SCSI driver will ensure that we do not
1067 * forward space past the end of the medium.
1069 if (dev_cap(dev, CAP_FSF) && dev_cap(dev, CAP_MTIOCGET) && dev_cap(dev, CAP_FASTFSF)) {
1070 mt_com.mt_op = MTFSF;
1071 mt_com.mt_count = num;
1072 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1073 if (stat < 0 || !dev_get_os_pos(dev, &mt_stat)) {
1075 dev->state |= ST_EOT;
1076 Dmsg0(200, "Set ST_EOT\n");
1077 clrerror_dev(dev, MTFSF);
1078 Mmsg2(dev->errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1079 dev->print_name(), be.strerror());
1080 Dmsg1(200, "%s", dev->errmsg);
1083 Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1085 dev->file = mt_stat.mt_fileno;
1089 * Here if CAP_FSF is set, and virtually all drives
1090 * these days support it, we read a record, then forward
1091 * space one file. Using this procedure, which is slow,
1092 * is the only way we can be sure that we don't read
1093 * two consecutive EOF marks, which means End of Data.
1095 } else if (dev_cap(dev, CAP_FSF)) {
1098 Dmsg0(200, "FSF has cap_fsf\n");
1099 if (dev->max_block_size == 0) {
1100 rbuf_len = DEFAULT_BLOCK_SIZE;
1102 rbuf_len = dev->max_block_size;
1104 rbuf = get_memory(rbuf_len);
1105 mt_com.mt_op = MTFSF;
1106 mt_com.mt_count = 1;
1107 while (num-- && !(dev->state & ST_EOT)) {
1108 Dmsg0(100, "Doing read before fsf\n");
1109 if ((stat = read(dev->fd, (char *)rbuf, rbuf_len)) < 0) {
1110 if (errno == ENOMEM) { /* tape record exceeds buf len */
1111 stat = rbuf_len; /* This is OK */
1114 dev->state |= ST_EOT;
1115 clrerror_dev(dev, -1);
1116 Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev->dev_errno,
1118 Mmsg2(dev->errmsg, _("read error on %s. ERR=%s.\n"),
1119 dev->print_name(), be.strerror());
1120 Dmsg1(100, "%s", dev->errmsg);
1124 if (stat == 0) { /* EOF */
1125 update_pos_dev(dev);
1126 Dmsg1(100, "End of File mark from read. File=%d\n", dev->file+1);
1127 /* Two reads of zero means end of tape */
1128 if (dev->state & ST_EOF) {
1129 dev->state |= ST_EOT;
1130 Dmsg0(100, "Set ST_EOT\n");
1136 } else { /* Got data */
1137 dev->state &= ~(ST_EOF|ST_EOT);
1140 Dmsg0(100, "Doing MTFSF\n");
1141 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1142 if (stat < 0) { /* error => EOT */
1144 dev->state |= ST_EOT;
1145 Dmsg0(100, "Set ST_EOT\n");
1146 clrerror_dev(dev, MTFSF);
1147 Mmsg2(dev->errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1148 dev->print_name(), be.strerror());
1149 Dmsg0(100, "Got < 0 for MTFSF\n");
1150 Dmsg1(100, "%s", dev->errmsg);
1158 * No FSF, so use FSR to simulate it
1161 Dmsg0(200, "Doing FSR for FSF\n");
1162 while (num-- && !(dev->state & ST_EOT)) {
1163 dev->fsr(INT32_MAX); /* returns -1 on EOF or EOT */
1165 if (dev->state & ST_EOT) {
1167 Mmsg1(dev->errmsg, _("Device %s at End of Tape.\n"), dev->print_name());
1173 update_pos_dev(dev);
1174 Dmsg1(200, "Return %d from FSF\n", stat);
1175 if (dev->state & ST_EOF)
1176 Dmsg0(200, "ST_EOF set on exit FSF\n");
1177 if (dev->state & ST_EOT)
1178 Dmsg0(200, "ST_EOT set on exit FSF\n");
1179 Dmsg1(200, "Return from FSF file=%d\n", dev->file);
1184 * Backward space a file
1185 * Returns: false on failure
1189 bsf_dev(DEVICE *dev, int num)
1195 dev->dev_errno = EBADF;
1196 Mmsg0(dev->errmsg, _("Bad call to bsf_dev. Device not open\n"));
1197 Emsg0(M_FATAL, 0, dev->errmsg);
1201 if (!dev->is_tape()) {
1202 Mmsg1(dev->errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1206 Dmsg0(29, "bsf_dev\n");
1207 dev->state &= ~(ST_EOT|ST_EOF);
1211 mt_com.mt_op = MTBSF;
1212 mt_com.mt_count = num;
1213 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1216 clrerror_dev(dev, MTBSF);
1217 Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1218 dev->print_name(), be.strerror());
1220 update_pos_dev(dev);
1226 * Foward space num records
1227 * Returns: false on failure
1230 bool DEVICE::fsr(int num)
1237 Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1238 Emsg0(M_FATAL, 0, errmsg);
1245 if (!dev_cap(this, CAP_FSR)) {
1246 Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1250 Dmsg1(29, "fsr %d\n", num);
1251 mt_com.mt_op = MTFSR;
1252 mt_com.mt_count = num;
1253 stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1259 struct mtget mt_stat;
1260 clrerror_dev(this, MTFSR);
1261 Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1262 if (dev_get_os_pos(this, &mt_stat)) {
1263 Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1264 block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1265 file = mt_stat.mt_fileno;
1266 block_num = mt_stat.mt_blkno;
1274 Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1275 num, print_name(), be.strerror());
1277 update_pos_dev(this);
1282 * Backward space a record
1283 * Returns: false on failure
1287 bsr_dev(DEVICE *dev, int num)
1293 dev->dev_errno = EBADF;
1294 Mmsg0(dev->errmsg, _("Bad call to bsr_dev. Device not open\n"));
1295 Emsg0(M_FATAL, 0, dev->errmsg);
1299 if (!dev->is_tape()) {
1303 if (!dev_cap(dev, CAP_BSR)) {
1304 Mmsg1(dev->errmsg, _("ioctl MTBSR not permitted on %s.\n"), dev->print_name());
1308 Dmsg0(29, "bsr_dev\n");
1309 dev->block_num -= num;
1310 dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
1311 mt_com.mt_op = MTBSR;
1312 mt_com.mt_count = num;
1313 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1316 clrerror_dev(dev, MTBSR);
1317 Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1318 dev->print_name(), be.strerror());
1320 update_pos_dev(dev);
1325 * Reposition the device to file, block
1326 * Returns: false on failure
1330 reposition_dev(DEVICE *dev, uint32_t file, uint32_t block)
1333 dev->dev_errno = EBADF;
1334 Mmsg0(dev->errmsg, _("Bad call to reposition_dev. Device not open\n"));
1335 Emsg0(M_FATAL, 0, dev->errmsg);
1339 if (!dev->is_tape()) {
1340 off_t pos = (((off_t)file)<<32) + block;
1341 Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
1342 if (lseek_dev(dev, pos, SEEK_SET) == (off_t)-1) {
1344 dev->dev_errno = errno;
1345 Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
1346 dev->print_name(), be.strerror());
1350 dev->block_num = block;
1351 dev->file_addr = pos;
1354 Dmsg4(100, "reposition_dev from %u:%u to %u:%u\n",
1355 dev->file, dev->block_num, file, block);
1356 if (file < dev->file) {
1357 Dmsg0(100, "Rewind_dev\n");
1358 if (!rewind_dev(dev)) {
1362 if (file > dev->file) {
1363 Dmsg1(100, "fsf %d\n", file-dev->file);
1364 if (!fsf_dev(dev, file-dev->file)) {
1365 Dmsg1(100, "fsf failed! ERR=%s\n", strerror_dev(dev));
1368 Dmsg2(100, "wanted_file=%d at_file=%d\n", file, dev->file);
1370 if (block < dev->block_num) {
1371 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1372 Dmsg0(100, "bsf_dev 1\n");
1374 Dmsg0(100, "fsf_dev 1\n");
1376 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1378 if (dev_cap(dev, CAP_POSITIONBLOCKS) && block > dev->block_num) {
1379 /* Ignore errors as Bacula can read to the correct block */
1380 Dmsg1(100, "fsr %d\n", block-dev->block_num);
1381 return dev->fsr(block-dev->block_num);
1389 * Write an end of file on the device
1390 * Returns: 0 on success
1391 * non-zero on failure
1394 weof_dev(DEVICE *dev, int num)
1398 Dmsg0(29, "weof_dev\n");
1401 dev->dev_errno = EBADF;
1402 Mmsg0(dev->errmsg, _("Bad call to weof_dev. Device not open\n"));
1403 Emsg0(M_FATAL, 0, dev->errmsg);
1408 if (!dev->is_tape()) {
1411 if (!dev->can_append()) {
1412 Mmsg0(dev->errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1413 Emsg0(M_FATAL, 0, dev->errmsg);
1417 dev->state &= ~(ST_EOT | ST_EOF); /* remove EOF/EOT flags */
1418 mt_com.mt_op = MTWEOF;
1419 mt_com.mt_count = num;
1420 stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1427 clrerror_dev(dev, MTWEOF);
1429 Mmsg2(dev->errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1430 dev->print_name(), be.strerror());
1437 * Return string message with last error in English
1438 * Be careful not to call this routine from within dev.c
1439 * while editing an Mmsg() or you will end up in a recursive
1440 * loop creating a Segmentation Violation.
1443 strerror_dev(DEVICE *dev)
1450 * If implemented in system, clear the tape
1454 clrerror_dev(DEVICE *dev, int func)
1456 const char *msg = NULL;
1457 struct mtget mt_stat;
1460 dev->dev_errno = errno; /* save errno */
1462 dev->VolCatInfo.VolCatErrors++;
1465 if (!dev->is_tape()) {
1468 if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1471 Emsg0(M_ABORT, 0, "Got ENOTTY on read/write!\n");
1475 dev->capabilities &= ~CAP_EOF; /* turn off feature */
1480 dev->capabilities &= ~CAP_EOM; /* turn off feature */
1485 dev->capabilities &= ~CAP_FSF; /* turn off feature */
1489 dev->capabilities &= ~CAP_BSF; /* turn off feature */
1493 dev->capabilities &= ~CAP_FSR; /* turn off feature */
1497 dev->capabilities &= ~CAP_BSR; /* turn off feature */
1518 bsnprintf(buf, sizeof(buf), "unknown func code %d", func);
1523 dev->dev_errno = ENOSYS;
1524 Mmsg1(dev->errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1525 Emsg0(M_ERROR, 0, dev->errmsg);
1528 /* On some systems such as NetBSD, this clears all errors */
1529 ioctl(dev->fd, MTIOCGET, (char *)&mt_stat);
1531 /* Found on Linux */
1535 mt_com.mt_op = MTIOCLRERR;
1536 mt_com.mt_count = 1;
1537 /* Clear any error condition on the tape */
1538 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1539 Dmsg0(200, "Did MTIOCLRERR\n");
1543 /* Typically on FreeBSD */
1546 /* Read and clear SCSI error status */
1547 union mterrstat mt_errstat;
1548 Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev->dev_errno,
1549 strerror(dev->dev_errno));
1550 ioctl(dev->fd, MTIOCERRSTAT, (char *)&mt_errstat);
1554 /* Clear Subsystem Exception OSF1 */
1558 mt_com.mt_op = MTCSE;
1559 mt_com.mt_count = 1;
1560 /* Clear any error condition on the tape */
1561 ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1562 Dmsg0(200, "Did MTCSE\n");
1568 * Flush buffer contents
1571 int flush_dev(DEVICE *dev)
1576 static void do_close(DEVICE *dev)
1579 Dmsg1(29, "really close_dev %s\n", dev->print_name());
1584 if (unmount_dev(dev, 1) < 0) {
1585 Dmsg1(0, "Cannot unmount device %s.\n", dev->print_name());
1588 /* Remove the last part file if it is empty */
1589 if (dev->can_append() && (dev->num_parts > 0)) {
1591 POOL_MEM archive_name(PM_FNAME);
1592 dev->part = dev->num_parts;
1593 Dmsg1(100, "Call get_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
1594 get_filename(dev, dev->VolCatInfo.VolCatName, archive_name);
1595 /* Check that the part file is empty */
1596 if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
1597 Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
1598 unlink(archive_name.c_str());
1602 /* Clean up device packet so it can be reused */
1604 dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1605 dev->label_type = B_BACULA_LABEL;
1606 dev->file = dev->block_num = 0;
1611 dev->part_start = 0;
1612 dev->EndFile = dev->EndBlock = 0;
1613 memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
1614 memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
1616 stop_thread_timer(dev->tid);
1626 void DEVICE::close()
1628 /*if (fd >= 0 && use_count == 1) {*/
1629 /* No need to check if fd >= 0: it is checked again
1630 * in do_close, and do_close MUST be called for volumes
1631 * splitted in parts, even if fd == -1. */
1632 if (use_count == 1) {
1634 } else if (use_count > 0) {
1639 ASSERT(use_count >= 0);
1644 bool truncate_dev(DEVICE *dev)
1646 Dmsg1(100, "truncate_dev %s\n", dev->print_name());
1647 if (dev->is_tape()) {
1648 return true; /* we don't really truncate tapes */
1649 /* maybe we should rewind and write and eof ???? */
1652 /* If there is more than one part, open the first one, and then truncate it. */
1653 if (dev->num_parts > 0) {
1655 dev->VolCatInfo.VolCatParts = 0;
1656 if (open_first_part(dev, OPEN_READ_WRITE) < 0) {
1658 Mmsg1(dev->errmsg, "Unable to truncate device, because I'm unable to open the first part. ERR=%s\n", be.strerror());
1662 if (ftruncate(dev->fd, 0) != 0) {
1664 Mmsg1(dev->errmsg, _("Unable to truncate device. ERR=%s\n"), be.strerror());
1670 /* Return the resource name for the device */
1671 const char *DEVICE::name() const
1673 return device->hdr.name;
1677 dev_vol_name(DEVICE *dev)
1679 return dev->VolCatInfo.VolCatName;
1682 uint32_t dev_block(DEVICE *dev)
1684 update_pos_dev(dev);
1685 return dev->block_num;
1688 uint32_t dev_file(DEVICE *dev)
1690 update_pos_dev(dev);
1695 * Free memory allocated for the device
1698 term_dev(DEVICE *dev)
1701 dev->dev_errno = EBADF;
1702 Mmsg0(dev->errmsg, _("Bad call to term_dev. Device not open\n"));
1703 Emsg0(M_FATAL, 0, dev->errmsg);
1707 Dmsg0(29, "term_dev\n");
1708 if (dev->dev_name) {
1709 free_memory(dev->dev_name);
1710 dev->dev_name = NULL;
1712 if (dev->prt_name) {
1713 free_memory(dev->prt_name);
1714 dev->prt_name = NULL;
1717 free_pool_memory(dev->errmsg);
1720 pthread_mutex_destroy(&dev->mutex);
1721 pthread_cond_destroy(&dev->wait);
1722 pthread_cond_destroy(&dev->wait_next_vol);
1723 pthread_mutex_destroy(&dev->spool_mutex);
1724 rwl_destroy(&dev->lock);
1725 if (dev->attached_dcrs) {
1726 delete dev->attached_dcrs;
1727 dev->attached_dcrs = NULL;
1729 if (dev->state & ST_MALLOC) {
1730 free_pool_memory((POOLMEM *)dev);
1735 * This routine initializes the device wait timers
1737 void init_device_wait_timers(DCR *dcr)
1739 DEVICE *dev = dcr->dev;
1740 JCR *jcr = dcr->jcr;
1742 /* ******FIXME******* put these on config variables */
1743 dev->min_wait = 60 * 60;
1744 dev->max_wait = 24 * 60 * 60;
1745 dev->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1746 dev->wait_sec = dev->min_wait;
1747 dev->rem_wait_sec = dev->wait_sec;
1750 dev->BadVolName[0] = 0;
1752 jcr->min_wait = 60 * 60;
1753 jcr->max_wait = 24 * 60 * 60;
1754 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1755 jcr->wait_sec = jcr->min_wait;
1756 jcr->rem_wait_sec = jcr->wait_sec;
1761 void init_jcr_device_wait_timers(JCR *jcr)
1763 /* ******FIXME******* put these on config variables */
1764 jcr->min_wait = 60 * 60;
1765 jcr->max_wait = 24 * 60 * 60;
1766 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
1767 jcr->wait_sec = jcr->min_wait;
1768 jcr->rem_wait_sec = jcr->wait_sec;
1774 * The dev timers are used for waiting on a particular device
1776 * Returns: true if time doubled
1777 * false if max time expired
1779 bool double_dev_wait_time(DEVICE *dev)
1781 dev->wait_sec *= 2; /* double wait time */
1782 if (dev->wait_sec > dev->max_wait) { /* but not longer than maxtime */
1783 dev->wait_sec = dev->max_wait;
1786 dev->rem_wait_sec = dev->wait_sec;
1787 if (dev->num_wait >= dev->max_num_wait) {
1794 void set_os_device_parameters(DEVICE *dev)
1796 #ifdef HAVE_LINUX_OS
1798 if (dev->min_block_size == dev->max_block_size &&
1799 dev->min_block_size == 0) { /* variable block mode */
1800 mt_com.mt_op = MTSETBLK;
1801 mt_com.mt_count = 0;
1802 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1803 clrerror_dev(dev, MTSETBLK);
1805 mt_com.mt_op = MTSETDRVBUFFER;
1806 mt_com.mt_count = MT_ST_CLEARBOOLEANS;
1807 if (!dev_cap(dev, CAP_TWOEOF)) {
1808 mt_com.mt_count |= MT_ST_TWO_FM;
1810 if (dev_cap(dev, CAP_EOM)) {
1811 mt_com.mt_count |= MT_ST_FAST_MTEOM;
1813 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1814 clrerror_dev(dev, MTSETBLK);
1820 #ifdef HAVE_NETBSD_OS
1822 if (dev->min_block_size == dev->max_block_size &&
1823 dev->min_block_size == 0) { /* variable block mode */
1824 mt_com.mt_op = MTSETBSIZ;
1825 mt_com.mt_count = 0;
1826 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1827 clrerror_dev(dev, MTSETBSIZ);
1829 /* Get notified at logical end of tape */
1830 mt_com.mt_op = MTEWARN;
1831 mt_com.mt_count = 1;
1832 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1833 clrerror_dev(dev, MTEWARN);
1839 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
1841 if (dev->min_block_size == dev->max_block_size &&
1842 dev->min_block_size == 0) { /* variable block mode */
1843 mt_com.mt_op = MTSETBSIZ;
1844 mt_com.mt_count = 0;
1845 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1846 clrerror_dev(dev, MTSETBSIZ);
1854 if (dev->min_block_size == dev->max_block_size &&
1855 dev->min_block_size == 0) { /* variable block mode */
1856 mt_com.mt_op = MTSRSZ;
1857 mt_com.mt_count = 0;
1858 if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1859 clrerror_dev(dev, MTSRSZ);
1866 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
1868 return dev_cap(dev, CAP_MTIOCGET) &&
1869 ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
1870 mt_stat->mt_fileno >= 0;