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 Bacula® - The Network Backup Solution
34 Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
36 The main author of Bacula is Kern Sibbald, with contributions from
37 many others, a complete list can be found in the file AUTHORS.
38 This program is Free Software; you can redistribute it and/or
39 modify it under the terms of version two of the GNU General Public
40 License as published by the Free Software Foundation plus additions
41 that are listed in the file LICENSE.
43 This program is distributed in the hope that it will be useful, but
44 WITHOUT ANY WARRANTY; without even the implied warranty of
45 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
46 General Public License for more details.
48 You should have received a copy of the GNU General Public License
49 along with this program; if not, write to the Free Software
50 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
53 Bacula® is a registered trademark of John Walker.
54 The licensor of Bacula is the Free Software Foundation Europe
55 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
56 Switzerland, email:ftf@fsfeurope.org.
60 * Handling I/O errors and end of tape conditions are a bit tricky.
61 * This is how it is currently done when writting.
62 * On either an I/O error or end of tape,
63 * we will stop writing on the physical device (no I/O recovery is
64 * attempted at least in this daemon). The state flag will be sent
65 * to include ST_EOT, which is ephemeral, and ST_WEOT, which is
66 * persistent. Lots of routines clear ST_EOT, but ST_WEOT is
67 * cleared only when the problem goes away. Now when ST_WEOT
68 * is set all calls to write_block_to_device() call the fix_up
69 * routine. In addition, all threads are blocked
70 * from writing on the tape by calling lock_dev(), and thread other
71 * than the first thread to hit the EOT will block on a condition
72 * variable. The first thread to hit the EOT will continue to
73 * be able to read and write the tape (he sort of tunnels through
74 * the locking mechanism -- see lock_dev() for details).
76 * Now presumably somewhere higher in the chain of command
77 * (device.c), someone will notice the EOT condition and
78 * get a new tape up, get the tape label read, and mark
79 * the label for rewriting. Then this higher level routine
80 * will write the unwritten buffer to the new volume.
81 * Finally, he will release
82 * any blocked threads by doing a broadcast on the condition
83 * variable. At that point, we should be totally back in
84 * business with no lost data.
95 /* Forward referenced functions */
96 void set_os_device_parameters(DCR *dcr);
97 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat);
98 static char *mode_to_str(int mode);
101 * Allocate and initialize the DEVICE structure
102 * Note, if dev is non-NULL, it is already allocated,
103 * thus we neither allocate it nor free it. This allows
104 * the caller to put the packet in shared memory.
106 * Note, for a tape, the device->device_name is the device name
107 * (e.g. /dev/nst0), and for a file, the device name
108 * is the directory in which the file will be placed.
112 init_dev(JCR *jcr, DEVRES *device)
120 /* If no device type specified, try to guess */
121 if (!device->dev_type) {
122 /* Check that device is available */
123 if (stat(device->device_name, &statp) < 0) {
125 Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"),
126 device->device_name, be.strerror());
129 if (S_ISDIR(statp.st_mode)) {
130 device->dev_type = B_FILE_DEV;
131 } else if (S_ISCHR(statp.st_mode)) {
132 device->dev_type = B_TAPE_DEV;
133 } else if (S_ISFIFO(statp.st_mode)) {
134 device->dev_type = B_FIFO_DEV;
135 } else if (!(device->cap_bits & CAP_REQMOUNT)) {
136 Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory\n"
137 " or have RequiresMount=yes for DVD. st_mode=%x\n"),
138 device->device_name, statp.st_mode);
141 device->dev_type = B_DVD_DEV;
145 dev = (DEVICE *)malloc(sizeof(DEVICE));
146 memset(dev, 0, sizeof(DEVICE));
147 dev->Slot = -1; /* unknown */
149 /* Copy user supplied device parameters from Resource */
150 dev->dev_name = get_memory(strlen(device->device_name)+1);
151 pm_strcpy(dev->dev_name, device->device_name);
152 dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
153 /* We edit "Resource-name" (physical-name) */
154 Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
155 Dmsg1(400, "Allocate dev=%s\n", dev->print_name());
156 dev->capabilities = device->cap_bits;
157 dev->min_block_size = device->min_block_size;
158 dev->max_block_size = device->max_block_size;
159 dev->max_volume_size = device->max_volume_size;
160 dev->max_file_size = device->max_file_size;
161 dev->volume_capacity = device->volume_capacity;
162 dev->max_rewind_wait = device->max_rewind_wait;
163 dev->max_open_wait = device->max_open_wait;
164 dev->max_open_vols = device->max_open_vols;
165 dev->vol_poll_interval = device->vol_poll_interval;
166 dev->max_spool_size = device->max_spool_size;
167 dev->drive_index = device->drive_index;
168 dev->autoselect = device->autoselect;
169 dev->dev_type = device->dev_type;
170 if (dev->is_tape()) { /* No parts on tapes */
171 dev->max_part_size = 0;
173 dev->max_part_size = device->max_part_size;
176 if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
177 dev->vol_poll_interval = 60;
179 /* Link the dev and device structures together */
180 dev->device = device;
183 if (dev->is_fifo()) {
184 dev->capabilities |= CAP_STREAM; /* set stream device */
187 /* If the device requires mount :
188 * - Check that the mount point is available
189 * - Check that (un)mount commands are defined
191 if ((dev->is_file() || dev->is_dvd()) && dev->requires_mount()) {
192 if (!device->mount_point || stat(device->mount_point, &statp) < 0) {
194 dev->dev_errno = errno;
195 Jmsg2(jcr, M_ERROR_TERM, 0, _("Unable to stat mount point %s: ERR=%s\n"),
196 device->mount_point, be.strerror());
200 if (!device->mount_command || !device->unmount_command) {
201 Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n"));
203 if (!device->write_part_command) {
204 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 > 1000000) {
209 Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
210 dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
211 dev->max_block_size = 0;
213 if (dev->max_block_size % TAPE_BSIZE != 0) {
214 Jmsg2(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size.\n"),
215 dev->max_block_size, dev->print_name());
218 dev->errmsg = get_pool_memory(PM_EMSG);
221 if ((errstat = pthread_mutex_init(&dev->mutex, NULL)) != 0) {
223 dev->dev_errno = errstat;
224 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
225 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
227 if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
229 dev->dev_errno = errstat;
230 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
231 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
233 if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
235 dev->dev_errno = errstat;
236 Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
237 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
239 if ((errstat = pthread_mutex_init(&dev->spool_mutex, NULL)) != 0) {
241 dev->dev_errno = errstat;
242 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
243 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
245 if ((errstat = rwl_init(&dev->lock)) != 0) {
247 dev->dev_errno = errstat;
248 Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
249 Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
253 dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
254 Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
260 * Open the device with the operating system and
261 * initialize buffer pointers.
263 * Returns: -1 on error
266 * Note, for a tape, the VolName is the name we give to the
267 * volume (not really used here), but for a file, the
268 * VolName represents the name of the file to be created/opened.
269 * In the case of a file, the full name is the device name
270 * (archive_name) with the VolName concatenated.
273 DEVICE::open(DCR *dcr, int omode)
277 if (openmode == omode) {
286 Dmsg0(100, "Close fd for mode change.\n");
287 preserve = state & (ST_LABEL|ST_APPEND|ST_READ);
291 bstrncpy(VolCatInfo.VolCatName, dcr->VolumeName, sizeof(VolCatInfo.VolCatName));
294 Dmsg4(29, "open dev: type=%d dev_name=%s vol=%s mode=%s\n", dev_type,
295 print_name(), VolCatInfo.VolCatName, mode_to_str(omode));
296 state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
297 Slot = -1; /* unknown slot */
298 label_type = B_BACULA_LABEL;
299 if (is_tape() || is_fifo()) {
300 open_tape_device(dcr, omode);
301 } else if (is_dvd()) {
302 Dmsg1(100, "call open_dvd_device mode=%s\n", mode_to_str(omode));
303 open_dvd_device(dcr, omode);
305 Dmsg1(100, "call open_file_device mode=%s\n", mode_to_str(omode));
306 open_file_device(dcr, omode);
308 state |= preserve; /* reset any important state info */
309 Dmsg2(100, "preserve=0x%x fd=%d\n", preserve, m_fd);
313 void DEVICE::set_mode(int new_mode)
316 case CREATE_READ_WRITE:
317 mode = O_CREAT | O_RDWR | O_BINARY;
319 case OPEN_READ_WRITE:
320 mode = O_RDWR | O_BINARY;
323 mode = O_RDONLY | O_BINARY;
325 case OPEN_WRITE_ONLY:
326 mode = O_WRONLY | O_BINARY;
329 Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
335 void DEVICE::open_tape_device(DCR *dcr, int omode)
338 int timeout = max_open_wait;
339 #if !defined(HAVE_WIN32)
341 utime_t start_time = time(NULL);
345 Dmsg0(29, "Open dev: device is tape\n");
347 get_autochanger_loaded_slot(dcr);
356 if (is_fifo() && timeout) {
358 tid = start_thread_timer(pthread_self(), timeout);
360 Dmsg2(100, "Try open %s mode=%s\n", print_name(), mode_to_str(omode));
361 #if defined(HAVE_WIN32)
364 if ((m_fd = tape_open(dev_name, mode)) < 0) {
371 /* If busy retry each second for max_open_wait seconds */
373 /* Try non-blocking open */
374 m_fd = ::open(dev_name, mode+O_NONBLOCK);
378 Dmsg5(050, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n",
379 print_name(), omode, mode, errno, be.strerror());
381 /* Tape open, now rewind it */
382 Dmsg0(050, "Rewind after open\n");
383 mt_com.mt_op = MTREW;
385 /* rewind only if dev is a tape */
386 if (is_tape() && (ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0)) {
388 dev_errno = errno; /* set error status from rewind */
391 Dmsg2(100, "Rewind error on %s close: ERR=%s\n", print_name(),
392 be.strerror(dev_errno));
393 /* If we get busy, device is probably rewinding, try again */
394 if (dev_errno != EBUSY) {
395 break; /* error -- no medium */
398 /* Got fd and rewind worked, so we must have medium in drive */
400 m_fd = ::open(dev_name, mode); /* open normally */
404 Dmsg5(050, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n",
405 print_name(), omode, mode, errno, be.strerror());
410 set_os_device_parameters(dcr); /* do system dependent stuff */
411 break; /* Successfully opened and rewound */
415 /* Exceed wait time ? */
416 if (time(NULL) - start_time >= max_open_wait) {
417 break; /* yes, get out */
424 Mmsg2(errmsg, _("Unable to open device %s: ERR=%s\n"),
425 print_name(), be.strerror(dev_errno));
426 Dmsg1(100, "%s", errmsg);
429 /* Stop any open() timer we started */
431 stop_thread_timer(tid);
434 Dmsg1(29, "open dev: tape %d opened\n", m_fd);
441 void DEVICE::open_file_device(DCR *dcr, int omode)
443 POOL_MEM archive_name(PM_FNAME);
445 get_autochanger_loaded_slot(dcr);
448 * Handle opening of File Archive (not a tape)
451 pm_strcpy(archive_name, dev_name);
453 * If this is a virtual autochanger (i.e. changer_res != NULL)
454 * we simply use the device name, assuming it has been
455 * appropriately setup by the "autochanger".
457 if (!device->changer_res || device->changer_command[0] == 0) {
458 if (VolCatInfo.VolCatName[0] == 0) {
459 Mmsg(errmsg, _("Could not open file device %s. No Volume name given.\n"),
465 if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) {
466 pm_strcat(archive_name, "/");
468 pm_strcat(archive_name, VolCatInfo.VolCatName);
471 mount(1); /* do mount if required */
475 /* If creating file, give 0640 permissions */
476 Dmsg3(29, "open disk: mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode),
477 archive_name.c_str(), mode);
478 /* Use system open() */
479 if ((m_fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
482 Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
484 Dmsg1(29, "open failed: %s", errmsg);
485 Emsg0(M_FATAL, 0, errmsg);
491 Dmsg4(29, "open dev: disk fd=%d opened, part=%d/%d, part_size=%u\n",
492 m_fd, part, num_dvd_parts, part_size);
496 * Open a DVD device. N.B. at this point, dcr->VolCatInfo.VolCatName
497 * (NB:??? I think it's VolCatInfo.VolCatName that is right)
498 * has the desired Volume name, but there is NO assurance that
499 * any other field of VolCatInfo is correct.
501 void DEVICE::open_dvd_device(DCR *dcr, int omode)
503 POOL_MEM archive_name(PM_FNAME);
504 struct stat filestat;
507 * Handle opening of DVD Volume
509 Dmsg2(29, "Enter: open_dvd_dev: DVD vol=%s mode=%s\n",
510 &dcr->VolCatInfo, mode_to_str(omode));
513 * For a DVD we must always pull the state info from dcr->VolCatInfo
514 * This is a bit ugly, but is necessary because we need to open/close/re-open
515 * the dvd file in order to properly mount/unmount and access the
516 * DVD. So we store the state of the DVD as far as is known in the
517 * catalog in dcr->VolCatInfo, and thus we refresh the dev->VolCatInfo
518 * copy here, when opening.
520 VolCatInfo = dcr->VolCatInfo; /* structure assignment */
521 Dmsg1(100, "Volume=%s\n", VolCatInfo.VolCatName);
523 if (VolCatInfo.VolCatName[0] == 0) {
524 Dmsg1(10, "Could not open DVD device %s. No Volume name given.\n",
526 Mmsg(errmsg, _("Could not open DVD device %s. No Volume name given.\n"),
533 Dmsg0(100, "Set part=1\n");
534 part = 1; /* count from 1 */
538 if (num_dvd_parts != VolCatInfo.VolCatParts) {
539 num_dvd_parts = VolCatInfo.VolCatParts;
543 * If we are not trying to access the last part, set mode to
544 * OPEN_READ_ONLY as writing would be an error.
546 Dmsg2(29, "open DVD part=%d num_dvd_parts=%d\n", part, num_dvd_parts);
547 /* Now find the name of the part that we want to access */
548 if (part <= num_dvd_parts) {
549 omode = OPEN_READ_ONLY;
550 make_mounted_dvd_filename(this, archive_name);
551 set_part_spooled(false);
553 omode = OPEN_READ_WRITE;
554 make_spooled_dvd_filename(this, archive_name);
555 set_part_spooled(true);
559 // Clear any previous blank_dvd status - we will recalculate it here
562 Dmsg3(99, "open_dvd_device: part=%d num_dvd_parts=%d, VolCatInfo.VolCatParts=%d\n",
563 part, num_dvd_parts, dcr->VolCatInfo.VolCatParts);
566 Dmsg0(99, "DVD device mounted.\n");
567 if (num_dvd_parts == 0 && !truncating) {
569 * If we can mount the device, and we are not truncating the DVD,
570 * we usually want to abort. There is one exception, if there is
571 * only one 0-sized file on the DVD, with the right volume name,
572 * we continue (it's the method used by truncate_dvd to truncate a volume).
574 if (!check_can_write_on_non_blank_dvd(dcr)) {
575 Mmsg(errmsg, _("The DVD in device %s contains data, please blank it before writing.\n"), print_name());
576 Emsg0(M_FATAL, 0, errmsg);
577 unmount(1); /* Unmount the device, so the operator can change it. */
584 * Ensure that we have the correct DVD loaded by looking for part1.
585 * We only succeed the open if it exists. Failure to do this could
586 * leave us trying to add a part to a different DVD!
588 uint32_t oldpart = part;
590 POOL_MEM part1_name(PM_FNAME);
592 make_mounted_dvd_filename(this, part1_name);
594 if (stat(part1_name.c_str(), &statp) < 0) {
596 Mmsg(errmsg, _("Unable to stat DVD part 1 file %s: ERR=%s\n"),
597 part1_name.c_str(), be.strerror());
598 Emsg0(M_FATAL, 0, errmsg);
602 if (!S_ISREG(statp.st_mode)) {
603 /* It is not a regular file */
604 Mmsg(errmsg, _("DVD part 1 is not a regular file %s.\n"),
606 Emsg0(M_FATAL, 0, errmsg);
612 Dmsg0(99, "DVD device mount failed.\n");
613 /* We cannot mount the device */
614 if (num_dvd_parts == 0) {
615 /* Run free space, check there is a media. */
616 if (!update_freespace()) {
617 Emsg0(M_FATAL, 0, errmsg);
622 Dmsg1(29, "Could not mount device %s, this is not a problem (num_dvd_parts == 0), and have media.\n", print_name());
624 Mmsg(errmsg, _("There is no valid DVD in device %s.\n"), print_name());
625 Emsg0(M_FATAL, 0, errmsg);
630 Mmsg(errmsg, _("Could not mount DVD device %s.\n"), print_name());
631 Emsg0(M_FATAL, 0, errmsg);
637 Dmsg5(29, "open dev: DVD dev=%s mode=%s part=%d npart=%d volcatnparts=%d\n",
638 archive_name.c_str(), mode_to_str(omode),
639 part, num_dvd_parts, dcr->VolCatInfo.VolCatParts);
641 Dmsg2(100, "openmode=%d %s\n", openmode, mode_to_str(openmode));
644 /* If creating file, give 0640 permissions */
645 Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode),
646 archive_name.c_str(), mode);
647 /* Use system open() */
648 if ((m_fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
650 Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
652 // Should this be set if we try the create/open below
653 dev_errno = EIO; /* Interpreted as no device present by acquire.c:acquire_device_for_read(). */
654 Dmsg1(29, "open failed: %s", errmsg);
656 /* Previous open failed. See if we can recover */
657 if ((omode == OPEN_READ_ONLY || omode == OPEN_READ_WRITE) &&
658 (part > num_dvd_parts)) {
659 /* If the last part (on spool), doesn't exist when accessing,
660 * create it. In read/write mode a write will be allowed (higher
661 * level software thinks that we are extending a pre-existing
662 * media. Reads for READ_ONLY will report immediately an EOF
663 * Sometimes it is better to finish with an EOF than with an error. */
664 Dmsg1(29, "Creating last part on spool: %s\n", archive_name.c_str());
665 omode = CREATE_READ_WRITE;
666 set_mode(CREATE_READ_WRITE);
667 m_fd = ::open(archive_name.c_str(), mode, 0640);
671 Dmsg1(100, "after open fd=%d\n", m_fd);
673 if (omode == OPEN_READ_WRITE || omode == CREATE_READ_WRITE) {
676 /* Get size of file */
677 if (fstat(m_fd, &filestat) < 0) {
680 Mmsg2(errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(),
682 Dmsg1(29, "open failed: %s", errmsg);
683 /* Use system close() */
687 part_size = filestat.st_size;
689 update_pos(dcr); /* update position */
697 * Returns: true on success
700 bool DEVICE::rewind(DCR *dcr)
706 Dmsg3(400, "rewind res=%d fd=%d %s\n", reserved_device, m_fd, print_name());
707 state &= ~(ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
708 block_num = file = 0;
712 if (!is_dvd()) { /* In case of major error, the fd is not open on DVD, so we don't want to abort. */
714 Mmsg1(errmsg, _("Bad call to rewind. Device %s not open\n"),
716 Emsg0(M_ABORT, 0, errmsg);
721 mt_com.mt_op = MTREW;
723 /* If we get an I/O error on rewind, it is probably because
724 * the drive is actually busy. We loop for (about 5 minutes)
725 * retrying every 5 seconds.
727 for (i=max_rewind_wait; ; i -= 5) {
728 if (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
731 if (i == max_rewind_wait) {
732 Dmsg1(200, "Rewind error, %s. retrying ...\n", be.strerror());
735 * This is a gross hack, because if the user has the
736 * device mounted (i.e. open), then uses mtx to load
737 * a tape, the current open file descriptor is invalid.
738 * So, we close the drive and re-open it.
741 int open_mode = openmode;
744 open(dcr, open_mode);
752 if (dev_errno == EIO) {
753 Mmsg1(errmsg, _("No tape loaded or drive offline on %s.\n"), print_name());
757 if (dev_errno == EIO && i > 0) {
758 Dmsg0(200, "Sleeping 5 seconds.\n");
763 Mmsg2(errmsg, _("Rewind error on %s. ERR=%s.\n"),
764 print_name(), be.strerror());
769 } else if (is_file() || is_dvd()) {
770 if (lseek(dcr, (boffset_t)0, SEEK_SET) < 0) {
773 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
774 print_name(), be.strerror());
781 void DEVICE::block(int why)
784 block_device(this, why);
788 void DEVICE::unblock()
791 unblock_device(this);
795 const char *DEVICE::print_blocked() const
797 switch (dev_blocked) {
798 case BST_NOT_BLOCKED:
799 return "BST_NOT_BLOCKED";
801 return "BST_UNMOUNTED";
802 case BST_WAITING_FOR_SYSOP:
803 return "BST_WAITING_FOR_SYSOP";
804 case BST_DOING_ACQUIRE:
805 return "BST_DOING_ACQUIRE";
806 case BST_WRITING_LABEL:
807 return "BST_WRITING_LABEL";
808 case BST_UNMOUNTED_WAITING_FOR_SYSOP:
809 return "BST_UNMOUNTED_WAITING_FOR_SYSOP";
813 return _("unknown blocked code");
818 * Called to indicate that we have just read an
819 * EOF from the device.
821 void DEVICE::set_ateof()
833 * Called to indicate we are now at the end of the tape, and
834 * writing is not possible.
836 void DEVICE::set_ateot()
838 /* Make tape effectively read-only */
839 state |= (ST_EOF|ST_EOT|ST_WEOT);
844 * Position device to end of medium (end of data)
845 * Returns: true on succes
848 bool DEVICE::eod(DCR *dcr)
851 struct mtget mt_stat;
857 Mmsg1(errmsg, _("Bad call to eod. Device %s not open\n"), print_name());
861 #if defined (__digital__) && defined (__unix__)
862 return fsf(VolCatInfo.VolCatFiles);
869 clear_eof(); /* remove EOF flag */
870 block_num = file = 0;
873 if (is_fifo() || is_prog()) {
877 pos = lseek(dcr, (boffset_t)0, SEEK_END);
878 // Dmsg1(100, "====== Seek to %lld\n", pos);
886 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
887 print_name(), be.strerror());
891 if (has_cap(CAP_FASTFSF) && !has_cap(CAP_EOM)) {
892 Dmsg0(100,"Using FAST FSF for EOM\n");
893 /* If unknown position, rewind */
894 if (!dev_get_os_pos(this, &mt_stat)) {
899 mt_com.mt_op = MTFSF;
901 * ***FIXME*** fix code to handle case that INT16_MAX is
904 mt_com.mt_count = INT16_MAX; /* use big positive number */
905 if (mt_com.mt_count < 0) {
906 mt_com.mt_count = INT16_MAX; /* brain damaged system */
910 if (has_cap(CAP_MTIOCGET) && (has_cap(CAP_FASTFSF) || has_cap(CAP_EOM))) {
911 if (has_cap(CAP_EOM)) {
912 Dmsg0(100,"Using EOM for EOM\n");
913 mt_com.mt_op = MTEOM;
917 if (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
919 clrerror(mt_com.mt_op);
920 Dmsg1(50, "ioctl error: %s\n", be.strerror());
922 Mmsg2(errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
923 print_name(), be.strerror());
927 if (!dev_get_os_pos(this, &mt_stat)) {
930 Mmsg2(errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
931 print_name(), be.strerror());
934 Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
936 file = mt_stat.mt_fileno;
942 * Rewind then use FSF until EOT reached
948 * Move file by file to the end of the tape
951 for (file_num=file; !at_eot(); file_num++) {
952 Dmsg0(200, "eod: doing fsf 1\n");
954 Dmsg0(200, "fsf error.\n");
958 * Avoid infinite loop by ensuring we advance.
960 if (!at_eot() && file_num == (int)file) {
961 struct mtget mt_stat;
962 Dmsg1(100, "fsf did not advance from file %d\n", file_num);
964 if (dev_get_os_pos(this, &mt_stat)) {
965 Dmsg2(100, "Adjust file from %d to %d\n", file_num, mt_stat.mt_fileno);
966 file = mt_stat.mt_fileno;
973 * Some drivers leave us after second EOF when doing
974 * MTEOM, so we must backup so that appending overwrites
977 if (has_cap(CAP_BSFATEOM)) {
978 struct mtget mt_stat;
979 /* Backup over EOF */
981 /* If BSF worked and fileno is known (not -1), set file */
982 if (dev_get_os_pos(this, &mt_stat)) {
983 Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", file , mt_stat.mt_fileno);
984 file = mt_stat.mt_fileno;
986 file++; /* wing it -- not correct on all OSes */
989 update_pos(dcr); /* update position */
991 Dmsg1(200, "EOD dev->file=%d\n", file);
996 * Set the position of the device -- only for files and DVD
997 * For other devices, there is no generic way to do it.
998 * Returns: true on succes
1001 bool DEVICE::update_pos(DCR *dcr)
1008 Mmsg0(errmsg, _("Bad device call. Device not open\n"));
1009 Emsg1(M_FATAL, 0, "%s", errmsg);
1013 /* Find out where we are */
1014 if (is_file() || is_dvd()) {
1017 pos = lseek(dcr, (boffset_t)0, SEEK_CUR);
1021 Pmsg1(000, _("Seek error: ERR=%s\n"), be.strerror());
1022 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
1023 print_name(), be.strerror());
1027 block_num = (uint32_t)pos;
1028 file = (uint32_t)(pos >> 32);
1035 * Return the status of the device. This was meant
1036 * to be a generic routine. Unfortunately, it doesn't
1037 * seem possible (at least I do not know how to do it
1038 * currently), which means that for the moment, this
1039 * routine has very little value.
1043 uint32_t status_dev(DEVICE *dev)
1045 struct mtget mt_stat;
1048 if (dev->state & (ST_EOT | ST_WEOT)) {
1052 if (dev->state & ST_EOF) {
1056 if (dev->is_tape()) {
1058 Pmsg0(-20,_(" Bacula status:"));
1059 Pmsg2(-20,_(" file=%d block=%d\n"), dev->file, dev->block_num);
1060 if (tape_ioctl(dev->fd(), MTIOCGET, (char *)&mt_stat) < 0) {
1062 dev->dev_errno = errno;
1063 Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
1064 dev->print_name(), be.strerror());
1067 Pmsg0(-20, _(" Device status:"));
1069 #if defined(HAVE_LINUX_OS)
1070 if (GMT_EOF(mt_stat.mt_gstat)) {
1074 if (GMT_BOT(mt_stat.mt_gstat)) {
1078 if (GMT_EOT(mt_stat.mt_gstat)) {
1082 if (GMT_SM(mt_stat.mt_gstat)) {
1086 if (GMT_EOD(mt_stat.mt_gstat)) {
1090 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
1091 stat |= BMT_WR_PROT;
1092 Pmsg0(-20, " WR_PROT");
1094 if (GMT_ONLINE(mt_stat.mt_gstat)) {
1096 Pmsg0(-20, " ONLINE");
1098 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
1099 stat |= BMT_DR_OPEN;
1100 Pmsg0(-20, " DR_OPEN");
1102 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
1103 stat |= BMT_IM_REP_EN;
1104 Pmsg0(-20, " IM_REP_EN");
1106 #elif defined(HAVE_WIN32)
1107 if (GMT_EOF(mt_stat.mt_gstat)) {
1111 if (GMT_BOT(mt_stat.mt_gstat)) {
1115 if (GMT_EOT(mt_stat.mt_gstat)) {
1119 if (GMT_EOD(mt_stat.mt_gstat)) {
1123 if (GMT_WR_PROT(mt_stat.mt_gstat)) {
1124 stat |= BMT_WR_PROT;
1125 Pmsg0(-20, " WR_PROT");
1127 if (GMT_ONLINE(mt_stat.mt_gstat)) {
1129 Pmsg0(-20, " ONLINE");
1131 if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
1132 stat |= BMT_DR_OPEN;
1133 Pmsg0(-20, " DR_OPEN");
1135 if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
1136 stat |= BMT_IM_REP_EN;
1137 Pmsg0(-20, " IM_REP_EN");
1140 #endif /* !SunOS && !OSF */
1141 if (dev->has_cap(CAP_MTIOCGET)) {
1142 Pmsg2(-20, _(" file=%d block=%d\n"), mt_stat.mt_fileno, mt_stat.mt_blkno);
1144 Pmsg2(-20, _(" file=%d block=%d\n"), -1, -1);
1147 stat |= BMT_ONLINE | BMT_BOT;
1154 * Load medium in device
1155 * Returns: true on success
1158 bool load_dev(DEVICE *dev)
1164 if (dev->fd() < 0) {
1165 dev->dev_errno = EBADF;
1166 Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
1167 Emsg0(M_FATAL, 0, dev->errmsg);
1170 if (!(dev->is_tape())) {
1174 Dmsg0(200, "stored: MTLOAD command not available\n");
1176 dev->dev_errno = ENOTTY; /* function not available */
1177 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1178 dev->print_name(), be.strerror());
1182 dev->block_num = dev->file = 0;
1185 mt_com.mt_op = MTLOAD;
1186 mt_com.mt_count = 1;
1187 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
1189 dev->dev_errno = errno;
1190 Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1191 dev->print_name(), be.strerror());
1199 * Rewind device and put it offline
1200 * Returns: true on success
1203 bool DEVICE::offline()
1208 return true; /* device not open */
1211 state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
1212 block_num = file = 0;
1216 mt_com.mt_op = MTOFFL;
1217 mt_com.mt_count = 1;
1218 if (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
1221 Mmsg2(errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1222 print_name(), be.strerror());
1225 Dmsg1(100, "Offlined device %s\n", print_name());
1229 bool DEVICE::offline_or_rewind()
1234 if (has_cap(CAP_OFFLINEUNMOUNT)) {
1238 * Note, this rewind probably should not be here (it wasn't
1239 * in prior versions of Bacula), but on FreeBSD, this is
1240 * needed in the case the tape was "frozen" due to an error
1241 * such as backspacing after writing and EOF. If it is not
1242 * done, all future references to the drive get and I/O error.
1245 return rewind(NULL);
1250 * Foward space a file
1251 * Returns: true on success
1254 bool DEVICE::fsf(int num)
1256 struct mtget mt_stat;
1262 Mmsg0(errmsg, _("Bad call to fsf. Device not open\n"));
1263 Emsg0(M_FATAL, 0, errmsg);
1273 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1277 Dmsg0(200, "ST_EOF set on entry to FSF\n");
1280 Dmsg0(100, "fsf\n");
1283 * If Fast forward space file is set, then we
1284 * use MTFSF to forward space and MTIOCGET
1285 * to get the file position. We assume that
1286 * the SCSI driver will ensure that we do not
1287 * forward space past the end of the medium.
1289 if (has_cap(CAP_FSF) && has_cap(CAP_MTIOCGET) && has_cap(CAP_FASTFSF)) {
1290 mt_com.mt_op = MTFSF;
1291 mt_com.mt_count = num;
1292 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1293 if (stat < 0 || !dev_get_os_pos(this, &mt_stat)) {
1296 Dmsg0(200, "Set ST_EOT\n");
1298 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1299 print_name(), be.strerror());
1300 Dmsg1(200, "%s", errmsg);
1303 Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1305 file = mt_stat.mt_fileno;
1309 * Here if CAP_FSF is set, and virtually all drives
1310 * these days support it, we read a record, then forward
1311 * space one file. Using this procedure, which is slow,
1312 * is the only way we can be sure that we don't read
1313 * two consecutive EOF marks, which means End of Data.
1315 } else if (has_cap(CAP_FSF)) {
1318 Dmsg0(200, "FSF has cap_fsf\n");
1319 if (max_block_size == 0) {
1320 rbuf_len = DEFAULT_BLOCK_SIZE;
1322 rbuf_len = max_block_size;
1324 rbuf = get_memory(rbuf_len);
1325 mt_com.mt_op = MTFSF;
1326 mt_com.mt_count = 1;
1327 while (num-- && !at_eot()) {
1328 Dmsg0(100, "Doing read before fsf\n");
1329 if ((stat = this->read((char *)rbuf, rbuf_len)) < 0) {
1330 if (errno == ENOMEM) { /* tape record exceeds buf len */
1331 stat = rbuf_len; /* This is OK */
1333 * On IBM drives, they return ENOSPC at EOM
1334 * instead of EOF status
1336 } else if (at_eof() && errno == ENOSPC) {
1342 Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev_errno,
1344 Mmsg2(errmsg, _("read error on %s. ERR=%s.\n"),
1345 print_name(), be.strerror());
1346 Dmsg1(100, "%s", errmsg);
1350 if (stat == 0) { /* EOF */
1351 Dmsg1(100, "End of File mark from read. File=%d\n", file+1);
1352 /* Two reads of zero means end of tape */
1355 Dmsg0(100, "Set ST_EOT\n");
1361 } else { /* Got data */
1366 Dmsg0(100, "Doing MTFSF\n");
1367 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1368 if (stat < 0) { /* error => EOT */
1371 Dmsg0(100, "Set ST_EOT\n");
1373 Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1374 print_name(), be.strerror());
1375 Dmsg0(100, "Got < 0 for MTFSF\n");
1376 Dmsg1(100, "%s", errmsg);
1384 * No FSF, so use FSR to simulate it
1387 Dmsg0(200, "Doing FSR for FSF\n");
1388 while (num-- && !at_eot()) {
1389 fsr(INT32_MAX); /* returns -1 on EOF or EOT */
1393 Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1399 Dmsg1(200, "Return %d from FSF\n", stat);
1401 Dmsg0(200, "ST_EOF set on exit FSF\n");
1404 Dmsg0(200, "ST_EOT set on exit FSF\n");
1406 Dmsg1(200, "Return from FSF file=%d\n", file);
1411 * Backward space a file
1412 * Returns: false on failure
1415 bool DEVICE::bsf(int num)
1422 Mmsg0(errmsg, _("Bad call to bsf. Device not open\n"));
1423 Emsg0(M_FATAL, 0, errmsg);
1428 Mmsg1(errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1439 mt_com.mt_op = MTBSF;
1440 mt_com.mt_count = num;
1441 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1445 Mmsg2(errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1446 print_name(), be.strerror());
1453 * Foward space num records
1454 * Returns: false on failure
1457 bool DEVICE::fsr(int num)
1464 Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1465 Emsg0(M_FATAL, 0, errmsg);
1473 if (!has_cap(CAP_FSR)) {
1474 Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1478 Dmsg1(29, "fsr %d\n", num);
1479 mt_com.mt_op = MTFSR;
1480 mt_com.mt_count = num;
1481 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1487 struct mtget mt_stat;
1489 Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1490 if (dev_get_os_pos(this, &mt_stat)) {
1491 Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1492 block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1493 file = mt_stat.mt_fileno;
1494 block_num = mt_stat.mt_blkno;
1502 Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1503 num, print_name(), be.strerror());
1509 * Backward space a record
1510 * Returns: false on failure
1513 bool DEVICE::bsr(int num)
1520 Mmsg0(errmsg, _("Bad call to bsr_dev. Device not open\n"));
1521 Emsg0(M_FATAL, 0, errmsg);
1529 if (!has_cap(CAP_BSR)) {
1530 Mmsg1(errmsg, _("ioctl MTBSR not permitted on %s.\n"), print_name());
1534 Dmsg0(29, "bsr_dev\n");
1538 mt_com.mt_op = MTBSR;
1539 mt_com.mt_count = num;
1540 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1544 Mmsg2(errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1545 print_name(), be.strerror());
1550 void DEVICE::lock_door()
1554 mt_com.mt_op = MTLOCK;
1555 mt_com.mt_count = 1;
1556 tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1560 void DEVICE::unlock_door()
1564 mt_com.mt_op = MTUNLOCK;
1565 mt_com.mt_count = 1;
1566 tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1572 * Reposition the device to file, block
1573 * Returns: false on failure
1576 bool DEVICE::reposition(DCR *dcr, uint32_t rfile, uint32_t rblock)
1580 Mmsg0(errmsg, _("Bad call to reposition. Device not open\n"));
1581 Emsg0(M_FATAL, 0, errmsg);
1586 boffset_t pos = (((boffset_t)rfile)<<32) | rblock;
1587 Dmsg1(100, "===== lseek to %d\n", (int)pos);
1588 if (lseek(dcr, pos, SEEK_SET) == (boffset_t)-1) {
1591 Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
1592 print_name(), be.strerror());
1601 /* After this point, we are tape only */
1602 Dmsg4(100, "reposition from %u:%u to %u:%u\n", file, block_num, rfile, rblock);
1604 Dmsg0(100, "Rewind\n");
1605 if (!rewind(NULL)) {
1610 Dmsg1(100, "fsf %d\n", rfile-file);
1611 if (!fsf(rfile-file)) {
1612 Dmsg1(100, "fsf failed! ERR=%s\n", bstrerror());
1615 Dmsg2(100, "wanted_file=%d at_file=%d\n", rfile, file);
1617 if (rblock < block_num) {
1618 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1619 Dmsg0(100, "bsf 1\n");
1621 Dmsg0(100, "fsf 1\n");
1623 Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1625 if (has_cap(CAP_POSITIONBLOCKS) && rblock > block_num) {
1626 /* Ignore errors as Bacula can read to the correct block */
1627 Dmsg1(100, "fsr %d\n", rblock-block_num);
1628 return fsr(rblock-block_num);
1630 while (rblock > block_num) {
1631 if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
1634 Dmsg2(30, "Failed to find requested block on %s: ERR=%s",
1635 print_name(), be.strerror());
1638 Dmsg2(300, "moving forward wanted_blk=%d at_blk=%d\n", rblock, block_num);
1647 * Write an end of file on the device
1648 * Returns: true on success
1651 bool DEVICE::weof(int num)
1655 Dmsg0(129, "weof_dev\n");
1659 Mmsg0(errmsg, _("Bad call to weof_dev. Device not open\n"));
1660 Emsg0(M_FATAL, 0, errmsg);
1668 if (!can_append()) {
1669 Mmsg0(errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1670 Emsg0(M_FATAL, 0, errmsg);
1676 mt_com.mt_op = MTWEOF;
1677 mt_com.mt_count = num;
1678 stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1687 Mmsg2(errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1688 print_name(), be.strerror());
1696 * If implemented in system, clear the tape
1699 void DEVICE::clrerror(int func)
1701 const char *msg = NULL;
1702 struct mtget mt_stat;
1705 dev_errno = errno; /* save errno */
1707 VolCatInfo.VolCatErrors++;
1714 if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1717 break; /* ignore message printed later */
1720 clear_cap(CAP_EOF); /* turn off feature */
1725 clear_cap(CAP_EOM); /* turn off feature */
1730 clear_cap(CAP_FSF); /* turn off feature */
1734 clear_cap(CAP_BSF); /* turn off feature */
1738 clear_cap(CAP_FSR); /* turn off feature */
1742 clear_cap(CAP_BSR); /* turn off feature */
1752 #ifdef MTSETDRVBUFFER
1753 case MTSETDRVBUFFER:
1754 msg = "MTSETDRVBUFFER";
1787 bsnprintf(buf, sizeof(buf), _("unknown func code %d"), func);
1793 Mmsg1(errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1794 Emsg0(M_ERROR, 0, errmsg);
1799 * Now we try different methods of clearing the error
1800 * status on the drive so that it is not locked for
1801 * further operations.
1804 /* On some systems such as NetBSD, this clears all errors */
1805 tape_ioctl(m_fd, MTIOCGET, (char *)&mt_stat);
1807 /* Found on Linux */
1811 mt_com.mt_op = MTIOCLRERR;
1812 mt_com.mt_count = 1;
1813 /* Clear any error condition on the tape */
1814 tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1815 Dmsg0(200, "Did MTIOCLRERR\n");
1819 /* Typically on FreeBSD */
1823 /* Read and clear SCSI error status */
1824 union mterrstat mt_errstat;
1825 Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev_errno,
1826 be.strerror(dev_errno));
1827 tape_ioctl(m_fd, MTIOCERRSTAT, (char *)&mt_errstat);
1831 /* Clear Subsystem Exception OSF1 */
1835 mt_com.mt_op = MTCSE;
1836 mt_com.mt_count = 1;
1837 /* Clear any error condition on the tape */
1838 tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1839 Dmsg0(200, "Did MTCSE\n");
1847 void DEVICE::close()
1849 Dmsg1(100, "close_dev %s\n", print_name());
1850 if (has_cap(CAP_OFFLINEUNMOUNT)) {
1855 Dmsg2(100, "device %s already closed vol=%s\n", print_name(),
1857 return; /* already closed */
1869 /* Clean up device packet so it can be reused */
1871 state &= ~(ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1872 label_type = B_BACULA_LABEL;
1873 file = block_num = 0;
1876 EndFile = EndBlock = 0;
1878 Slot = -1; /* unknown slot */
1880 memset(&VolCatInfo, 0, sizeof(VolCatInfo));
1881 memset(&VolHdr, 0, sizeof(VolHdr));
1883 stop_thread_timer(tid);
1889 * This call closes the device, but it is used in DVD handling
1890 * where we close one part and then open the next part. The
1891 * difference between close_part() and close() is that close_part()
1892 * saves the state information of the device (e.g. the Volume lable,
1893 * the Volume Catalog record, ... This permits opening and closing
1894 * the Volume parts multiple times without losing track of what the
1895 * main Volume parameters are.
1897 void DEVICE::close_part(DCR *dcr)
1899 VOLUME_LABEL saveVolHdr;
1900 VOLUME_CAT_INFO saveVolCatInfo; /* Volume Catalog Information */
1903 saveVolHdr = VolHdr; /* structure assignment */
1904 saveVolCatInfo = VolCatInfo; /* structure assignment */
1905 close(); /* close current part */
1906 VolHdr = saveVolHdr; /* structure assignment */
1907 VolCatInfo = saveVolCatInfo; /* structure assignment */
1908 dcr->VolCatInfo = saveVolCatInfo; /* structure assignment */
1911 boffset_t DEVICE::lseek(DCR *dcr, boffset_t offset, int whence)
1915 return lseek_dvd(dcr, offset, whence);
1917 #if defined(HAVE_WIN32)
1918 return ::_lseeki64(m_fd, (__int64)offset, whence);
1920 return ::lseek(m_fd, (off_t)offset, whence);
1927 bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
1929 Dmsg1(100, "truncate %s\n", print_name());
1932 /* maybe we should rewind and write and eof ???? */
1933 return true; /* we don't really truncate tapes */
1935 return truncate_dvd(dcr);
1937 /* ***FIXME*** we really need to unlink() the file so that
1938 * its name can be changed for a relabel.
1940 if (ftruncate(m_fd, 0) != 0) {
1942 Mmsg2(errmsg, _("Unable to truncate device %s. ERR=%s\n"),
1943 print_name(), be.strerror());
1951 /* Mount the device.
1952 * If timeout, wait until the mount command returns 0.
1953 * If !timeout, try to mount the device only once.
1955 bool DEVICE::mount(int timeout)
1957 Dmsg0(190, "Enter mount\n");
1960 } else if (requires_mount()) {
1961 return do_mount(1, timeout);
1966 /* Unmount the device
1967 * If timeout, wait until the unmount command returns 0.
1968 * If !timeout, try to unmount the device only once.
1970 bool DEVICE::unmount(int timeout)
1972 Dmsg0(90, "Enter unmount\n");
1974 return do_mount(0, timeout);
1979 /* (Un)mount the device */
1980 bool DEVICE::do_mount(int mount, int dotimeout)
1982 POOL_MEM ocmd(PM_FNAME);
1985 int status, timeout;
1987 sm_check(__FILE__, __LINE__, false);
1990 Dmsg0(200, "======= mount=1\n");
1993 icmd = device->mount_command;
1995 if (!is_mounted()) {
1996 Dmsg0(200, "======= mount=0\n");
1999 icmd = device->unmount_command;
2002 clear_freespace_ok();
2003 edit_mount_codes(ocmd, icmd);
2005 Dmsg2(100, "do_mount: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted());
2008 /* Try at most 1 time to (un)mount the device. This should perhaps be configurable. */
2013 results = get_memory(4000);
2016 /* If busy retry each second */
2017 Dmsg1(20, "do_mount run_prog=%s\n", ocmd.c_str());
2018 while ((status = run_program_full_output(ocmd.c_str(),
2019 max_open_wait/2, results)) != 0) {
2020 /* Doesn't work with internationalization (This is not a problem) */
2021 if (mount && fnmatch("*is already mounted on*", results, 0) == 0) {
2024 if (!mount && fnmatch("* not mounted*", results, 0) == 0) {
2027 if (timeout-- > 0) {
2028 /* Sometimes the device cannot be mounted because it is already mounted.
2029 * Try to unmount it, then remount it */
2031 Dmsg1(400, "Trying to unmount the device %s...\n", print_name());
2039 Dmsg5(40, "Device %s cannot be %smounted. stat=%d result=%s ERR=%s\n", print_name(),
2040 (mount ? "" : "un"), status, results, be.strerror(status));
2041 Mmsg(errmsg, _("Device %s cannot be %smounted. ERR=%s\n"),
2042 print_name(), (mount ? "" : "un"), be.strerror(status));
2044 Dmsg4(40, "Device %s cannot be %smounted. stat=%d ERR=%s\n", print_name(),
2045 (mount ? "" : "un"), status, results);
2046 Mmsg(errmsg, _("Device %s cannot be %smounted. ERR=%s\n"),
2047 print_name(), (mount ? "" : "un"), results);
2050 * Now, just to be sure it is not mounted, try to read the
2054 struct dirent *entry, *result;
2058 name_max = pathconf(".", _PC_NAME_MAX);
2059 if (name_max < 1024) {
2063 if (!(dp = opendir(device->mount_point))) {
2066 Dmsg3(29, "do_mount: failed to open dir %s (dev=%s), ERR=%s\n",
2067 device->mount_point, print_name(), be.strerror());
2071 entry = (struct dirent *)malloc(sizeof(struct dirent) + name_max + 1000);
2074 if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) {
2076 Dmsg2(129, "do_mount: failed to find suitable file in dir %s (dev=%s)\n",
2077 device->mount_point, print_name());
2080 if ((strcmp(result->d_name, ".")) && (strcmp(result->d_name, "..")) && (strcmp(result->d_name, ".keep"))) {
2081 count++; /* result->d_name != ., .. or .keep (Gentoo-specific) */
2084 Dmsg2(129, "do_mount: ignoring %s in %s\n", result->d_name, device->mount_point);
2090 Dmsg1(29, "do_mount: got %d files in the mount point (not counting ., .. and .keep)\n", count);
2093 /* If we got more than ., .. and .keep */
2094 /* there must be something mounted */
2096 Dmsg1(100, "Did Mount by count=%d\n", count);
2099 /* An unmount request. We failed to unmount - report an error */
2101 free_pool_memory(results);
2102 Dmsg0(200, "== error mount=1 wanted unmount\n");
2108 sm_check(__FILE__, __LINE__, false);
2109 free_pool_memory(results);
2110 Dmsg0(200, "============ mount=0\n");
2114 set_mounted(mount); /* set/clear mounted flag */
2115 free_pool_memory(results);
2116 /* Do not check free space when unmounting */
2117 if (mount && !update_freespace()) {
2120 Dmsg1(200, "============ mount=%d\n", mount);
2125 * Edit codes into (Un)MountCommand, Write(First)PartCommand
2127 * %a = archive device name
2128 * %e = erase (set if cannot mount and first part)
2131 * %v = last part name
2133 * omsg = edited output message
2134 * imsg = input string containing edit codes (%x)
2137 void DEVICE::edit_mount_codes(POOL_MEM &omsg, const char *imsg)
2143 POOL_MEM archive_name(PM_FNAME);
2145 omsg.c_str()[0] = 0;
2146 Dmsg1(800, "edit_mount_codes: %s\n", imsg);
2147 for (p=imsg; *p; p++) {
2157 if (num_dvd_parts == 0) {
2158 if (truncating || blank_dvd) {
2168 bsnprintf(add, sizeof(add), "%d", part);
2172 str = device->mount_point;
2175 make_spooled_dvd_filename(this, archive_name);
2176 str = archive_name.c_str();
2190 Dmsg1(1900, "add_str %s\n", str);
2191 pm_strcat(omsg, (char *)str);
2192 Dmsg1(1800, "omsg=%s\n", omsg.c_str());
2196 /* return the last timer interval (ms) */
2197 btime_t DEVICE::get_timer_count()
2199 btime_t old = last_timer;
2200 last_timer = get_current_btime();
2201 return last_timer - old;
2205 ssize_t DEVICE::read(void *buf, size_t len)
2211 if (this->is_tape()) {
2212 read_len = tape_read(m_fd, buf, len);
2214 read_len = ::read(m_fd, buf, len);
2217 last_tick = get_timer_count();
2219 DevReadTime += last_tick;
2220 VolCatInfo.VolReadTime += last_tick;
2222 if (read_len > 0) { /* skip error */
2223 DevReadBytes += read_len;
2230 ssize_t DEVICE::write(const void *buf, size_t len)
2236 if (this->is_tape()) {
2237 write_len = tape_write(m_fd, buf, len);
2239 write_len = ::write(m_fd, buf, len);
2242 last_tick = get_timer_count();
2244 DevWriteTime += last_tick;
2245 VolCatInfo.VolWriteTime += last_tick;
2247 if (write_len > 0) { /* skip error */
2248 DevWriteBytes += write_len;
2254 /* Return the resource name for the device */
2255 const char *DEVICE::name() const
2257 return device->hdr.name;
2261 dev_vol_name(DEVICE *dev)
2263 return dev->VolCatInfo.VolCatName;
2268 * Free memory allocated for the device
2270 void DEVICE::term(void)
2272 Dmsg1(900, "term dev: %s\n", print_name());
2275 free_memory(dev_name);
2279 free_memory(prt_name);
2283 free_pool_memory(errmsg);
2286 pthread_mutex_destroy(&mutex);
2287 pthread_cond_destroy(&wait);
2288 pthread_cond_destroy(&wait_next_vol);
2289 pthread_mutex_destroy(&spool_mutex);
2291 if (attached_dcrs) {
2292 delete attached_dcrs;
2293 attached_dcrs = NULL;
2302 * This routine initializes the device wait timers
2304 void init_device_wait_timers(DCR *dcr)
2306 DEVICE *dev = dcr->dev;
2307 JCR *jcr = dcr->jcr;
2309 /* ******FIXME******* put these on config variables */
2310 dev->min_wait = 60 * 60;
2311 dev->max_wait = 24 * 60 * 60;
2312 dev->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
2313 dev->wait_sec = dev->min_wait;
2314 dev->rem_wait_sec = dev->wait_sec;
2317 dev->BadVolName[0] = 0;
2319 jcr->min_wait = 60 * 60;
2320 jcr->max_wait = 24 * 60 * 60;
2321 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
2322 jcr->wait_sec = jcr->min_wait;
2323 jcr->rem_wait_sec = jcr->wait_sec;
2328 void init_jcr_device_wait_timers(JCR *jcr)
2330 /* ******FIXME******* put these on config variables */
2331 jcr->min_wait = 60 * 60;
2332 jcr->max_wait = 24 * 60 * 60;
2333 jcr->max_num_wait = 9; /* 5 waits =~ 1 day, then 1 day at a time */
2334 jcr->wait_sec = jcr->min_wait;
2335 jcr->rem_wait_sec = jcr->wait_sec;
2341 * The dev timers are used for waiting on a particular device
2343 * Returns: true if time doubled
2344 * false if max time expired
2346 bool double_dev_wait_time(DEVICE *dev)
2348 dev->wait_sec *= 2; /* double wait time */
2349 if (dev->wait_sec > dev->max_wait) { /* but not longer than maxtime */
2350 dev->wait_sec = dev->max_wait;
2353 dev->rem_wait_sec = dev->wait_sec;
2354 if (dev->num_wait >= dev->max_num_wait) {
2361 void set_os_device_parameters(DCR *dcr)
2363 DEVICE *dev = dcr->dev;
2365 #if defined(HAVE_LINUX_OS) || defined(HAVE_WIN32)
2368 Dmsg0(050, "In set_os_device_parameters\n");
2369 #if defined(MTSETBLK)
2370 if (dev->min_block_size == dev->max_block_size &&
2371 dev->min_block_size == 0) { /* variable block mode */
2372 mt_com.mt_op = MTSETBLK;
2373 mt_com.mt_count = 0;
2374 Dmsg0(050, "Set block size to zero\n");
2375 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2376 dev->clrerror(MTSETBLK);
2380 #if defined(MTSETDRVBUFFER)
2381 if (getpid() == 0) { /* Only root can do this */
2382 mt_com.mt_op = MTSETDRVBUFFER;
2383 mt_com.mt_count = MT_ST_CLEARBOOLEANS;
2384 if (!dev->has_cap(CAP_TWOEOF)) {
2385 mt_com.mt_count |= MT_ST_TWO_FM;
2387 if (dev->has_cap(CAP_EOM)) {
2388 mt_com.mt_count |= MT_ST_FAST_MTEOM;
2390 Dmsg0(050, "MTSETDRVBUFFER\n");
2391 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2392 dev->clrerror(MTSETDRVBUFFER);
2399 #ifdef HAVE_NETBSD_OS
2401 if (dev->min_block_size == dev->max_block_size &&
2402 dev->min_block_size == 0) { /* variable block mode */
2403 mt_com.mt_op = MTSETBSIZ;
2404 mt_com.mt_count = 0;
2405 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2406 dev->clrerror(MTSETBSIZ);
2408 /* Get notified at logical end of tape */
2409 mt_com.mt_op = MTEWARN;
2410 mt_com.mt_count = 1;
2411 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2412 dev->clrerror(MTEWARN);
2418 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
2420 if (dev->min_block_size == dev->max_block_size &&
2421 dev->min_block_size == 0) { /* variable block mode */
2422 mt_com.mt_op = MTSETBSIZ;
2423 mt_com.mt_count = 0;
2424 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2425 dev->clrerror(MTSETBSIZ);
2428 /* Turn this on later when fully tested */
2429 #if defined(xxxMTIOCSETEOTMODEL)
2431 if (dev->has_cap(CAP_TWOEOF)) {
2436 if (ioctl(dev->fd(), MTIOCSETEOTMODEL, (caddr_t)&neof) < 0) {
2438 dev->dev_errno = errno; /* save errno */
2439 Mmsg2(dev->errmsg, _("Unable to set eotmodel on device %s: ERR=%s\n"),
2440 dev->print_name(), be.strerror(dev->dev_errno));
2441 Jmsg(dcr->jcr, M_FATAL, 0, dev->errmsg);
2449 if (dev->min_block_size == dev->max_block_size &&
2450 dev->min_block_size == 0) { /* variable block mode */
2451 mt_com.mt_op = MTSRSZ;
2452 mt_com.mt_count = 0;
2453 if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2454 dev->clrerror(MTSRSZ);
2461 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
2463 Dmsg0(050, "dev_get_os_pos\n");
2464 return dev->has_cap(CAP_MTIOCGET) &&
2465 tape_ioctl(dev->fd(), MTIOCGET, (char *)mt_stat) == 0 &&
2466 mt_stat->mt_fileno >= 0;
2469 static char *modes[] = {
2470 "CREATE_READ_WRITE",
2477 static char *mode_to_str(int mode)
2479 static char buf[100];
2480 if (mode < 1 || mode > 4) {
2481 bsnprintf(buf, sizeof(buf), "BAD mode=%d", mode);
2484 return modes[mode-1];