2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version two of the GNU General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of John Walker.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
30 * dev.c -- low level operations on device (storage device)
34 * NOTE!!!! None of these routines are reentrant. You must
35 * use dev->r_dlock() and dev->unlock() at a higher level,
36 * or use the xxx_device() equivalents. By moving the
37 * thread synchronization to a higher level, we permit
38 * the higher level routines to "seize" the device and
39 * to carry out operations without worrying about who
40 * set what lock (i.e. race conditions).
42 * Note, this is the device dependent code, and may have
43 * to be modified for each system, but is meant to
44 * be as "generic" as possible.
46 * The purpose of this code is to develop a SIMPLE Storage
47 * daemon. More complicated coding (double buffering, writer
48 * thread, ...) is left for a later version.
54 * Handling I/O errors and end of tape conditions are a bit tricky.
55 * This is how it is currently done when writting.
56 * On either an I/O error or end of tape,
57 * we will stop writing on the physical device (no I/O recovery is
58 * attempted at least in this daemon). The state flag will be sent
59 * to include ST_EOT, which is ephemeral, and ST_WEOT, which is
60 * persistent. Lots of routines clear ST_EOT, but ST_WEOT is
61 * cleared only when the problem goes away. Now when ST_WEOT
62 * is set all calls to write_block_to_device() call the fix_up
63 * routine. In addition, all threads are blocked
64 * from writing on the tape by calling lock_dev(), and thread other
65 * than the first thread to hit the EOT will block on a condition
66 * variable. The first thread to hit the EOT will continue to
67 * be able to read and write the tape (he sort of tunnels through
68 * the locking mechanism -- see lock_dev() for details).
70 * Now presumably somewhere higher in the chain of command
71 * (device.c), someone will notice the EOT condition and
72 * get a new tape up, get the tape label read, and mark
73 * the label for rewriting. Then this higher level routine
74 * will write the unwritten buffer to the new volume.
75 * Finally, he will release
76 * any blocked threads by doing a broadcast on the condition
77 * variable. At that point, we should be totally back in
78 * business with no lost data.
93 /* Forward referenced functions */
94 void set_os_device_parameters(DCR *dcr);
95 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat);
96 static const char *mode_to_str(int mode);
99 * Allocate and initialize the DEVICE structure
100 * Note, if dev is non-NULL, it is already allocated,
101 * thus we neither allocate it nor free it. This allows
102 * the caller to put the packet in shared memory.
104 * Note, for a tape, the device->device_name is the device name
105 * (e.g. /dev/nst0), and for a file, the device name
106 * is the directory in which the file will be placed.
110 init_dev(JCR *jcr, DEVRES *device)
119 /* If no device type specified, try to guess */
120 if (!device->dev_type) {
121 /* Check that device is available */
122 if (stat(device->device_name, &statp) < 0) {
124 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"),
125 device->device_name, be.bstrerror());
128 if (S_ISDIR(statp.st_mode)) {
129 device->dev_type = B_FILE_DEV;
130 } else if (S_ISCHR(statp.st_mode)) {
131 device->dev_type = B_TAPE_DEV;
132 } else if (S_ISFIFO(statp.st_mode)) {
133 device->dev_type = B_FIFO_DEV;
134 } else if (!(device->cap_bits & CAP_REQMOUNT)) {
135 Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory\n"
136 " or have RequiresMount=yes for DVD. st_mode=%x\n"),
137 device->device_name, statp.st_mode);
140 device->dev_type = B_DVD_DEV;
144 dev = (DEVICE *)malloc(sizeof(DEVICE));
145 memset(dev, 0, sizeof(DEVICE));
146 dev->Slot = -1; /* unknown */
148 /* Copy user supplied device parameters from Resource */
149 dev->dev_name = get_memory(strlen(device->device_name)+1);
150 pm_strcpy(dev->dev_name, device->device_name);
151 dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
152 /* We edit "Resource-name" (physical-name) */
153 Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
154 Dmsg1(400, "Allocate dev=%s\n", dev->print_name());
155 dev->capabilities = device->cap_bits;
156 dev->min_block_size = device->min_block_size;
157 dev->max_block_size = device->max_block_size;
158 dev->max_volume_size = device->max_volume_size;
159 dev->max_file_size = device->max_file_size;
160 dev->volume_capacity = device->volume_capacity;
161 dev->max_rewind_wait = device->max_rewind_wait;
162 dev->max_open_wait = device->max_open_wait;
163 dev->max_open_vols = device->max_open_vols;
164 dev->vol_poll_interval = device->vol_poll_interval;
165 dev->max_spool_size = device->max_spool_size;
166 dev->drive_index = device->drive_index;
167 dev->autoselect = device->autoselect;
168 dev->dev_type = device->dev_type;
169 if (dev->is_tape()) { /* No parts on tapes */
170 dev->max_part_size = 0;
172 dev->max_part_size = device->max_part_size;
175 if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
176 dev->vol_poll_interval = 60;
178 /* Link the dev and device structures together */
179 dev->device = device;
182 if (dev->is_fifo()) {
183 dev->capabilities |= CAP_STREAM; /* set stream device */
186 /* If the device requires mount :
187 * - Check that the mount point is available
188 * - Check that (un)mount commands are defined
190 if ((dev->is_file() || dev->is_dvd()) && dev->requires_mount()) {
191 if (!device->mount_point || stat(device->mount_point, &statp) < 0) {
193 dev->dev_errno = errno;
194 Jmsg2(jcr, M_ERROR_TERM, 0, _("Unable to stat mount point %s: ERR=%s\n"),
195 device->mount_point, be.bstrerror());
199 if (!device->mount_command || !device->unmount_command) {
200 Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n"));
202 if (!device->write_part_command) {
203 Jmsg0(jcr, M_ERROR_TERM, 0, _("Write part command must be defined for a device which requires mount.\n"));
208 if (dev->max_block_size == 0) {
209 max_bs = DEFAULT_BLOCK_SIZE;
211 max_bs = dev->max_block_size;
213 if (dev->min_block_size > max_bs) {
214 Jmsg(jcr, M_ERROR_TERM, 0, _("Min block size > max on device %s\n"),
217 if (dev->max_block_size > 4096000) {
218 Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
219 dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
220 dev->max_block_size = 0;
222 if (dev->max_block_size % TAPE_BSIZE != 0) {
223 Jmsg2(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size.\n"),
224 dev->max_block_size, dev->print_name());
227 dev->errmsg = get_pool_memory(PM_EMSG);
230 if ((errstat = pthread_mutex_init(&dev->m_mutex, NULL)) != 0) {
232 dev->dev_errno = errstat;
233 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
234 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
236 if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
238 dev->dev_errno = errstat;
239 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.bstrerror(errstat));
240 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
242 if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
244 dev->dev_errno = errstat;
245 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.bstrerror(errstat));
246 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
248 if ((errstat = pthread_mutex_init(&dev->spool_mutex, NULL)) != 0) {
250 dev->dev_errno = errstat;
251 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
252 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
255 if ((errstat = rwl_init(&dev->lock)) != 0) {
257 dev->dev_errno = errstat;
258 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
259 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
264 dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
265 Dmsg2(100, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
266 dev->initiated = true;
272 * Open the device with the operating system and
273 * initialize buffer pointers.
275 * Returns: -1 on error
278 * Note, for a tape, the VolName is the name we give to the
279 * volume (not really used here), but for a file, the
280 * VolName represents the name of the file to be created/opened.
281 * In the case of a file, the full name is the device name
282 * (archive_name) with the VolName concatenated.
285 DEVICE::open(DCR *dcr, int omode)
289 if (openmode == omode) {
298 Dmsg0(100, "Close fd for mode change.\n");
299 preserve = state & (ST_LABEL|ST_APPEND|ST_READ);
303 bstrncpy(VolCatInfo.VolCatName, dcr->VolumeName, sizeof(VolCatInfo.VolCatName));
306 Dmsg4(100, "open dev: type=%d dev_name=%s vol=%s mode=%s\n", dev_type,
307 print_name(), VolCatInfo.VolCatName, mode_to_str(omode));
308 state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
309 Slot = -1; /* unknown slot */
310 label_type = B_BACULA_LABEL;
311 if (is_tape() || is_fifo()) {
312 open_tape_device(dcr, omode);
313 } else if (is_dvd()) {
314 Dmsg1(100, "call open_dvd_device mode=%s\n", mode_to_str(omode));
315 open_dvd_device(dcr, omode);
317 Dmsg1(100, "call open_file_device mode=%s\n", mode_to_str(omode));
318 open_file_device(dcr, omode);
320 state |= preserve; /* reset any important state info */
321 Dmsg2(100, "preserve=0x%x fd=%d\n", preserve, m_fd);
325 void DEVICE::set_mode(int new_mode)
328 case CREATE_READ_WRITE:
329 mode = O_CREAT | O_RDWR | O_BINARY;
331 case OPEN_READ_WRITE:
332 mode = O_RDWR | O_BINARY;
335 mode = O_RDONLY | O_BINARY;
337 case OPEN_WRITE_ONLY:
338 mode = O_WRONLY | O_BINARY;
341 Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
347 void DEVICE::open_tape_device(DCR *dcr, int omode)
350 int timeout = max_open_wait;
351 #if !defined(HAVE_WIN32)
353 utime_t start_time = time(NULL);
357 Dmsg0(100, "Open dev: device is tape\n");
359 get_autochanger_loaded_slot(dcr);
368 if (is_fifo() && timeout) {
370 tid = start_thread_timer(dcr->jcr, pthread_self(), timeout);
372 Dmsg2(100, "Try open %s mode=%s\n", print_name(), mode_to_str(omode));
373 #if defined(HAVE_WIN32)
376 if ((m_fd = tape_open(dev_name, mode)) < 0) {
383 /* If busy retry each second for max_open_wait seconds */
385 /* Try non-blocking open */
386 m_fd = tape_open(dev_name, mode+O_NONBLOCK);
390 Dmsg5(100, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n",
391 print_name(), omode, mode, errno, be.bstrerror());
393 /* Tape open, now rewind it */
394 Dmsg0(100, "Rewind after open\n");
395 mt_com.mt_op = MTREW;
397 /* rewind only if dev is a tape */
398 if (is_tape() && (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0)) {
400 dev_errno = errno; /* set error status from rewind */
403 Dmsg2(100, "Rewind error on %s close: ERR=%s\n", print_name(),
404 be.bstrerror(dev_errno));
405 /* If we get busy, device is probably rewinding, try again */
406 if (dev_errno != EBUSY) {
407 break; /* error -- no medium */
410 /* Got fd and rewind worked, so we must have medium in drive */
412 m_fd = tape_open(dev_name, mode); /* open normally */
416 Dmsg5(100, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n",
417 print_name(), omode, mode, errno, be.bstrerror());
422 set_os_device_parameters(dcr); /* do system dependent stuff */
423 break; /* Successfully opened and rewound */
427 /* Exceed wait time ? */
428 if (time(NULL) - start_time >= max_open_wait) {
429 break; /* yes, get out */
436 Mmsg2(errmsg, _("Unable to open device %s: ERR=%s\n"),
437 print_name(), be.bstrerror(dev_errno));
438 Dmsg1(100, "%s", errmsg);
441 /* Stop any open() timer we started */
443 stop_thread_timer(tid);
446 Dmsg1(100, "open dev: tape %d opened\n", m_fd);
453 void DEVICE::open_file_device(DCR *dcr, int omode)
455 POOL_MEM archive_name(PM_FNAME);
457 get_autochanger_loaded_slot(dcr);
460 * Handle opening of File Archive (not a tape)
463 pm_strcpy(archive_name, dev_name);
465 * If this is a virtual autochanger (i.e. changer_res != NULL)
466 * we simply use the device name, assuming it has been
467 * appropriately setup by the "autochanger".
469 if (!device->changer_res || device->changer_command[0] == 0) {
470 if (VolCatInfo.VolCatName[0] == 0) {
471 Mmsg(errmsg, _("Could not open file device %s. No Volume name given.\n"),
477 if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) {
478 pm_strcat(archive_name, "/");
480 pm_strcat(archive_name, VolCatInfo.VolCatName);
483 mount(1); /* do mount if required */
487 /* If creating file, give 0640 permissions */
488 Dmsg3(100, "open disk: mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode),
489 archive_name.c_str(), mode);
490 /* Use system open() */
491 if ((m_fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
494 Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
496 Dmsg1(100, "open failed: %s", errmsg);
497 Jmsg1(NULL, M_WARNING, 0, "%s", errmsg);
503 Dmsg4(100, "open dev: disk fd=%d opened, part=%d/%d, part_size=%u\n",
504 m_fd, part, num_dvd_parts, part_size);
508 * Open a DVD device. N.B. at this point, dcr->VolCatInfo.VolCatName
509 * (NB:??? I think it's VolCatInfo.VolCatName that is right)
510 * has the desired Volume name, but there is NO assurance that
511 * any other field of VolCatInfo is correct.
513 void DEVICE::open_dvd_device(DCR *dcr, int omode)
515 POOL_MEM archive_name(PM_FNAME);
516 struct stat filestat;
519 * Handle opening of DVD Volume
521 Dmsg2(100, "Enter: open_dvd_dev: DVD vol=%s mode=%s\n",
522 &dcr->VolCatInfo, mode_to_str(omode));
525 * For a DVD we must always pull the state info from dcr->VolCatInfo
526 * This is a bit ugly, but is necessary because we need to open/close/re-open
527 * the dvd file in order to properly mount/unmount and access the
528 * DVD. So we store the state of the DVD as far as is known in the
529 * catalog in dcr->VolCatInfo, and thus we refresh the dev->VolCatInfo
530 * copy here, when opening.
532 VolCatInfo = dcr->VolCatInfo; /* structure assignment */
533 Dmsg1(100, "Volume=%s\n", VolCatInfo.VolCatName);
535 if (VolCatInfo.VolCatName[0] == 0) {
536 Dmsg1(10, "Could not open DVD device %s. No Volume name given.\n",
538 Mmsg(errmsg, _("Could not open DVD device %s. No Volume name given.\n"),
545 Dmsg0(100, "Set part=1\n");
546 part = 1; /* count from 1 */
550 if (num_dvd_parts != VolCatInfo.VolCatParts) {
551 num_dvd_parts = VolCatInfo.VolCatParts;
555 * If we are not trying to access the last part, set mode to
556 * OPEN_READ_ONLY as writing would be an error.
558 Dmsg2(100, "open DVD part=%d num_dvd_parts=%d\n", part, num_dvd_parts);
559 /* Now find the name of the part that we want to access */
560 if (part <= num_dvd_parts) {
561 omode = OPEN_READ_ONLY;
562 make_mounted_dvd_filename(this, archive_name);
563 set_part_spooled(false);
565 omode = OPEN_READ_WRITE;
566 make_spooled_dvd_filename(this, archive_name);
567 set_part_spooled(true);
571 // Clear any previous blank_dvd status - we will recalculate it here
574 Dmsg3(99, "open_dvd_device: part=%d num_dvd_parts=%d, VolCatInfo.VolCatParts=%d\n",
575 part, num_dvd_parts, dcr->VolCatInfo.VolCatParts);
578 Dmsg0(99, "DVD device mounted.\n");
579 if (num_dvd_parts == 0 && !truncating) {
581 * If we can mount the device, and we are not truncating the DVD,
582 * we usually want to abort. There is one exception, if there is
583 * only one 0-sized file on the DVD, with the right volume name,
584 * we continue (it's the method used by truncate_dvd to truncate a volume).
586 if (!check_can_write_on_non_blank_dvd(dcr)) {
587 Mmsg(errmsg, _("The DVD in device %s contains data, please blank it before writing.\n"), print_name());
588 Emsg0(M_FATAL, 0, errmsg);
589 unmount(1); /* Unmount the device, so the operator can change it. */
596 * Ensure that we have the correct DVD loaded by looking for part1.
597 * We only succeed the open if it exists. Failure to do this could
598 * leave us trying to add a part to a different DVD!
600 uint32_t oldpart = part;
602 POOL_MEM part1_name(PM_FNAME);
604 make_mounted_dvd_filename(this, part1_name);
606 if (stat(part1_name.c_str(), &statp) < 0) {
608 Mmsg(errmsg, _("Unable to stat DVD part 1 file %s: ERR=%s\n"),
609 part1_name.c_str(), be.bstrerror());
610 Emsg0(M_FATAL, 0, errmsg);
614 if (!S_ISREG(statp.st_mode)) {
615 /* It is not a regular file */
616 Mmsg(errmsg, _("DVD part 1 is not a regular file %s.\n"),
618 Emsg0(M_FATAL, 0, errmsg);
624 Dmsg0(99, "DVD device mount failed.\n");
625 /* We cannot mount the device */
626 if (num_dvd_parts == 0) {
627 /* Run free space, check there is a media. */
628 if (!update_freespace()) {
629 Emsg0(M_FATAL, 0, errmsg);
634 Dmsg1(100, "Could not mount device %s, this is not a problem (num_dvd_parts == 0), and have media.\n", print_name());
636 Mmsg(errmsg, _("There is no valid DVD in device %s.\n"), print_name());
637 Emsg0(M_FATAL, 0, errmsg);
642 Mmsg(errmsg, _("Could not mount DVD device %s.\n"), print_name());
643 Emsg0(M_FATAL, 0, errmsg);
649 Dmsg5(100, "open dev: DVD dev=%s mode=%s part=%d npart=%d volcatnparts=%d\n",
650 archive_name.c_str(), mode_to_str(omode),
651 part, num_dvd_parts, dcr->VolCatInfo.VolCatParts);
653 Dmsg2(100, "openmode=%d %s\n", openmode, mode_to_str(openmode));
656 /* If creating file, give 0640 permissions */
657 Dmsg3(100, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode),
658 archive_name.c_str(), mode);
659 /* Use system open() */
660 if ((m_fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
662 Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
664 // Should this be set if we try the create/open below
665 dev_errno = EIO; /* Interpreted as no device present by acquire.c:acquire_device_for_read(). */
666 Dmsg1(100, "open failed: %s", errmsg);
668 /* Previous open failed. See if we can recover */
669 if ((omode == OPEN_READ_ONLY || omode == OPEN_READ_WRITE) &&
670 (part > num_dvd_parts)) {
671 /* If the last part (on spool), doesn't exist when accessing,
672 * create it. In read/write mode a write will be allowed (higher
673 * level software thinks that we are extending a pre-existing
674 * media. Reads for READ_ONLY will report immediately an EOF
675 * Sometimes it is better to finish with an EOF than with an error. */
676 Dmsg1(100, "Creating last part on spool: %s\n", archive_name.c_str());
677 omode = CREATE_READ_WRITE;
678 set_mode(CREATE_READ_WRITE);
679 m_fd = ::open(archive_name.c_str(), mode, 0640);
683 Dmsg1(100, "after open fd=%d\n", m_fd);
685 if (omode == OPEN_READ_WRITE || omode == CREATE_READ_WRITE) {
688 /* Get size of file */
689 if (fstat(m_fd, &filestat) < 0) {
692 Mmsg2(errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(),
694 Dmsg1(100, "open failed: %s", errmsg);
695 /* Use system close() */
699 part_size = filestat.st_size;
701 update_pos(dcr); /* update position */
709 * Returns: true on success
712 bool DEVICE::rewind(DCR *dcr)
718 Dmsg3(400, "rewind res=%d fd=%d %s\n", num_reserved(), m_fd, print_name());
719 state &= ~(ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
720 block_num = file = 0;
724 if (!is_dvd()) { /* In case of major error, the fd is not open on DVD, so we don't want to abort. */
726 Mmsg1(errmsg, _("Bad call to rewind. Device %s not open\n"),
728 Emsg0(M_ABORT, 0, errmsg);
733 mt_com.mt_op = MTREW;
735 /* If we get an I/O error on rewind, it is probably because
736 * the drive is actually busy. We loop for (about 5 minutes)
737 * retrying every 5 seconds.
739 for (i=max_rewind_wait; ; i -= 5) {
740 if (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
743 if (i == max_rewind_wait) {
744 Dmsg1(200, "Rewind error, %s. retrying ...\n", be.bstrerror());
747 * This is a gross hack, because if the user has the
748 * device mounted (i.e. open), then uses mtx to load
749 * a tape, the current open file descriptor is invalid.
750 * So, we close the drive and re-open it.
753 int open_mode = openmode;
756 open(dcr, open_mode);
764 if (dev_errno == EIO) {
765 Mmsg1(errmsg, _("No tape loaded or drive offline on %s.\n"), print_name());
769 if (dev_errno == EIO && i > 0) {
770 Dmsg0(200, "Sleeping 5 seconds.\n");
775 Mmsg2(errmsg, _("Rewind error on %s. ERR=%s.\n"),
776 print_name(), be.bstrerror());
781 } else if (is_file() || is_dvd()) {
782 if (lseek(dcr, (boffset_t)0, SEEK_SET) < 0) {
785 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
786 print_name(), be.bstrerror());
795 * Called to indicate that we have just read an
796 * EOF from the device.
798 void DEVICE::set_ateof()
810 * Called to indicate we are now at the end of the tape, and
811 * writing is not possible.
813 void DEVICE::set_ateot()
815 /* Make tape effectively read-only */
816 state |= (ST_EOF|ST_EOT|ST_WEOT);
821 * Position device to end of medium (end of data)
822 * Returns: true on succes
825 bool DEVICE::eod(DCR *dcr)
834 Mmsg1(errmsg, _("Bad call to eod. Device %s not open\n"), print_name());
838 #if defined (__digital__) && defined (__unix__)
839 return fsf(VolCatInfo.VolCatFiles);
846 clear_eof(); /* remove EOF flag */
847 block_num = file = 0;
854 pos = lseek(dcr, (boffset_t)0, SEEK_END);
855 // Dmsg1(100, "====== Seek to %lld\n", pos);
863 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
864 print_name(), be.bstrerror());
868 if (has_cap(CAP_FASTFSF) && !has_cap(CAP_EOM)) {
869 Dmsg0(100,"Using FAST FSF for EOM\n");
870 /* If unknown position, rewind */
871 if (get_os_tape_file() < 0) {
876 mt_com.mt_op = MTFSF;
878 * ***FIXME*** fix code to handle case that INT16_MAX is
881 mt_com.mt_count = INT16_MAX; /* use big positive number */
882 if (mt_com.mt_count < 0) {
883 mt_com.mt_count = INT16_MAX; /* brain damaged system */
887 if (has_cap(CAP_MTIOCGET) && (has_cap(CAP_FASTFSF) || has_cap(CAP_EOM))) {
888 if (has_cap(CAP_EOM)) {
889 Dmsg0(100,"Using EOM for EOM\n");
890 mt_com.mt_op = MTEOM;
894 if (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
896 clrerror(mt_com.mt_op);
897 Dmsg1(50, "ioctl error: %s\n", be.bstrerror());
899 Mmsg2(errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
900 print_name(), be.bstrerror());
904 os_file = get_os_tape_file();
908 Mmsg2(errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
909 print_name(), be.bstrerror());
912 Dmsg1(100, "EOD file=%d\n", os_file);
920 * Rewind then use FSF until EOT reached
926 * Move file by file to the end of the tape
929 for (file_num=file; !at_eot(); file_num++) {
930 Dmsg0(200, "eod: doing fsf 1\n");
932 Dmsg0(200, "fsf error.\n");
936 * Avoid infinite loop by ensuring we advance.
938 if (!at_eot() && file_num == (int)file) {
939 Dmsg1(100, "fsf did not advance from file %d\n", file_num);
941 os_file = get_os_tape_file();
943 Dmsg2(100, "Adjust file from %d to %d\n", file_num, os_file);
951 * Some drivers leave us after second EOF when doing
952 * MTEOM, so we must backup so that appending overwrites
955 if (has_cap(CAP_BSFATEOM)) {
956 /* Backup over EOF */
958 /* If BSF worked and fileno is known (not -1), set file */
959 os_file = get_os_tape_file();
961 Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", file , os_file);
964 file++; /* wing it -- not correct on all OSes */
967 update_pos(dcr); /* update position */
969 Dmsg1(200, "EOD dev->file=%d\n", file);
974 * Set the position of the device -- only for files and DVD
975 * For other devices, there is no generic way to do it.
976 * Returns: true on succes
979 bool DEVICE::update_pos(DCR *dcr)
986 Mmsg0(errmsg, _("Bad device call. Device not open\n"));
987 Emsg1(M_FATAL, 0, "%s", errmsg);
991 /* Find out where we are */
992 if (is_file() || is_dvd()) {
995 pos = lseek(dcr, (boffset_t)0, SEEK_CUR);
999 Pmsg1(000, _("Seek error: ERR=%s\n"), be.bstrerror());
1000 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
1001 print_name(), be.bstrerror());
1005 block_num = (uint32_t)pos;
1006 file = (uint32_t)(pos >> 32);
1013 * Return the status of the device. This was meant
1014 * to be a generic routine. Unfortunately, it doesn't
1015 * seem possible (at least I do not know how to do it
1016 * currently), which means that for the moment, this
1017 * routine has very little value.
1021 uint32_t status_dev(DEVICE *dev)
1023 struct mtget mt_stat;
1026 if (dev->state & (ST_EOT | ST_WEOT)) {
1030 if (dev->state & ST_EOF) {
1034 if (dev->is_tape()) {
1036 Pmsg0(-20,_(" Bacula status:"));
1037 Pmsg2(-20,_(" file=%d block=%d\n"), dev->file, dev->block_num);
1038 if (tape_ioctl(dev->fd(), MTIOCGET, (char *)&mt_stat) < 0) {
1040 dev->dev_errno = errno;
1041 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
1042 dev->print_name(), be.bstrerror());
1045 Pmsg0(-20, _(" Device status:"));
1047 #if defined(HAVE_LINUX_OS)
1048 if (GMT_EOF(mt_stat.mt_gstat)) {
1052 if (GMT_BOT(mt_stat.mt_gstat)) {
1056 if (GMT_EOT(mt_stat.mt_gstat)) {
1060 if (GMT_SM(mt_stat.mt_gstat)) {
1064 if (GMT_EOD(mt_stat.mt_gstat)) {
1068 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
1069 stat |= BMT_WR_PROT;
1070 Pmsg0(-20, " WR_PROT");
1072 if (GMT_ONLINE(mt_stat.mt_gstat)) {
1074 Pmsg0(-20, " ONLINE");
1076 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
1077 stat |= BMT_DR_OPEN;
1078 Pmsg0(-20, " DR_OPEN");
1080 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
1081 stat |= BMT_IM_REP_EN;
1082 Pmsg0(-20, " IM_REP_EN");
1084 #elif defined(HAVE_WIN32)
1085 if (GMT_EOF(mt_stat.mt_gstat)) {
1089 if (GMT_BOT(mt_stat.mt_gstat)) {
1093 if (GMT_EOT(mt_stat.mt_gstat)) {
1097 if (GMT_EOD(mt_stat.mt_gstat)) {
1101 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
1102 stat |= BMT_WR_PROT;
1103 Pmsg0(-20, " WR_PROT");
1105 if (GMT_ONLINE(mt_stat.mt_gstat)) {
1107 Pmsg0(-20, " ONLINE");
1109 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
1110 stat |= BMT_DR_OPEN;
1111 Pmsg0(-20, " DR_OPEN");
1113 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
1114 stat |= BMT_IM_REP_EN;
1115 Pmsg0(-20, " IM_REP_EN");
1118 #endif /* !SunOS && !OSF */
1119 if (dev->has_cap(CAP_MTIOCGET)) {
1120 Pmsg2(-20, _(" file=%d block=%d\n"), mt_stat.mt_fileno, mt_stat.mt_blkno);
1122 Pmsg2(-20, _(" file=%d block=%d\n"), -1, -1);
1125 stat |= BMT_ONLINE | BMT_BOT;
1132 * Load medium in device
1133 * Returns: true on success
1136 bool load_dev(DEVICE *dev)
1142 if (dev->fd() < 0) {
1143 dev->dev_errno = EBADF;
1144 Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
1145 Emsg0(M_FATAL, 0, dev->errmsg);
1148 if (!(dev->is_tape())) {
1152 Dmsg0(200, "stored: MTLOAD command not available\n");
1154 dev->dev_errno = ENOTTY; /* function not available */
1155 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1156 dev->print_name(), be.bstrerror());
1160 dev->block_num = dev->file = 0;
1163 mt_com.mt_op = MTLOAD;
1164 mt_com.mt_count = 1;
1165 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
1167 dev->dev_errno = errno;
1168 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1169 dev->print_name(), be.bstrerror());
1177 * Rewind device and put it offline
1178 * Returns: true on success
1181 bool DEVICE::offline()
1186 return true; /* device not open */
1189 state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
1190 block_num = file = 0;
1194 mt_com.mt_op = MTOFFL;
1195 mt_com.mt_count = 1;
1196 if (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
1199 Mmsg2(errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1200 print_name(), be.bstrerror());
1203 Dmsg1(100, "Offlined device %s\n", print_name());
1207 bool DEVICE::offline_or_rewind()
1212 if (has_cap(CAP_OFFLINEUNMOUNT)) {
1216 * Note, this rewind probably should not be here (it wasn't
1217 * in prior versions of Bacula), but on FreeBSD, this is
1218 * needed in the case the tape was "frozen" due to an error
1219 * such as backspacing after writing and EOF. If it is not
1220 * done, all future references to the drive get and I/O error.
1223 return rewind(NULL);
1228 * Foward space a file
1229 * Returns: true on success
1232 bool DEVICE::fsf(int num)
1234 int32_t os_file = 0;
1240 Mmsg0(errmsg, _("Bad call to fsf. Device not open\n"));
1241 Emsg0(M_FATAL, 0, errmsg);
1251 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1255 Dmsg0(200, "ST_EOF set on entry to FSF\n");
1258 Dmsg0(100, "fsf\n");
1261 * If Fast forward space file is set, then we
1262 * use MTFSF to forward space and MTIOCGET
1263 * to get the file position. We assume that
1264 * the SCSI driver will ensure that we do not
1265 * forward space past the end of the medium.
1267 if (has_cap(CAP_FSF) && has_cap(CAP_MTIOCGET) && has_cap(CAP_FASTFSF)) {
1269 mt_com.mt_op = MTFSF;
1270 mt_com.mt_count = num;
1271 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1273 my_errno = errno; /* save errno */
1274 } else if ((os_file=get_os_tape_file()) < 0) {
1275 my_errno = errno; /* save errno */
1277 if (my_errno != 0) {
1280 Dmsg0(200, "Set ST_EOT\n");
1282 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1283 print_name(), be.bstrerror(my_errno));
1284 Dmsg1(200, "%s", errmsg);
1288 Dmsg1(200, "fsf file=%d\n", os_file);
1294 * Here if CAP_FSF is set, and virtually all drives
1295 * these days support it, we read a record, then forward
1296 * space one file. Using this procedure, which is slow,
1297 * is the only way we can be sure that we don't read
1298 * two consecutive EOF marks, which means End of Data.
1300 } else if (has_cap(CAP_FSF)) {
1303 Dmsg0(200, "FSF has cap_fsf\n");
1304 if (max_block_size == 0) {
1305 rbuf_len = DEFAULT_BLOCK_SIZE;
1307 rbuf_len = max_block_size;
1309 rbuf = get_memory(rbuf_len);
1310 mt_com.mt_op = MTFSF;
1311 mt_com.mt_count = 1;
1312 while (num-- && !at_eot()) {
1313 Dmsg0(100, "Doing read before fsf\n");
1314 if ((stat = this->read((char *)rbuf, rbuf_len)) < 0) {
1315 if (errno == ENOMEM) { /* tape record exceeds buf len */
1316 stat = rbuf_len; /* This is OK */
1318 * On IBM drives, they return ENOSPC at EOM
1319 * instead of EOF status
1321 } else if (at_eof() && errno == ENOSPC) {
1327 Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev_errno,
1329 Mmsg2(errmsg, _("read error on %s. ERR=%s.\n"),
1330 print_name(), be.bstrerror());
1331 Dmsg1(100, "%s", errmsg);
1335 if (stat == 0) { /* EOF */
1336 Dmsg1(100, "End of File mark from read. File=%d\n", file+1);
1337 /* Two reads of zero means end of tape */
1340 Dmsg0(100, "Set ST_EOT\n");
1346 } else { /* Got data */
1351 Dmsg0(100, "Doing MTFSF\n");
1352 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1353 if (stat < 0) { /* error => EOT */
1356 Dmsg0(100, "Set ST_EOT\n");
1358 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1359 print_name(), be.bstrerror());
1360 Dmsg0(100, "Got < 0 for MTFSF\n");
1361 Dmsg1(100, "%s", errmsg);
1369 * No FSF, so use FSR to simulate it
1372 Dmsg0(200, "Doing FSR for FSF\n");
1373 while (num-- && !at_eot()) {
1374 fsr(INT32_MAX); /* returns -1 on EOF or EOT */
1378 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1384 Dmsg1(200, "Return %d from FSF\n", stat);
1386 Dmsg0(200, "ST_EOF set on exit FSF\n");
1389 Dmsg0(200, "ST_EOT set on exit FSF\n");
1391 Dmsg1(200, "Return from FSF file=%d\n", file);
1396 * Backward space a file
1397 * Returns: false on failure
1400 bool DEVICE::bsf(int num)
1407 Mmsg0(errmsg, _("Bad call to bsf. Device not open\n"));
1408 Emsg0(M_FATAL, 0, errmsg);
1413 Mmsg1(errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1418 Dmsg0(100, "bsf\n");
1424 mt_com.mt_op = MTBSF;
1425 mt_com.mt_count = num;
1426 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1430 Mmsg2(errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1431 print_name(), be.bstrerror());
1438 * Foward space num records
1439 * Returns: false on failure
1442 bool DEVICE::fsr(int num)
1449 Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1450 Emsg0(M_FATAL, 0, errmsg);
1458 if (!has_cap(CAP_FSR)) {
1459 Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1463 Dmsg1(100, "fsr %d\n", num);
1464 mt_com.mt_op = MTFSR;
1465 mt_com.mt_count = num;
1466 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1472 struct mtget mt_stat;
1474 Dmsg1(100, "FSF fail: ERR=%s\n", be.bstrerror());
1475 if (dev_get_os_pos(this, &mt_stat)) {
1476 Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1477 block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1478 file = mt_stat.mt_fileno;
1479 block_num = mt_stat.mt_blkno;
1487 Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1488 num, print_name(), be.bstrerror());
1494 * Backward space a record
1495 * Returns: false on failure
1498 bool DEVICE::bsr(int num)
1505 Mmsg0(errmsg, _("Bad call to bsr_dev. Device not open\n"));
1506 Emsg0(M_FATAL, 0, errmsg);
1514 if (!has_cap(CAP_BSR)) {
1515 Mmsg1(errmsg, _("ioctl MTBSR not permitted on %s.\n"), print_name());
1519 Dmsg0(100, "bsr_dev\n");
1523 mt_com.mt_op = MTBSR;
1524 mt_com.mt_count = num;
1525 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1529 Mmsg2(errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1530 print_name(), be.bstrerror());
1535 void DEVICE::lock_door()
1539 mt_com.mt_op = MTLOCK;
1540 mt_com.mt_count = 1;
1541 tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1545 void DEVICE::unlock_door()
1549 mt_com.mt_op = MTUNLOCK;
1550 mt_com.mt_count = 1;
1551 tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1557 * Reposition the device to file, block
1558 * Returns: false on failure
1561 bool DEVICE::reposition(DCR *dcr, uint32_t rfile, uint32_t rblock)
1565 Mmsg0(errmsg, _("Bad call to reposition. Device not open\n"));
1566 Emsg0(M_FATAL, 0, errmsg);
1571 boffset_t pos = (((boffset_t)rfile)<<32) | rblock;
1572 Dmsg1(100, "===== lseek to %d\n", (int)pos);
1573 if (lseek(dcr, pos, SEEK_SET) == (boffset_t)-1) {
1576 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
1577 print_name(), be.bstrerror());
1586 /* After this point, we are tape only */
1587 Dmsg4(100, "reposition from %u:%u to %u:%u\n", file, block_num, rfile, rblock);
1589 Dmsg0(100, "Rewind\n");
1590 if (!rewind(NULL)) {
1595 Dmsg1(100, "fsf %d\n", rfile-file);
1596 if (!fsf(rfile-file)) {
1597 Dmsg1(100, "fsf failed! ERR=%s\n", bstrerror());
1600 Dmsg2(100, "wanted_file=%d at_file=%d\n", rfile, file);
1602 if (rblock < block_num) {
1603 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1604 Dmsg0(100, "bsf 1\n");
1606 Dmsg0(100, "fsf 1\n");
1608 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1610 if (has_cap(CAP_POSITIONBLOCKS) && rblock > block_num) {
1611 /* Ignore errors as Bacula can read to the correct block */
1612 Dmsg1(100, "fsr %d\n", rblock-block_num);
1613 return fsr(rblock-block_num);
1615 while (rblock > block_num) {
1616 if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
1619 Dmsg2(30, "Failed to find requested block on %s: ERR=%s",
1620 print_name(), be.bstrerror());
1623 Dmsg2(300, "moving forward wanted_blk=%d at_blk=%d\n", rblock, block_num);
1632 * Write an end of file on the device
1633 * Returns: true on success
1636 bool DEVICE::weof(int num)
1640 Dmsg0(129, "weof_dev\n");
1644 Mmsg0(errmsg, _("Bad call to weof_dev. Device not open\n"));
1645 Emsg0(M_FATAL, 0, errmsg);
1653 if (!can_append()) {
1654 Mmsg0(errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1655 Emsg0(M_FATAL, 0, errmsg);
1661 mt_com.mt_op = MTWEOF;
1662 mt_com.mt_count = num;
1663 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1672 Mmsg2(errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1673 print_name(), be.bstrerror());
1681 * If implemented in system, clear the tape
1684 void DEVICE::clrerror(int func)
1686 const char *msg = NULL;
1689 dev_errno = errno; /* save errno */
1691 VolCatInfo.VolCatErrors++;
1698 if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1701 break; /* ignore message printed later */
1704 clear_cap(CAP_EOF); /* turn off feature */
1709 clear_cap(CAP_EOM); /* turn off feature */
1714 clear_cap(CAP_FSF); /* turn off feature */
1718 clear_cap(CAP_BSF); /* turn off feature */
1722 clear_cap(CAP_FSR); /* turn off feature */
1726 clear_cap(CAP_BSR); /* turn off feature */
1736 #ifdef MTSETDRVBUFFER
1737 case MTSETDRVBUFFER:
1738 msg = "MTSETDRVBUFFER";
1771 bsnprintf(buf, sizeof(buf), _("unknown func code %d"), func);
1777 Mmsg1(errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1778 Emsg0(M_ERROR, 0, errmsg);
1783 * Now we try different methods of clearing the error
1784 * status on the drive so that it is not locked for
1785 * further operations.
1788 /* On some systems such as NetBSD, this clears all errors */
1791 /* Found on Solaris */
1794 tape_ioctl(m_fd, MTIOCLRERR);
1795 Dmsg0(200, "Did MTIOCLRERR\n");
1799 /* Typically on FreeBSD */
1803 /* Read and clear SCSI error status */
1804 union mterrstat mt_errstat;
1805 Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev_errno,
1806 be.bstrerror(dev_errno));
1807 tape_ioctl(m_fd, MTIOCERRSTAT, (char *)&mt_errstat);
1811 /* Clear Subsystem Exception OSF1 */
1815 mt_com.mt_op = MTCSE;
1816 mt_com.mt_count = 1;
1817 /* Clear any error condition on the tape */
1818 tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1819 Dmsg0(200, "Did MTCSE\n");
1826 * Clear volume header
1828 void DEVICE::clear_volhdr()
1830 Dmsg1(100, "Clear volhdr vol=%s\n", VolHdr.VolumeName);
1831 memset(&VolHdr, 0, sizeof(VolHdr));
1838 void DEVICE::close()
1840 Dmsg1(100, "close_dev %s\n", print_name());
1841 if (has_cap(CAP_OFFLINEUNMOUNT)) {
1846 Dmsg2(100, "device %s already closed vol=%s\n", print_name(),
1848 return; /* already closed */
1861 /* Clean up device packet so it can be reused */
1864 * Be careful not to clear items needed by the DVD driver
1865 * when it is closing a single part.
1867 state &= ~(ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF|
1868 ST_MOUNTED|ST_MEDIA|ST_SHORT);
1869 label_type = B_BACULA_LABEL;
1870 file = block_num = 0;
1873 EndFile = EndBlock = 0;
1875 Slot = -1; /* unknown slot */
1877 memset(&VolCatInfo, 0, sizeof(VolCatInfo));
1879 stop_thread_timer(tid);
1885 * This call closes the device, but it is used in DVD handling
1886 * where we close one part and then open the next part. The
1887 * difference between close_part() and close() is that close_part()
1888 * saves the state information of the device (e.g. the Volume lable,
1889 * the Volume Catalog record, ... This permits opening and closing
1890 * the Volume parts multiple times without losing track of what the
1891 * main Volume parameters are.
1893 void DEVICE::close_part(DCR * /*dcr*/)
1895 VOLUME_LABEL saveVolHdr;
1896 VOLUME_CAT_INFO saveVolCatInfo; /* Volume Catalog Information */
1899 saveVolHdr = VolHdr; /* structure assignment */
1900 saveVolCatInfo = VolCatInfo; /* structure assignment */
1901 close(); /* close current part */
1902 VolHdr = saveVolHdr; /* structure assignment */
1903 VolCatInfo = saveVolCatInfo; /* structure assignment */
1906 boffset_t DEVICE::lseek(DCR *dcr, boffset_t offset, int whence)
1910 return lseek_dvd(dcr, offset, whence);
1912 #if defined(HAVE_WIN32)
1913 return ::_lseeki64(m_fd, (__int64)offset, whence);
1915 return ::lseek(m_fd, (off_t)offset, whence);
1922 bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
1926 Dmsg1(100, "truncate %s\n", print_name());
1930 /* maybe we should rewind and write and eof ???? */
1931 return true; /* we don't really truncate tapes */
1933 return truncate_dvd(dcr);
1935 if (ftruncate(m_fd, 0) != 0) {
1937 Mmsg2(errmsg, _("Unable to truncate device %s. ERR=%s\n"),
1938 print_name(), be.bstrerror());
1943 * Check for a successful ftruncate() and issue a work-around for devices
1944 * (mostly cheap NAS) that don't support truncation.
1945 * Workaround supplied by Martin Schmid as a solution to bug #1011.
1948 * 3. open new file with same mode
1949 * 4. change ownership to original
1952 if (fstat(m_fd, &st) != 0) {
1954 Mmsg2(errmsg, _("Unable to stat device %s. ERR=%s\n"),
1955 print_name(), be.bstrerror());
1959 if (st.st_size != 0) { /* ftruncate() didn't work */
1960 POOL_MEM archive_name(PM_FNAME);
1962 pm_strcpy(archive_name, dev_name);
1963 if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) {
1964 pm_strcat(archive_name, "/");
1966 pm_strcat(archive_name, dcr->VolumeName);
1968 Mmsg2(errmsg, _("Device %s doesn't support ftruncate(). Recreating file %s.\n"),
1969 print_name(), archive_name.c_str());
1971 /* Close file and blow it away */
1973 ::unlink(archive_name.c_str());
1975 /* Recreate the file -- of course, empty */
1976 set_mode(CREATE_READ_WRITE);
1977 if ((m_fd = ::open(archive_name.c_str(), mode, st.st_mode)) < 0) {
1980 Mmsg2(errmsg, _("Could not reopen: %s, ERR=%s\n"), archive_name.c_str(),
1982 Dmsg1(100, "reopen failed: %s", errmsg);
1983 Emsg0(M_FATAL, 0, errmsg);
1987 /* Reset proper owner */
1988 chown(archive_name.c_str(), st.st_uid, st.st_gid);
1996 /* Mount the device.
1997 * If timeout, wait until the mount command returns 0.
1998 * If !timeout, try to mount the device only once.
2000 bool DEVICE::mount(int timeout)
2002 Dmsg0(190, "Enter mount\n");
2005 } else if (requires_mount()) {
2006 return do_mount(1, timeout);
2011 /* Unmount the device
2012 * If timeout, wait until the unmount command returns 0.
2013 * If !timeout, try to unmount the device only once.
2015 bool DEVICE::unmount(int timeout)
2017 Dmsg0(100, "Enter unmount\n");
2019 return do_mount(0, timeout);
2024 /* (Un)mount the device */
2025 bool DEVICE::do_mount(int mount, int dotimeout)
2027 POOL_MEM ocmd(PM_FNAME);
2030 int status, timeout;
2035 Dmsg0(200, "======= mount=1\n");
2038 icmd = device->mount_command;
2040 if (!is_mounted()) {
2041 Dmsg0(200, "======= mount=0\n");
2044 icmd = device->unmount_command;
2047 clear_freespace_ok();
2048 edit_mount_codes(ocmd, icmd);
2050 Dmsg2(100, "do_mount: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted());
2053 /* Try at most 1 time to (un)mount the device. This should perhaps be configurable. */
2058 results = get_memory(4000);
2060 /* If busy retry each second */
2061 Dmsg1(100, "do_mount run_prog=%s\n", ocmd.c_str());
2062 while ((status = run_program_full_output(ocmd.c_str(),
2063 max_open_wait/2, results)) != 0) {
2064 /* Doesn't work with internationalization (This is not a problem) */
2065 if (mount && fnmatch("*is already mounted on*", results, 0) == 0) {
2068 if (!mount && fnmatch("* not mounted*", results, 0) == 0) {
2071 if (timeout-- > 0) {
2072 /* Sometimes the device cannot be mounted because it is already mounted.
2073 * Try to unmount it, then remount it */
2075 Dmsg1(400, "Trying to unmount the device %s...\n", print_name());
2083 Dmsg5(100, "Device %s cannot be %smounted. stat=%d result=%s ERR=%s\n", print_name(),
2084 (mount ? "" : "un"), status, results, be.bstrerror(status));
2085 Mmsg(errmsg, _("Device %s cannot be %smounted. ERR=%s\n"),
2086 print_name(), (mount ? "" : "un"), be.bstrerror(status));
2088 Dmsg4(100, "Device %s cannot be %smounted. stat=%d ERR=%s\n", print_name(),
2089 (mount ? "" : "un"), status, results);
2090 Mmsg(errmsg, _("Device %s cannot be %smounted. ERR=%s\n"),
2091 print_name(), (mount ? "" : "un"), results);
2094 * Now, just to be sure it is not mounted, try to read the
2098 struct dirent *entry, *result;
2102 name_max = pathconf(".", _PC_NAME_MAX);
2103 if (name_max < 1024) {
2107 if (!(dp = opendir(device->mount_point))) {
2110 Dmsg3(100, "do_mount: failed to open dir %s (dev=%s), ERR=%s\n",
2111 device->mount_point, print_name(), be.bstrerror());
2115 entry = (struct dirent *)malloc(sizeof(struct dirent) + name_max + 1000);
2118 if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) {
2120 Dmsg2(129, "do_mount: failed to find suitable file in dir %s (dev=%s)\n",
2121 device->mount_point, print_name());
2124 if ((strcmp(result->d_name, ".")) && (strcmp(result->d_name, "..")) && (strcmp(result->d_name, ".keep"))) {
2125 count++; /* result->d_name != ., .. or .keep (Gentoo-specific) */
2128 Dmsg2(129, "do_mount: ignoring %s in %s\n", result->d_name, device->mount_point);
2134 Dmsg1(100, "do_mount: got %d files in the mount point (not counting ., .. and .keep)\n", count);
2137 /* If we got more than ., .. and .keep */
2138 /* there must be something mounted */
2140 Dmsg1(100, "Did Mount by count=%d\n", count);
2143 /* An unmount request. We failed to unmount - report an error */
2145 free_pool_memory(results);
2146 Dmsg0(200, "== error mount=1 wanted unmount\n");
2152 free_pool_memory(results);
2153 Dmsg0(200, "============ mount=0\n");
2158 set_mounted(mount); /* set/clear mounted flag */
2159 free_pool_memory(results);
2160 /* Do not check free space when unmounting */
2161 if (mount && !update_freespace()) {
2164 Dmsg1(200, "============ mount=%d\n", mount);
2169 * Edit codes into (Un)MountCommand, Write(First)PartCommand
2171 * %a = archive device name
2172 * %e = erase (set if cannot mount and first part)
2175 * %v = last part name
2177 * omsg = edited output message
2178 * imsg = input string containing edit codes (%x)
2181 void DEVICE::edit_mount_codes(POOL_MEM &omsg, const char *imsg)
2187 POOL_MEM archive_name(PM_FNAME);
2189 omsg.c_str()[0] = 0;
2190 Dmsg1(800, "edit_mount_codes: %s\n", imsg);
2191 for (p=imsg; *p; p++) {
2201 if (num_dvd_parts == 0) {
2202 if (truncating || blank_dvd) {
2212 bsnprintf(add, sizeof(add), "%d", part);
2216 str = device->mount_point;
2219 make_spooled_dvd_filename(this, archive_name);
2220 str = archive_name.c_str();
2234 Dmsg1(1900, "add_str %s\n", str);
2235 pm_strcat(omsg, (char *)str);
2236 Dmsg1(1800, "omsg=%s\n", omsg.c_str());
2240 /* return the last timer interval (ms)
2241 * or 0 if something goes wrong
2243 btime_t DEVICE::get_timer_count()
2245 btime_t temp = last_timer;
2246 last_timer = get_current_btime();
2247 temp = last_timer - temp; /* get elapsed time */
2248 return (temp>0)?temp:0; /* take care of skewed clock */
2252 ssize_t DEVICE::read(void *buf, size_t len)
2258 if (this->is_tape()) {
2259 read_len = tape_read(m_fd, buf, len);
2261 read_len = ::read(m_fd, buf, len);
2264 last_tick = get_timer_count();
2266 DevReadTime += last_tick;
2267 VolCatInfo.VolReadTime += last_tick;
2269 if (read_len > 0) { /* skip error */
2270 DevReadBytes += read_len;
2277 ssize_t DEVICE::write(const void *buf, size_t len)
2283 if (this->is_tape()) {
2284 write_len = tape_write(m_fd, buf, len);
2286 write_len = ::write(m_fd, buf, len);
2289 last_tick = get_timer_count();
2291 DevWriteTime += last_tick;
2292 VolCatInfo.VolWriteTime += last_tick;
2294 if (write_len > 0) { /* skip error */
2295 DevWriteBytes += write_len;
2301 /* Return the resource name for the device */
2302 const char *DEVICE::name() const
2304 return device->hdr.name;
2307 /* Returns file position on tape or -1 */
2308 int32_t DEVICE::get_os_tape_file()
2310 struct mtget mt_stat;
2312 if (has_cap(CAP_MTIOCGET) &&
2313 tape_ioctl(m_fd, MTIOCGET, (char *)&mt_stat) == 0) {
2314 return mt_stat.mt_fileno;
2320 dev_vol_name(DEVICE *dev)
2322 return dev->VolCatInfo.VolCatName;
2327 * Free memory allocated for the device
2329 void DEVICE::term(void)
2331 Dmsg1(900, "term dev: %s\n", print_name());
2334 free_memory(dev_name);
2338 free_memory(prt_name);
2342 free_pool_memory(errmsg);
2345 pthread_mutex_destroy(&m_mutex);
2346 pthread_cond_destroy(&wait);
2347 pthread_cond_destroy(&wait_next_vol);
2348 pthread_mutex_destroy(&spool_mutex);
2349 // rwl_destroy(&lock);
2350 if (attached_dcrs) {
2351 delete attached_dcrs;
2352 attached_dcrs = NULL;
2361 * This routine initializes the device wait timers
2363 void init_device_wait_timers(DCR *dcr)
2365 DEVICE *dev = dcr->dev;
2366 JCR *jcr = dcr->jcr;
2368 /* ******FIXME******* put these on config variables */
2369 dev->min_wait = 60 * 60;
2370 dev->max_wait = 24 * 60 * 60;
2371 dev->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
2372 dev->wait_sec = dev->min_wait;
2373 dev->rem_wait_sec = dev->wait_sec;
2376 dev->BadVolName[0] = 0;
2378 jcr->min_wait = 60 * 60;
2379 jcr->max_wait = 24 * 60 * 60;
2380 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
2381 jcr->wait_sec = jcr->min_wait;
2382 jcr->rem_wait_sec = jcr->wait_sec;
2387 void init_jcr_device_wait_timers(JCR *jcr)
2389 /* ******FIXME******* put these on config variables */
2390 jcr->min_wait = 60 * 60;
2391 jcr->max_wait = 24 * 60 * 60;
2392 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
2393 jcr->wait_sec = jcr->min_wait;
2394 jcr->rem_wait_sec = jcr->wait_sec;
2400 * The dev timers are used for waiting on a particular device
2402 * Returns: true if time doubled
2403 * false if max time expired
2405 bool double_dev_wait_time(DEVICE *dev)
2407 dev->wait_sec *= 2; /* double wait time */
2408 if (dev->wait_sec > dev->max_wait) { /* but not longer than maxtime */
2409 dev->wait_sec = dev->max_wait;
2412 dev->rem_wait_sec = dev->wait_sec;
2413 if (dev->num_wait >= dev->max_num_wait) {
2420 void set_os_device_parameters(DCR *dcr)
2422 DEVICE *dev = dcr->dev;
2424 if (strcmp(dev->dev_name, "/dev/null") == 0) {
2425 return; /* no use trying to set /dev/null */
2428 #if defined(HAVE_LINUX_OS) || defined(HAVE_WIN32)
2431 Dmsg0(100, "In set_os_device_parameters\n");
2432 #if defined(MTSETBLK)
2433 if (dev->min_block_size == dev->max_block_size &&
2434 dev->min_block_size == 0) { /* variable block mode */
2435 mt_com.mt_op = MTSETBLK;
2436 mt_com.mt_count = 0;
2437 Dmsg0(100, "Set block size to zero\n");
2438 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2439 dev->clrerror(MTSETBLK);
2443 #if defined(MTSETDRVBUFFER)
2444 if (getuid() == 0) { /* Only root can do this */
2445 mt_com.mt_op = MTSETDRVBUFFER;
2446 mt_com.mt_count = MT_ST_CLEARBOOLEANS;
2447 if (!dev->has_cap(CAP_TWOEOF)) {
2448 mt_com.mt_count |= MT_ST_TWO_FM;
2450 if (dev->has_cap(CAP_EOM)) {
2451 mt_com.mt_count |= MT_ST_FAST_MTEOM;
2453 Dmsg0(100, "MTSETDRVBUFFER\n");
2454 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2455 dev->clrerror(MTSETDRVBUFFER);
2462 #ifdef HAVE_NETBSD_OS
2464 if (dev->min_block_size == dev->max_block_size &&
2465 dev->min_block_size == 0) { /* variable block mode */
2466 mt_com.mt_op = MTSETBSIZ;
2467 mt_com.mt_count = 0;
2468 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2469 dev->clrerror(MTSETBSIZ);
2471 /* Get notified at logical end of tape */
2472 mt_com.mt_op = MTEWARN;
2473 mt_com.mt_count = 1;
2474 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2475 dev->clrerror(MTEWARN);
2481 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
2483 if (dev->min_block_size == dev->max_block_size &&
2484 dev->min_block_size == 0) { /* variable block mode */
2485 mt_com.mt_op = MTSETBSIZ;
2486 mt_com.mt_count = 0;
2487 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2488 dev->clrerror(MTSETBSIZ);
2491 #if defined(MTIOCSETEOTMODEL)
2493 if (dev->has_cap(CAP_TWOEOF)) {
2498 if (tape_ioctl(dev->fd(), MTIOCSETEOTMODEL, (caddr_t)&neof) < 0) {
2500 dev->dev_errno = errno; /* save errno */
2501 Mmsg2(dev->errmsg, _("Unable to set eotmodel on device %s: ERR=%s\n"),
2502 dev->print_name(), be.bstrerror(dev->dev_errno));
2503 Jmsg(dcr->jcr, M_FATAL, 0, dev->errmsg);
2511 if (dev->min_block_size == dev->max_block_size &&
2512 dev->min_block_size == 0) { /* variable block mode */
2513 mt_com.mt_op = MTSRSZ;
2514 mt_com.mt_count = 0;
2515 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2516 dev->clrerror(MTSRSZ);
2523 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
2525 Dmsg0(100, "dev_get_os_pos\n");
2526 return dev->has_cap(CAP_MTIOCGET) &&
2527 tape_ioctl(dev->fd(), MTIOCGET, (char *)mt_stat) == 0 &&
2528 mt_stat->mt_fileno >= 0;
2531 static const char *modes[] = {
2532 "CREATE_READ_WRITE",
2539 static const char *mode_to_str(int mode)
2541 static char buf[100];
2542 if (mode < 1 || mode > 4) {
2543 bsnprintf(buf, sizeof(buf), "BAD mode=%d", mode);
2546 return modes[mode-1];