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 may 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-2006 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 /* Forward referenced functions */
83 void set_os_device_parameters(DEVICE *dev);
84 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat);
85 static char *mode_to_str(int mode);
88 * Allocate and initialize the DEVICE structure
89 * Note, if dev is non-NULL, it is already allocated,
90 * thus we neither allocate it nor free it. This allows
91 * the caller to put the packet in shared memory.
93 * Note, for a tape, the device->device_name is the device name
94 * (e.g. /dev/nst0), and for a file, the device name
95 * is the directory in which the file will be placed.
99 init_dev(JCR *jcr, DEVRES *device)
107 /* If no device type specified, try to guess */
108 if (!device->dev_type) {
109 /* Check that device is available */
110 if (stat(device->device_name, &statp) < 0) {
112 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"),
113 device->device_name, be.strerror());
116 if (S_ISDIR(statp.st_mode)) {
117 device->dev_type = B_FILE_DEV;
118 } else if (S_ISCHR(statp.st_mode)) {
119 device->dev_type = B_TAPE_DEV;
120 } else if (S_ISFIFO(statp.st_mode)) {
121 device->dev_type = B_FILE_DEV;
122 } else if (!(device->cap_bits & CAP_REQMOUNT)) {
123 Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory\n"
124 " or have RequiresMount=yes for DVD. st_mode=%x\n"),
125 device->device_name, statp.st_mode);
128 device->dev_type = B_DVD_DEV;
132 dev = (DEVICE *)malloc(sizeof(DEVICE));
133 memset(dev, 0, sizeof(DEVICE));
134 dev->Slot = -1; /* unknown */
136 /* Copy user supplied device parameters from Resource */
137 dev->dev_name = get_memory(strlen(device->device_name)+1);
138 pm_strcpy(dev->dev_name, device->device_name);
139 dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
140 /* We edit "Resource-name" (physical-name) */
141 Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
142 Dmsg1(400, "Allocate dev=%s\n", dev->print_name());
143 dev->capabilities = device->cap_bits;
144 dev->min_block_size = device->min_block_size;
145 dev->max_block_size = device->max_block_size;
146 dev->max_volume_size = device->max_volume_size;
147 dev->max_file_size = device->max_file_size;
148 dev->volume_capacity = device->volume_capacity;
149 dev->max_rewind_wait = device->max_rewind_wait;
150 dev->max_open_wait = device->max_open_wait;
151 dev->max_open_vols = device->max_open_vols;
152 dev->vol_poll_interval = device->vol_poll_interval;
153 dev->max_spool_size = device->max_spool_size;
154 dev->drive_index = device->drive_index;
155 dev->autoselect = device->autoselect;
156 dev->dev_type = device->dev_type;
157 if (dev->is_tape()) { /* No parts on tapes */
158 dev->max_part_size = 0;
160 dev->max_part_size = device->max_part_size;
163 if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
164 dev->vol_poll_interval = 60;
166 /* Link the dev and device structures together */
167 dev->device = device;
170 if (dev->is_fifo()) {
171 dev->capabilities |= CAP_STREAM; /* set stream device */
174 /* If the device requires mount :
175 * - Check that the mount point is available
176 * - Check that (un)mount commands are defined
178 if ((dev->is_file() || dev->is_dvd()) && dev->requires_mount()) {
179 if (!device->mount_point || stat(device->mount_point, &statp) < 0) {
181 dev->dev_errno = errno;
182 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat mount point %s: ERR=%s\n"),
183 device->mount_point, be.strerror());
188 if (!device->mount_command || !device->unmount_command) {
189 Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n"));
191 if (!device->write_part_command) {
192 Jmsg0(jcr, M_ERROR_TERM, 0, _("Write part command must be defined for a device which requires mount.\n"));
196 if (dev->max_block_size > 1000000) {
197 Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
198 dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
199 dev->max_block_size = 0;
201 if (dev->max_block_size % TAPE_BSIZE != 0) {
202 Jmsg2(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size.\n"),
203 dev->max_block_size, dev->print_name());
206 dev->errmsg = get_pool_memory(PM_EMSG);
209 if ((errstat = pthread_mutex_init(&dev->mutex, NULL)) != 0) {
211 dev->dev_errno = errstat;
212 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
213 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
215 if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
217 dev->dev_errno = errstat;
218 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
219 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
221 if ((errstat = pthread_cond_init(&dev->wait_next_vol, 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_mutex_init(&dev->spool_mutex, NULL)) != 0) {
229 dev->dev_errno = errstat;
230 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
231 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
233 if ((errstat = rwl_init(&dev->lock)) != 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);
241 dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
242 Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
248 * Open the device with the operating system and
249 * initialize buffer pointers.
251 * Returns: -1 on error
254 * Note, for a tape, the VolName is the name we give to the
255 * volume (not really used here), but for a file, the
256 * VolName represents the name of the file to be created/opened.
257 * In the case of a file, the full name is the device name
258 * (archive_name) with the VolName concatenated.
261 DEVICE::open(DCR *dcr, int omode)
265 if (openmode == omode) {
274 Dmsg0(100, "Close fd for mode change.\n");
275 preserve = state & (ST_LABEL|ST_APPEND|ST_READ);
279 bstrncpy(VolCatInfo.VolCatName, dcr->VolumeName, sizeof(VolCatInfo.VolCatName));
282 Dmsg4(29, "open dev: type=%d dev_name=%s vol=%s mode=%s\n", dev_type,
283 print_name(), VolCatInfo.VolCatName, mode_to_str(omode));
284 state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
285 Slot = -1; /* unknown slot */
286 label_type = B_BACULA_LABEL;
287 if (is_tape() || is_fifo()) {
288 open_tape_device(dcr, omode);
289 } else if (is_dvd()) {
290 Dmsg1(100, "call open_dvd_device mode=%s\n", mode_to_str(omode));
291 open_dvd_device(dcr, omode);
293 Dmsg1(100, "call open_file_device mode=%s\n", mode_to_str(omode));
294 open_file_device(dcr, omode);
296 state |= preserve; /* reset any important state info */
297 Dmsg2(100, "preserve=0x%x fd=%d\n", preserve, fd);
301 void DEVICE::set_mode(int new_mode)
304 case CREATE_READ_WRITE:
305 mode = O_CREAT | O_RDWR | O_BINARY;
307 case OPEN_READ_WRITE:
308 mode = O_RDWR | O_BINARY;
311 mode = O_RDONLY | O_BINARY;
313 case OPEN_WRITE_ONLY:
314 mode = O_WRONLY | O_BINARY;
317 Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
323 void DEVICE::open_tape_device(DCR *dcr, int omode)
326 int timeout = max_open_wait;
328 utime_t start_time = time(NULL);
331 Dmsg0(29, "Open dev: device is tape\n");
333 get_autochanger_loaded_slot(dcr);
340 if (is_fifo() && timeout) {
342 tid = start_thread_timer(pthread_self(), timeout);
344 /* If busy retry each second for max_open_wait seconds */
345 Dmsg2(100, "Try open %s mode=%s\n", print_name(), mode_to_str(omode));
346 /* Use system open() */
347 #if defined(HAVE_WIN32)
350 if ((fd = tape_open(dev_name, mode)) < 0) {
357 /* Try non-blocking open */
358 fd = ::open(dev_name, mode+O_NONBLOCK);
362 Dmsg5(050, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n",
363 print_name(), omode, mode, errno, be.strerror());
365 /* Tape open, now rewind it */
366 mt_com.mt_op = MTREW;
368 if (tape_ioctl(fd, MTIOCTOP, (char *)&mt_com) < 0) {
370 dev_errno = errno; /* set error status from rewind */
373 Dmsg2(100, "Rewind error on %s close: ERR=%s\n", print_name(),
374 be.strerror(dev_errno));
375 /* If we get busy, device is probably rewinding, try again */
376 if (dev_errno != EBUSY) {
377 break; /* error -- no medium */
380 /* Got fd and rewind worked, so we must have medium in drive */
382 fd = ::open(dev_name, mode); /* open normally */
386 Dmsg5(050, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n",
387 print_name(), omode, mode, errno, be.strerror());
392 set_os_device_parameters(this); /* do system dependent stuff */
393 break; /* Successfully opened and rewound */
397 /* Exceed wait time ? */
398 if (time(NULL) - start_time >= max_open_wait) {
399 break; /* yes, get out */
406 Mmsg2(errmsg, _("Unable to open device %s: ERR=%s\n"),
407 print_name(), be.strerror(dev_errno));
408 Dmsg1(100, "%s", errmsg);
411 /* Stop any open() timer we started */
413 stop_thread_timer(tid);
416 Dmsg1(29, "open dev: tape %d opened\n", fd);
423 void DEVICE::open_file_device(DCR *dcr, int omode)
425 POOL_MEM archive_name(PM_FNAME);
427 get_autochanger_loaded_slot(dcr);
430 * Handle opening of File Archive (not a tape)
433 pm_strcpy(archive_name, dev_name);
435 * If this is a virtual autochanger (i.e. changer_res != NULL)
436 * we simply use the device name, assuming it has been
437 * appropriately setup by the "autochanger".
439 if (!device->changer_res) {
440 if (VolCatInfo.VolCatName[0] == 0) {
441 Mmsg(errmsg, _("Could not open file device %s. No Volume name given.\n"),
447 if (archive_name.c_str()[strlen(archive_name.c_str())-1] != '/') {
448 pm_strcat(archive_name, "/");
450 pm_strcat(archive_name, VolCatInfo.VolCatName);
453 mount(1); /* do mount if required */
457 /* If creating file, give 0640 permissions */
458 Dmsg3(29, "open disk: mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode),
459 archive_name.c_str(), mode);
460 /* Use system open() */
461 if ((fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
464 Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
466 Dmsg1(29, "open failed: %s", errmsg);
467 Emsg0(M_FATAL, 0, errmsg);
473 Dmsg4(29, "open dev: disk fd=%d opened, part=%d/%d, part_size=%u\n",
474 fd, part, num_dvd_parts, part_size);
478 * Open a DVD device. N.B. at this point, dcr->VolCatInfo.VolCatName
479 * (NB:??? I think it's VolCatInfo.VolCatName that is right)
480 * has the desired Volume name, but there is NO assurance that
481 * any other field of VolCatInfo is correct.
483 void DEVICE::open_dvd_device(DCR *dcr, int omode)
485 POOL_MEM archive_name(PM_FNAME);
486 struct stat filestat;
489 * Handle opening of DVD Volume
491 Dmsg3(29, "Enter: open_dvd_dev: %s dev=%s mode=%s\n", is_dvd()?"DVD":"disk",
492 archive_name.c_str(), mode_to_str(omode));
495 * For a DVD we must always pull the state info from dcr->VolCatInfo
496 * This is a bit ugly, but is necessary because we need to open/close/re-open
497 * the dvd file in order to properly mount/unmount and access the
498 * DVD. So we store the state of the DVD as far as is known in the
499 * catalog in dcr->VolCatInfo, and thus we refresh the dev->VolCatInfo
500 * copy here, when opening.
502 memcpy(&VolCatInfo, &dcr->VolCatInfo, sizeof(VolCatInfo));
503 Dmsg1(100, "Volume=%s\n", VolCatInfo.VolCatName);
505 if (VolCatInfo.VolCatName[0] == 0) {
506 Dmsg1(10, "Could not open file device %s. No Volume name given.\n",
508 Mmsg(errmsg, _("Could not open file device %s. No Volume name given.\n"),
515 Dmsg0(100, "Set part=1\n");
516 part = 1; /* count from 1 */
520 if (num_dvd_parts != VolCatInfo.VolCatParts) {
521 num_dvd_parts = VolCatInfo.VolCatParts;
525 * If we are not trying to access the last part, set mode to
526 * OPEN_READ_ONLY as writing would be an error.
528 Dmsg2(29, "open DVD part=%d num_dvd_parts=%d\n", part, num_dvd_parts);
529 if (part <= num_dvd_parts) {
530 omode = OPEN_READ_ONLY;
531 make_mounted_dvd_filename(this, archive_name);
532 set_part_spooled(false);
534 omode = OPEN_READ_WRITE;
535 make_spooled_dvd_filename(this, archive_name);
536 set_part_spooled(true);
540 // Clear any previous blank_dvd status - we will recalculate it here
543 Dmsg3(99, "open_dvd_device: part=%d num_dvd_parts=%d, VolCatInfo.VolCatParts=%d\n",
544 part, num_dvd_parts, dcr->VolCatInfo.VolCatParts);
546 if (mount_dvd(this, 1)) {
547 Dmsg0(99, "DVD device mounted.\n");
548 if (num_dvd_parts == 0 && !truncating) {
550 * If we can mount the device, and we are not truncating the DVD,
551 * we usually want to abort. There is one exception, if there is
552 * only one 0-sized file on the DVD, with the right volume name,
553 * we continue (it's the method used by truncate_dvd to truncate a volume).
555 if (!check_can_write_on_non_blank_dvd(dcr)) {
556 Mmsg(errmsg, _("The DVD in device %s contains data, please blank it before writing.\n"), print_name());
557 Emsg0(M_FATAL, 0, errmsg);
558 unmount_dvd(this, 1); /* Unmount the device, so the operator can change it. */
565 Dmsg0(99, "DVD device mount failed.\n");
566 /* We cannot mount the device */
567 if (num_dvd_parts == 0) {
568 /* Run free space, check there is a media. */
569 if (!update_free_space_dev(this)) {
570 Emsg0(M_FATAL, 0, errmsg);
575 Dmsg1(29, "Could not mount device %s, this is not a problem (num_dvd_parts == 0), and have media.\n", print_name());
577 Mmsg(errmsg, _("There is no valid DVD in device %s.\n"), print_name());
578 Emsg0(M_FATAL, 0, errmsg);
583 Mmsg(errmsg, _("Could not mount DVD device %s.\n"), print_name());
584 Emsg0(M_FATAL, 0, errmsg);
590 Dmsg5(29, "open dev: DVD dev=%s mode=%s part=%d npart=%d volcatnparts=%d\n",
591 archive_name.c_str(), mode_to_str(omode),
592 part, num_dvd_parts, dcr->VolCatInfo.VolCatParts);
594 Dmsg2(100, "openmode=%d %s\n", openmode, mode_to_str(openmode));
597 /* If creating file, give 0640 permissions */
598 Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode),
599 archive_name.c_str(), mode);
600 /* Use system open() */
601 if ((fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
603 Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
605 // Should this be set if we try the create/open below
606 dev_errno = EIO; /* Interpreted as no device present by acquire.c:acquire_device_for_read(). */
607 Dmsg1(29, "open failed: %s", errmsg);
609 /* Previous open failed. See if we can recover */
610 if ((omode == OPEN_READ_ONLY || omode == OPEN_READ_WRITE) &&
611 (part > num_dvd_parts)) {
612 /* If the last part (on spool), doesn't exist when accessing,
613 * create it. In read/write mode a write will be allowed (higher
614 * level software thinks that we are extending a pre-existing
615 * media. Reads for READ_ONLY will report immediately an EOF
616 * Sometimes it is better to finish with an EOF than with an error. */
617 Dmsg1(29, "Creating last part on spool: %s\n", archive_name.c_str());
618 omode = CREATE_READ_WRITE;
619 set_mode(CREATE_READ_WRITE);
620 fd = ::open(archive_name.c_str(), mode, 0640);
624 Dmsg1(100, "after open fd=%d\n", fd);
626 if (omode == OPEN_READ_WRITE || omode == CREATE_READ_WRITE) {
629 /* Get size of file */
630 if (fstat(fd, &filestat) < 0) {
633 Mmsg2(errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(),
635 Dmsg1(29, "open failed: %s", errmsg);
636 /* Use system close() */
640 part_size = filestat.st_size;
642 update_pos(dcr); /* update position */
650 * Returns: true on success
653 bool DEVICE::rewind(DCR *dcr)
659 Dmsg3(400, "rewind res=%d fd=%d %s\n", reserved_device, fd, print_name());
660 state &= ~(ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
661 block_num = file = 0;
665 if (!is_dvd()) { /* In case of major error, the fd is not open on DVD, so we don't want to abort. */
667 Mmsg1(errmsg, _("Bad call to rewind. Device %s not open\n"),
669 Emsg0(M_ABORT, 0, errmsg);
674 mt_com.mt_op = MTREW;
676 /* If we get an I/O error on rewind, it is probably because
677 * the drive is actually busy. We loop for (about 5 minutes)
678 * retrying every 5 seconds.
680 for (i=max_rewind_wait; ; i -= 5) {
681 if (tape_ioctl(fd, MTIOCTOP, (char *)&mt_com) < 0) {
684 if (i == max_rewind_wait) {
685 Dmsg1(200, "Rewind error, %s. retrying ...\n", be.strerror());
688 * This is a gross hack, because if the user has the
689 * device mounted (i.e. open), then uses mtx to load
690 * a tape, the current open file descriptor is invalid.
691 * So, we close the drive and re-open it.
694 int open_mode = openmode;
697 open(dcr, open_mode);
705 if (dev_errno == EIO) {
706 Mmsg1(errmsg, _("No tape loaded or drive offline on %s.\n"), print_name());
710 if (dev_errno == EIO && i > 0) {
711 Dmsg0(200, "Sleeping 5 seconds.\n");
716 Mmsg2(errmsg, _("Rewind error on %s. ERR=%s.\n"),
717 print_name(), be.strerror());
722 } else if (is_file() || is_dvd()) {
723 if (lseek(dcr, (off_t)0, SEEK_SET) < 0) {
726 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
727 print_name(), be.strerror());
734 void DEVICE::block(int why)
737 block_device(this, why);
741 void DEVICE::unblock()
744 unblock_device(this);
748 const char *DEVICE::print_blocked() const
750 switch (dev_blocked) {
751 case BST_NOT_BLOCKED:
752 return "BST_NOT_BLOCKED";
754 return "BST_UNMOUNTED";
755 case BST_WAITING_FOR_SYSOP:
756 return "BST_WAITING_FOR_SYSOP";
757 case BST_DOING_ACQUIRE:
758 return "BST_DOING_ACQUIRE";
759 case BST_WRITING_LABEL:
760 return "BST_WRITING_LABEL";
761 case BST_UNMOUNTED_WAITING_FOR_SYSOP:
762 return "BST_UNMOUNTED_WAITING_FOR_SYSOP";
766 return _("unknown blocked code");
771 * Called to indicate that we have just read an
772 * EOF from the device.
774 void DEVICE::set_ateof()
786 * Called to indicate we are now at the end of the tape, and
787 * writing is not possible.
789 void DEVICE::set_ateot()
791 /* Make tape effectively read-only */
792 state |= (ST_EOF|ST_EOT|ST_WEOT);
797 * Position device to end of medium (end of data)
798 * Returns: true on succes
801 bool DEVICE::eod(DCR *dcr)
804 struct mtget mt_stat;
810 Mmsg1(errmsg, _("Bad call to eod. Device %s not open\n"), print_name());
814 #if defined (__digital__) && defined (__unix__)
815 return fsf(VolCatInfo.VolCatFiles);
822 clear_eof(); /* remove EOF flag */
823 block_num = file = 0;
826 if (is_fifo() || is_prog()) {
830 pos = lseek(dcr, (off_t)0, SEEK_END);
831 // Dmsg1(100, "====== Seek to %lld\n", pos);
839 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
840 print_name(), be.strerror());
844 if (has_cap(CAP_FASTFSF) && !has_cap(CAP_EOM)) {
845 Dmsg0(100,"Using FAST FSF for EOM\n");
846 /* If unknown position, rewind */
847 if (!dev_get_os_pos(this, &mt_stat)) {
852 mt_com.mt_op = MTFSF;
854 * ***FIXME*** fix code to handle case that INT16_MAX is
857 mt_com.mt_count = INT16_MAX; /* use big positive number */
858 if (mt_com.mt_count < 0) {
859 mt_com.mt_count = INT16_MAX; /* brain damaged system */
863 if (has_cap(CAP_MTIOCGET) && (has_cap(CAP_FASTFSF) || has_cap(CAP_EOM))) {
864 if (has_cap(CAP_EOM)) {
865 Dmsg0(100,"Using EOM for EOM\n");
866 mt_com.mt_op = MTEOM;
870 if (tape_ioctl(fd, MTIOCTOP, (char *)&mt_com) < 0) {
872 clrerror(mt_com.mt_op);
873 Dmsg1(50, "ioctl error: %s\n", be.strerror());
875 Mmsg2(errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
876 print_name(), be.strerror());
880 if (!dev_get_os_pos(this, &mt_stat)) {
883 Mmsg2(errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
884 print_name(), be.strerror());
887 Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
889 file = mt_stat.mt_fileno;
895 * Rewind then use FSF until EOT reached
901 * Move file by file to the end of the tape
904 for (file_num=file; !at_eot(); file_num++) {
905 Dmsg0(200, "eod: doing fsf 1\n");
907 Dmsg0(200, "fsf error.\n");
911 * Avoid infinite loop by ensuring we advance.
913 if (file_num == (int)file) {
914 struct mtget mt_stat;
915 Dmsg1(100, "fsf did not advance from file %d\n", file_num);
917 if (dev_get_os_pos(this, &mt_stat)) {
918 Dmsg2(100, "Adjust file from %d to %d\n", file , mt_stat.mt_fileno);
919 file = mt_stat.mt_fileno;
926 * Some drivers leave us after second EOF when doing
927 * MTEOM, so we must backup so that appending overwrites
930 if (has_cap(CAP_BSFATEOM)) {
931 struct mtget mt_stat;
932 /* Backup over EOF */
934 /* If BSF worked and fileno is known (not -1), set file */
935 if (dev_get_os_pos(this, &mt_stat)) {
936 Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", file , mt_stat.mt_fileno);
937 file = mt_stat.mt_fileno;
939 file++; /* wing it -- not correct on all OSes */
942 update_pos(dcr); /* update position */
944 Dmsg1(200, "EOD dev->file=%d\n", file);
949 * Set the position of the device -- only for files and DVD
950 * For other devices, there is no generic way to do it.
951 * Returns: true on succes
954 bool DEVICE::update_pos(DCR *dcr)
961 Mmsg0(errmsg, _("Bad device call. Device not open\n"));
962 Emsg1(M_FATAL, 0, "%s", errmsg);
966 /* Find out where we are */
967 if (is_file() || is_dvd()) {
970 pos = lseek(dcr, (off_t)0, SEEK_CUR);
974 Pmsg1(000, _("Seek error: ERR=%s\n"), be.strerror());
975 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
976 print_name(), be.strerror());
980 block_num = (uint32_t)pos;
981 file = (uint32_t)(pos >> 32);
988 * Return the status of the device. This was meant
989 * to be a generic routine. Unfortunately, it doesn't
990 * seem possible (at least I do not know how to do it
991 * currently), which means that for the moment, this
992 * routine has very little value.
996 uint32_t status_dev(DEVICE *dev)
998 struct mtget mt_stat;
1001 if (dev->state & (ST_EOT | ST_WEOT)) {
1005 if (dev->state & ST_EOF) {
1009 if (dev->is_tape()) {
1011 Pmsg0(-20,_(" Bacula status:"));
1012 Pmsg2(-20,_(" file=%d block=%d\n"), dev->file, dev->block_num);
1013 if (tape_ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
1015 dev->dev_errno = errno;
1016 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
1017 dev->print_name(), be.strerror());
1020 Pmsg0(-20, _(" Device status:"));
1022 #if defined(HAVE_LINUX_OS)
1023 if (GMT_EOF(mt_stat.mt_gstat)) {
1027 if (GMT_BOT(mt_stat.mt_gstat)) {
1031 if (GMT_EOT(mt_stat.mt_gstat)) {
1035 if (GMT_SM(mt_stat.mt_gstat)) {
1039 if (GMT_EOD(mt_stat.mt_gstat)) {
1043 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
1044 stat |= BMT_WR_PROT;
1045 Pmsg0(-20, " WR_PROT");
1047 if (GMT_ONLINE(mt_stat.mt_gstat)) {
1049 Pmsg0(-20, " ONLINE");
1051 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
1052 stat |= BMT_DR_OPEN;
1053 Pmsg0(-20, " DR_OPEN");
1055 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
1056 stat |= BMT_IM_REP_EN;
1057 Pmsg0(-20, " IM_REP_EN");
1059 #elif defined(HAVE_WIN32)
1060 if (GMT_EOF(mt_stat.mt_gstat)) {
1064 if (GMT_BOT(mt_stat.mt_gstat)) {
1068 if (GMT_EOT(mt_stat.mt_gstat)) {
1072 if (GMT_EOD(mt_stat.mt_gstat)) {
1076 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
1077 stat |= BMT_WR_PROT;
1078 Pmsg0(-20, " WR_PROT");
1080 if (GMT_ONLINE(mt_stat.mt_gstat)) {
1082 Pmsg0(-20, " ONLINE");
1084 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
1085 stat |= BMT_DR_OPEN;
1086 Pmsg0(-20, " DR_OPEN");
1088 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
1089 stat |= BMT_IM_REP_EN;
1090 Pmsg0(-20, " IM_REP_EN");
1093 #endif /* !SunOS && !OSF */
1094 if (dev->has_cap(CAP_MTIOCGET)) {
1095 Pmsg2(-20, _(" file=%d block=%d\n"), mt_stat.mt_fileno, mt_stat.mt_blkno);
1097 Pmsg2(-20, _(" file=%d block=%d\n"), -1, -1);
1100 stat |= BMT_ONLINE | BMT_BOT;
1107 * Load medium in device
1108 * Returns: true on success
1111 bool load_dev(DEVICE *dev)
1118 dev->dev_errno = EBADF;
1119 Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
1120 Emsg0(M_FATAL, 0, dev->errmsg);
1123 if (!(dev->is_tape())) {
1127 Dmsg0(200, "stored: MTLOAD command not available\n");
1129 dev->dev_errno = ENOTTY; /* function not available */
1130 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1131 dev->print_name(), be.strerror());
1135 dev->block_num = dev->file = 0;
1138 mt_com.mt_op = MTLOAD;
1139 mt_com.mt_count = 1;
1140 if (tape_ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1142 dev->dev_errno = errno;
1143 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1144 dev->print_name(), be.strerror());
1152 * Rewind device and put it offline
1153 * Returns: true on success
1156 bool DEVICE::offline()
1161 return true; /* device not open */
1164 state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
1165 block_num = file = 0;
1169 mt_com.mt_op = MTUNLOCK;
1170 mt_com.mt_count = 1;
1171 tape_ioctl(fd, MTIOCTOP, (char *)&mt_com);
1173 mt_com.mt_op = MTOFFL;
1174 mt_com.mt_count = 1;
1175 if (tape_ioctl(fd, MTIOCTOP, (char *)&mt_com) < 0) {
1178 Mmsg2(errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1179 print_name(), be.strerror());
1182 Dmsg1(100, "Offlined device %s\n", print_name());
1186 bool DEVICE::offline_or_rewind()
1191 if (has_cap(CAP_OFFLINEUNMOUNT)) {
1195 * Note, this rewind probably should not be here (it wasn't
1196 * in prior versions of Bacula), but on FreeBSD, this is
1197 * needed in the case the tape was "frozen" due to an error
1198 * such as backspacing after writing and EOF. If it is not
1199 * done, all future references to the drive get and I/O error.
1202 return rewind(NULL);
1207 * Foward space a file
1208 * Returns: true on success
1211 bool DEVICE::fsf(int num)
1213 struct mtget mt_stat;
1219 Mmsg0(errmsg, _("Bad call to fsf. Device not open\n"));
1220 Emsg0(M_FATAL, 0, errmsg);
1230 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1234 Dmsg0(200, "ST_EOF set on entry to FSF\n");
1237 Dmsg0(100, "fsf\n");
1240 * If Fast forward space file is set, then we
1241 * use MTFSF to forward space and MTIOCGET
1242 * to get the file position. We assume that
1243 * the SCSI driver will ensure that we do not
1244 * forward space past the end of the medium.
1246 if (has_cap(CAP_FSF) && has_cap(CAP_MTIOCGET) && has_cap(CAP_FASTFSF)) {
1247 mt_com.mt_op = MTFSF;
1248 mt_com.mt_count = num;
1249 stat = tape_ioctl(fd, MTIOCTOP, (char *)&mt_com);
1250 if (stat < 0 || !dev_get_os_pos(this, &mt_stat)) {
1253 Dmsg0(200, "Set ST_EOT\n");
1255 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1256 print_name(), be.strerror());
1257 Dmsg1(200, "%s", errmsg);
1260 Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1262 file = mt_stat.mt_fileno;
1266 * Here if CAP_FSF is set, and virtually all drives
1267 * these days support it, we read a record, then forward
1268 * space one file. Using this procedure, which is slow,
1269 * is the only way we can be sure that we don't read
1270 * two consecutive EOF marks, which means End of Data.
1272 } else if (has_cap(CAP_FSF)) {
1275 Dmsg0(200, "FSF has cap_fsf\n");
1276 if (max_block_size == 0) {
1277 rbuf_len = DEFAULT_BLOCK_SIZE;
1279 rbuf_len = max_block_size;
1281 rbuf = get_memory(rbuf_len);
1282 mt_com.mt_op = MTFSF;
1283 mt_com.mt_count = 1;
1284 while (num-- && !at_eot()) {
1285 Dmsg0(100, "Doing read before fsf\n");
1286 if ((stat = tape_read(fd, (char *)rbuf, rbuf_len)) < 0) {
1287 if (errno == ENOMEM) { /* tape record exceeds buf len */
1288 stat = rbuf_len; /* This is OK */
1290 * On IBM drives, they return ENOSPC at EOM
1291 * instead of EOF status
1293 } else if (at_eof() && errno == ENOSPC) {
1299 Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev_errno,
1301 Mmsg2(errmsg, _("read error on %s. ERR=%s.\n"),
1302 print_name(), be.strerror());
1303 Dmsg1(100, "%s", errmsg);
1307 if (stat == 0) { /* EOF */
1308 Dmsg1(100, "End of File mark from read. File=%d\n", file+1);
1309 /* Two reads of zero means end of tape */
1312 Dmsg0(100, "Set ST_EOT\n");
1318 } else { /* Got data */
1323 Dmsg0(100, "Doing MTFSF\n");
1324 stat = tape_ioctl(fd, MTIOCTOP, (char *)&mt_com);
1325 if (stat < 0) { /* error => EOT */
1328 Dmsg0(100, "Set ST_EOT\n");
1330 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1331 print_name(), be.strerror());
1332 Dmsg0(100, "Got < 0 for MTFSF\n");
1333 Dmsg1(100, "%s", errmsg);
1341 * No FSF, so use FSR to simulate it
1344 Dmsg0(200, "Doing FSR for FSF\n");
1345 while (num-- && !at_eot()) {
1346 fsr(INT32_MAX); /* returns -1 on EOF or EOT */
1350 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1356 Dmsg1(200, "Return %d from FSF\n", stat);
1358 Dmsg0(200, "ST_EOF set on exit FSF\n");
1361 Dmsg0(200, "ST_EOT set on exit FSF\n");
1363 Dmsg1(200, "Return from FSF file=%d\n", file);
1368 * Backward space a file
1369 * Returns: false on failure
1372 bool DEVICE::bsf(int num)
1379 Mmsg0(errmsg, _("Bad call to bsf. Device not open\n"));
1380 Emsg0(M_FATAL, 0, errmsg);
1385 Mmsg1(errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1396 mt_com.mt_op = MTBSF;
1397 mt_com.mt_count = num;
1398 stat = tape_ioctl(fd, MTIOCTOP, (char *)&mt_com);
1402 Mmsg2(errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1403 print_name(), be.strerror());
1410 * Foward space num records
1411 * Returns: false on failure
1414 bool DEVICE::fsr(int num)
1421 Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1422 Emsg0(M_FATAL, 0, errmsg);
1430 if (!has_cap(CAP_FSR)) {
1431 Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1435 Dmsg1(29, "fsr %d\n", num);
1436 mt_com.mt_op = MTFSR;
1437 mt_com.mt_count = num;
1438 stat = tape_ioctl(fd, MTIOCTOP, (char *)&mt_com);
1444 struct mtget mt_stat;
1446 Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1447 if (dev_get_os_pos(this, &mt_stat)) {
1448 Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1449 block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1450 file = mt_stat.mt_fileno;
1451 block_num = mt_stat.mt_blkno;
1459 Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1460 num, print_name(), be.strerror());
1466 * Backward space a record
1467 * Returns: false on failure
1470 bool DEVICE::bsr(int num)
1477 Mmsg0(errmsg, _("Bad call to bsr_dev. Device not open\n"));
1478 Emsg0(M_FATAL, 0, errmsg);
1486 if (!has_cap(CAP_BSR)) {
1487 Mmsg1(errmsg, _("ioctl MTBSR not permitted on %s.\n"), print_name());
1491 Dmsg0(29, "bsr_dev\n");
1495 mt_com.mt_op = MTBSR;
1496 mt_com.mt_count = num;
1497 stat = tape_ioctl(fd, MTIOCTOP, (char *)&mt_com);
1501 Mmsg2(errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1502 print_name(), be.strerror());
1508 * Reposition the device to file, block
1509 * Returns: false on failure
1512 bool DEVICE::reposition(DCR *dcr, uint32_t rfile, uint32_t rblock)
1516 Mmsg0(errmsg, _("Bad call to reposition. Device not open\n"));
1517 Emsg0(M_FATAL, 0, errmsg);
1522 off_t pos = (((off_t)rfile)<<32) + (off_t)rblock;
1523 Dmsg1(100, "===== lseek to %d\n", (int)pos);
1524 if (lseek(dcr, pos, SEEK_SET) == (off_t)-1) {
1527 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
1528 print_name(), be.strerror());
1537 /* After this point, we are tape only */
1538 Dmsg4(100, "reposition from %u:%u to %u:%u\n",
1539 file, block_num, rfile, rblock);
1541 Dmsg0(100, "Rewind\n");
1542 if (!rewind(NULL)) {
1547 Dmsg1(100, "fsf %d\n", rfile-file);
1548 if (!fsf(rfile-file)) {
1549 Dmsg1(100, "fsf failed! ERR=%s\n", bstrerror());
1552 Dmsg2(100, "wanted_file=%d at_file=%d\n", rfile, file);
1554 if (rblock < block_num) {
1555 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1556 Dmsg0(100, "bsf 1\n");
1558 Dmsg0(100, "fsf 1\n");
1560 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1562 if (has_cap(CAP_POSITIONBLOCKS) && rblock > block_num) {
1563 /* Ignore errors as Bacula can read to the correct block */
1564 Dmsg1(100, "fsr %d\n", rblock-block_num);
1565 return fsr(rblock-block_num);
1573 * Write an end of file on the device
1574 * Returns: true on success
1577 bool DEVICE::weof(int num)
1581 Dmsg0(129, "weof_dev\n");
1585 Mmsg0(errmsg, _("Bad call to weof_dev. Device not open\n"));
1586 Emsg0(M_FATAL, 0, errmsg);
1594 if (!can_append()) {
1595 Mmsg0(errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1596 Emsg0(M_FATAL, 0, errmsg);
1602 mt_com.mt_op = MTWEOF;
1603 mt_com.mt_count = num;
1604 stat = tape_ioctl(fd, MTIOCTOP, (char *)&mt_com);
1613 Mmsg2(errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1614 print_name(), be.strerror());
1622 * If implemented in system, clear the tape
1625 void DEVICE::clrerror(int func)
1627 const char *msg = NULL;
1628 struct mtget mt_stat;
1631 dev_errno = errno; /* save errno */
1633 VolCatInfo.VolCatErrors++;
1640 if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1643 break; /* ignore message printed later */
1646 capabilities &= ~CAP_EOF; /* turn off feature */
1651 capabilities &= ~CAP_EOM; /* turn off feature */
1656 capabilities &= ~CAP_FSF; /* turn off feature */
1660 capabilities &= ~CAP_BSF; /* turn off feature */
1664 capabilities &= ~CAP_FSR; /* turn off feature */
1668 capabilities &= ~CAP_BSR; /* turn off feature */
1678 #ifdef MTSETDRVBUFFER
1679 case MTSETDRVBUFFER:
1680 msg = "MTSETDRVBUFFER";
1713 bsnprintf(buf, sizeof(buf), _("unknown func code %d"), func);
1719 Mmsg1(errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1720 Emsg0(M_ERROR, 0, errmsg);
1725 * Now we try different methods of clearing the error
1726 * status on the drive so that it is not locked for
1727 * further operations.
1730 /* On some systems such as NetBSD, this clears all errors */
1731 tape_ioctl(fd, MTIOCGET, (char *)&mt_stat);
1733 /* Found on Linux */
1737 mt_com.mt_op = MTIOCLRERR;
1738 mt_com.mt_count = 1;
1739 /* Clear any error condition on the tape */
1740 tape_ioctl(fd, MTIOCTOP, (char *)&mt_com);
1741 Dmsg0(200, "Did MTIOCLRERR\n");
1745 /* Typically on FreeBSD */
1749 /* Read and clear SCSI error status */
1750 union mterrstat mt_errstat;
1751 Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev_errno,
1752 be.strerror(dev_errno));
1753 tape_ioctl(fd, MTIOCERRSTAT, (char *)&mt_errstat);
1757 /* Clear Subsystem Exception OSF1 */
1761 mt_com.mt_op = MTCSE;
1762 mt_com.mt_count = 1;
1763 /* Clear any error condition on the tape */
1764 tape_ioctl(fd, MTIOCTOP, (char *)&mt_com);
1765 Dmsg0(200, "Did MTCSE\n");
1773 void DEVICE::close()
1775 Dmsg1(100, "close_dev %s\n", print_name());
1776 if (has_cap(CAP_OFFLINEUNMOUNT)) {
1787 Dmsg2(100, "device %s already closed vol=%s\n", print_name(),
1789 return; /* already closed */
1792 /* Clean up device packet so it can be reused */
1794 state &= ~(ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1795 label_type = B_BACULA_LABEL;
1796 file = block_num = 0;
1799 EndFile = EndBlock = 0;
1800 Slot = -1; /* unknown slot */
1802 memset(&VolCatInfo, 0, sizeof(VolCatInfo));
1803 memset(&VolHdr, 0, sizeof(VolHdr));
1805 stop_thread_timer(tid);
1812 * This call closes the device, but it is used in DVD handling
1813 * where we close one part and then open the next part. The
1814 * difference between close_part() and close() is that close_part()
1815 * saves the state information of the device (e.g. the Volume lable,
1816 * the Volume Catalog record, ... This permits opening and closing
1817 * the Volume parts multiple times without losing track of what the
1818 * main Volume parameters are.
1820 void DEVICE::close_part(DCR *dcr)
1822 VOLUME_LABEL saveVolHdr;
1823 VOLUME_CAT_INFO saveVolCatInfo; /* Volume Catalog Information */
1826 memcpy(&saveVolHdr, &VolHdr, sizeof(saveVolHdr));
1827 memcpy(&saveVolCatInfo, &VolCatInfo, sizeof(saveVolCatInfo));
1828 close(); /* close current part */
1829 memcpy(&VolHdr, &saveVolHdr, sizeof(VolHdr));
1830 memcpy(&VolCatInfo, &saveVolCatInfo, sizeof(VolCatInfo));
1831 memcpy(&dcr->VolCatInfo, &saveVolCatInfo, sizeof(dcr->VolCatInfo));
1834 off_t DEVICE::lseek(DCR *dcr, off_t offset, int whence)
1838 return lseek_dvd(dcr, offset, whence);
1840 return ::lseek(fd, offset, whence);
1846 bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
1848 Dmsg1(100, "truncate %s\n", print_name());
1851 /* maybe we should rewind and write and eof ???? */
1852 return true; /* we don't really truncate tapes */
1854 return truncate_dvd(dcr);
1856 /* ***FIXME*** we really need to unlink() the file so that
1857 * its name can be changed for a relabel.
1859 if (ftruncate(fd, 0) != 0) {
1861 Mmsg2(errmsg, _("Unable to truncate device %s. ERR=%s\n"),
1862 print_name(), be.strerror());
1870 /* Mount the device.
1871 * If timeout, wait until the mount command returns 0.
1872 * If !timeout, try to mount the device only once.
1874 bool DEVICE::mount(int timeout)
1876 Dmsg0(190, "Enter mount\n");
1879 } else if (requires_mount()) {
1880 return do_mount(1, timeout);
1885 /* Unmount the device
1886 * If timeout, wait until the unmount command returns 0.
1887 * If !timeout, try to unmount the device only once.
1889 bool DEVICE::unmount(int timeout)
1891 Dmsg0(90, "Enter unmount_dvd\n");
1893 return do_mount(0, timeout);
1898 /* (Un)mount the device */
1899 bool DEVICE::do_mount(int mount, int dotimeout)
1901 POOL_MEM ocmd(PM_FNAME);
1904 int status, timeout;
1906 sm_check(__FILE__, __LINE__, false);
1909 Dmsg0(200, "======= mount=1\n");
1912 icmd = device->mount_command;
1914 if (!is_mounted()) {
1915 Dmsg0(200, "======= mount=0\n");
1918 icmd = device->unmount_command;
1921 edit_mount_codes(ocmd, icmd);
1923 Dmsg2(100, "do_mount_dvd: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted());
1926 /* Try at most 1 time to (un)mount the device. This should perhaps be configurable. */
1931 results = get_memory(2000);
1934 /* If busy retry each second */
1935 Dmsg1(20, "do_mount run_prog=%s\n", ocmd.c_str());
1936 while ((status = run_program_full_output(ocmd.c_str(),
1937 max_open_wait/2, results)) != 0) {
1938 /* Doesn't work with internationalization (This is not a problem) */
1939 if (fnmatch("*is already mounted on", results, 0) == 0) {
1942 if (timeout-- > 0) {
1943 /* Sometimes the device cannot be mounted because it is already mounted.
1944 * Try to unmount it, then remount it */
1946 Dmsg1(400, "Trying to unmount the device %s...\n", print_name());
1952 Dmsg2(40, "Device %s cannot be mounted. ERR=%s\n", print_name(), results);
1953 Mmsg(errmsg, _("Device %s cannot be mounted. ERR=%s\n"),
1954 print_name(), results);
1956 * Now, just to be sure it is not mounted, try to read the
1960 struct dirent *entry, *result;
1964 name_max = pathconf(".", _PC_NAME_MAX);
1965 if (name_max < 1024) {
1969 if (!(dp = opendir(device->mount_point))) {
1972 Dmsg3(29, "do_mount: failed to open dir %s (dev=%s), ERR=%s\n",
1973 device->mount_point, print_name(), be.strerror());
1977 entry = (struct dirent *)malloc(sizeof(struct dirent) + name_max + 1000);
1980 if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) {
1982 Dmsg2(129, "do_mount: failed to find suitable file in dir %s (dev=%s)\n",
1983 device->mount_point, print_name());
1986 if ((strcmp(result->d_name, ".")) && (strcmp(result->d_name, "..")) && (strcmp(result->d_name, ".keep"))) {
1987 count++; /* result->d_name != ., .. or .keep (Gentoo-specific) */
1990 Dmsg2(129, "do_mount: ignoring %s in %s\n", result->d_name, device->mount_point);
1996 Dmsg1(29, "do_mount: got %d files in the mount point (not counting ., .. and .keep)\n", count);
1999 mount = 1; /* If we got more than ., .. and .keep */
2000 break; /* there must be something mounted */
2004 sm_check(__FILE__, __LINE__, false);
2005 free_pool_memory(results);
2006 Dmsg0(200, "============ mount=0\n");
2010 set_mounted(mount); /* set/clear mounted flag */
2011 free_pool_memory(results);
2012 Dmsg1(200, "============ mount=%d\n", mount);
2017 * Edit codes into (Un)MountCommand, Write(First)PartCommand
2019 * %a = archive device name
2020 * %e = erase (set if cannot mount and first part)
2023 * %v = last part name
2025 * omsg = edited output message
2026 * imsg = input string containing edit codes (%x)
2029 void DEVICE::edit_mount_codes(POOL_MEM &omsg, const char *imsg)
2035 POOL_MEM archive_name(PM_FNAME);
2037 omsg.c_str()[0] = 0;
2038 Dmsg1(800, "edit_mount_codes: %s\n", imsg);
2039 for (p=imsg; *p; p++) {
2049 if (num_dvd_parts == 0) {
2050 if (truncating || blank_dvd) {
2060 bsnprintf(add, sizeof(add), "%d", part);
2064 str = device->mount_point;
2067 make_spooled_dvd_filename(this, archive_name);
2068 str = archive_name.c_str();
2082 Dmsg1(1900, "add_str %s\n", str);
2083 pm_strcat(omsg, (char *)str);
2084 Dmsg1(1800, "omsg=%s\n", omsg.c_str());
2089 /* Return the resource name for the device */
2090 const char *DEVICE::name() const
2092 return device->hdr.name;
2096 dev_vol_name(DEVICE *dev)
2098 return dev->VolCatInfo.VolCatName;
2103 * Free memory allocated for the device
2105 void DEVICE::term(void)
2107 Dmsg1(900, "term dev: %s\n", print_name());
2110 free_memory(dev_name);
2114 free_memory(prt_name);
2118 free_pool_memory(errmsg);
2121 pthread_mutex_destroy(&mutex);
2122 pthread_cond_destroy(&wait);
2123 pthread_cond_destroy(&wait_next_vol);
2124 pthread_mutex_destroy(&spool_mutex);
2126 if (attached_dcrs) {
2127 delete attached_dcrs;
2128 attached_dcrs = NULL;
2137 * This routine initializes the device wait timers
2139 void init_device_wait_timers(DCR *dcr)
2141 DEVICE *dev = dcr->dev;
2142 JCR *jcr = dcr->jcr;
2144 /* ******FIXME******* put these on config variables */
2145 dev->min_wait = 60 * 60;
2146 dev->max_wait = 24 * 60 * 60;
2147 dev->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
2148 dev->wait_sec = dev->min_wait;
2149 dev->rem_wait_sec = dev->wait_sec;
2152 dev->BadVolName[0] = 0;
2154 jcr->min_wait = 60 * 60;
2155 jcr->max_wait = 24 * 60 * 60;
2156 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
2157 jcr->wait_sec = jcr->min_wait;
2158 jcr->rem_wait_sec = jcr->wait_sec;
2163 void init_jcr_device_wait_timers(JCR *jcr)
2165 /* ******FIXME******* put these on config variables */
2166 jcr->min_wait = 60 * 60;
2167 jcr->max_wait = 24 * 60 * 60;
2168 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
2169 jcr->wait_sec = jcr->min_wait;
2170 jcr->rem_wait_sec = jcr->wait_sec;
2176 * The dev timers are used for waiting on a particular device
2178 * Returns: true if time doubled
2179 * false if max time expired
2181 bool double_dev_wait_time(DEVICE *dev)
2183 dev->wait_sec *= 2; /* double wait time */
2184 if (dev->wait_sec > dev->max_wait) { /* but not longer than maxtime */
2185 dev->wait_sec = dev->max_wait;
2188 dev->rem_wait_sec = dev->wait_sec;
2189 if (dev->num_wait >= dev->max_num_wait) {
2196 void set_os_device_parameters(DEVICE *dev)
2198 #if defined(HAVE_LINUX_OS) || defined(HAVE_WIN32)
2201 #if defined(MTRESET)
2202 mt_com.mt_op = MTRESET;
2203 mt_com.mt_count = 0;
2204 if (tape_ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2205 dev->clrerror(MTRESET);
2208 #if defined(MTSETBLK)
2209 if (dev->min_block_size == dev->max_block_size &&
2210 dev->min_block_size == 0) { /* variable block mode */
2211 mt_com.mt_op = MTSETBLK;
2212 mt_com.mt_count = 0;
2213 if (tape_ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2214 dev->clrerror(MTSETBLK);
2216 Dmsg0(100, "Set block size to 0\n");
2219 #if defined(MTSETDRVBUFFER)
2220 if (getpid() == 0) { /* Only root can do this */
2221 mt_com.mt_op = MTSETDRVBUFFER;
2222 mt_com.mt_count = MT_ST_CLEARBOOLEANS;
2223 if (!dev->has_cap(CAP_TWOEOF)) {
2224 mt_com.mt_count |= MT_ST_TWO_FM;
2226 if (dev->has_cap(CAP_EOM)) {
2227 mt_com.mt_count |= MT_ST_FAST_MTEOM;
2229 if (tape_ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2230 dev->clrerror(MTSETDRVBUFFER);
2237 #ifdef HAVE_NETBSD_OS
2239 if (dev->min_block_size == dev->max_block_size &&
2240 dev->min_block_size == 0) { /* variable block mode */
2241 mt_com.mt_op = MTSETBSIZ;
2242 mt_com.mt_count = 0;
2243 if (tape_ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2244 dev->clrerror(MTSETBSIZ);
2246 /* Get notified at logical end of tape */
2247 mt_com.mt_op = MTEWARN;
2248 mt_com.mt_count = 1;
2249 if (tape_ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2250 dev->clrerror(MTEWARN);
2256 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
2258 if (dev->min_block_size == dev->max_block_size &&
2259 dev->min_block_size == 0) { /* variable block mode */
2260 mt_com.mt_op = MTSETBSIZ;
2261 mt_com.mt_count = 0;
2262 if (tape_ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2263 dev->clrerror(MTSETBSIZ);
2271 if (dev->min_block_size == dev->max_block_size &&
2272 dev->min_block_size == 0) { /* variable block mode */
2273 mt_com.mt_op = MTSRSZ;
2274 mt_com.mt_count = 0;
2275 if (tape_ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2276 dev->clrerror(MTSRSZ);
2283 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
2285 return dev->has_cap(CAP_MTIOCGET) &&
2286 tape_ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
2287 mt_stat->mt_fileno >= 0;
2290 static char *modes[] = {
2291 "CREATE_READ_WRITE",
2298 static char *mode_to_str(int mode)
2300 static char buf[100];
2301 if (mode < 1 || mode > 4) {
2302 bsnprintf(buf, sizeof(buf), "BAD mode=%d", mode);
2305 return modes[mode-1];