2 Bacula® - The Network Backup Solution
4 Copyright (C) 2001-2010 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 Kern Sibbald.
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 * block.c -- tape block handling functions
32 * Kern Sibbald, March MMI
33 * added BB02 format October MMII
41 static bool terminate_writing_volume(DCR *dcr);
42 static bool do_new_file_bookkeeping(DCR *dcr);
43 static bool do_dvd_size_checks(DCR *dcr);
44 static void reread_last_block(DCR *dcr);
47 * Dump the block header, then walk through
48 * the block printing out the record headers.
50 void dump_block(DEV_BLOCK *b, const char *msg)
54 char Id[BLKHDR_ID_LENGTH+1];
55 uint32_t CheckSum, BlockCheckSum;
58 uint32_t VolSessionId, VolSessionTime, data_len;
62 char buf1[100], buf2[100];
64 unser_begin(b->buf, BLKHDR1_LENGTH);
65 unser_uint32(CheckSum);
66 unser_uint32(block_len);
67 unser_uint32(BlockNumber);
68 unser_bytes(Id, BLKHDR_ID_LENGTH);
69 ASSERT(unser_length(b->buf) == BLKHDR1_LENGTH);
70 Id[BLKHDR_ID_LENGTH] = 0;
72 unser_uint32(VolSessionId);
73 unser_uint32(VolSessionTime);
77 VolSessionId = VolSessionTime = 0;
82 if (block_len > 100000) {
83 Dmsg3(20, "Dump block %s 0x%x blocksize too big %u\n", msg, b, block_len);
87 BlockCheckSum = bcrc32((uint8_t *)b->buf+BLKHDR_CS_LENGTH,
88 block_len-BLKHDR_CS_LENGTH);
89 Pmsg6(000, _("Dump block %s %x: size=%d BlkNum=%d\n"
90 " Hdrcksum=%x cksum=%x\n"),
91 msg, b, block_len, BlockNumber, CheckSum, BlockCheckSum);
93 while (p < (b->buf + block_len+WRITE_RECHDR_LENGTH)) {
94 unser_begin(p, WRITE_RECHDR_LENGTH);
95 if (rhl == RECHDR1_LENGTH) {
96 unser_uint32(VolSessionId);
97 unser_uint32(VolSessionTime);
99 unser_int32(FileIndex);
101 unser_uint32(data_len);
102 Pmsg6(000, _(" Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n"),
103 VolSessionId, VolSessionTime, FI_to_ascii(buf1, FileIndex),
104 stream_to_ascii(buf2, Stream, FileIndex), data_len, p);
110 * Create a new block structure.
111 * We pass device so that the block can inherit the
112 * min and max block sizes.
114 DEV_BLOCK *new_block(DEVICE *dev)
116 DEV_BLOCK *block = (DEV_BLOCK *)get_memory(sizeof(DEV_BLOCK));
118 memset(block, 0, sizeof(DEV_BLOCK));
120 /* If the user has specified a max_block_size, use it as the default */
121 if (dev->max_block_size == 0) {
122 block->buf_len = DEFAULT_BLOCK_SIZE;
124 block->buf_len = dev->max_block_size;
127 block->block_len = block->buf_len; /* default block size */
128 block->buf = get_memory(block->buf_len);
130 block->BlockVer = BLOCK_VER; /* default write version */
131 Dmsg1(650, "Returning new block=%x\n", block);
137 * Duplicate an existing block (eblock)
139 DEV_BLOCK *dup_block(DEV_BLOCK *eblock)
141 DEV_BLOCK *block = (DEV_BLOCK *)get_memory(sizeof(DEV_BLOCK));
142 int buf_len = sizeof_pool_memory(eblock->buf);
144 memcpy(block, eblock, sizeof(DEV_BLOCK));
145 block->buf = get_memory(buf_len);
146 memcpy(block->buf, eblock->buf, buf_len);
152 * Only the first block checksum error was reported.
153 * If there are more, report it now.
155 void print_block_read_errors(JCR *jcr, DEV_BLOCK *block)
157 if (block->read_errors > 1) {
158 Jmsg(jcr, M_ERROR, 0, _("%d block read errors not printed.\n"),
166 void free_block(DEV_BLOCK *block)
168 Dmsg1(999, "free_block buffer %x\n", block->buf);
169 free_memory(block->buf);
170 Dmsg1(999, "free_block block %x\n", block);
171 free_memory((POOLMEM *)block);
174 /* Empty the block -- for writing */
175 void empty_block(DEV_BLOCK *block)
177 block->binbuf = WRITE_BLKHDR_LENGTH;
178 block->bufp = block->buf + block->binbuf;
180 block->write_failed = false;
181 block->block_read = false;
182 block->FirstIndex = block->LastIndex = 0;
186 * Create block header just before write. The space
187 * in the buffer should have already been reserved by
190 static void ser_block_header(DEV_BLOCK *block, bool do_checksum)
193 uint32_t CheckSum = 0;
194 uint32_t block_len = block->binbuf;
196 Dmsg1(1390, "ser_block_header: block_len=%d\n", block_len);
197 ser_begin(block->buf, BLKHDR2_LENGTH);
198 ser_uint32(CheckSum);
199 ser_uint32(block_len);
200 ser_uint32(block->BlockNumber);
201 ser_bytes(WRITE_BLKHDR_ID, BLKHDR_ID_LENGTH);
202 if (BLOCK_VER >= 2) {
203 ser_uint32(block->VolSessionId);
204 ser_uint32(block->VolSessionTime);
207 /* Checksum whole block except for the checksum */
209 CheckSum = bcrc32((uint8_t *)block->buf+BLKHDR_CS_LENGTH,
210 block_len-BLKHDR_CS_LENGTH);
212 Dmsg1(1390, "ser_bloc_header: checksum=%x\n", CheckSum);
213 ser_begin(block->buf, BLKHDR2_LENGTH);
214 ser_uint32(CheckSum); /* now add checksum to block header */
218 * Unserialize the block header for reading block.
219 * This includes setting all the buffer pointers correctly.
221 * Returns: false on failure (not a block)
224 static bool unser_block_header(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
227 char Id[BLKHDR_ID_LENGTH+1];
228 uint32_t CheckSum, BlockCheckSum;
231 uint32_t BlockNumber;
234 unser_begin(block->buf, BLKHDR_LENGTH);
235 unser_uint32(CheckSum);
236 unser_uint32(block_len);
237 unser_uint32(BlockNumber);
238 unser_bytes(Id, BLKHDR_ID_LENGTH);
239 ASSERT(unser_length(block->buf) == BLKHDR1_LENGTH);
241 Id[BLKHDR_ID_LENGTH] = 0;
243 bhl = BLKHDR1_LENGTH;
245 block->bufp = block->buf + bhl;
246 if (strncmp(Id, BLKHDR1_ID, BLKHDR_ID_LENGTH) != 0) {
247 dev->dev_errno = EIO;
248 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer discarded.\n"),
249 dev->file, dev->block_num, BLKHDR1_ID, Id);
250 if (block->read_errors == 0 || verbose >= 2) {
251 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
253 block->read_errors++;
256 } else if (Id[3] == '2') {
257 unser_uint32(block->VolSessionId);
258 unser_uint32(block->VolSessionTime);
259 bhl = BLKHDR2_LENGTH;
261 block->bufp = block->buf + bhl;
262 if (strncmp(Id, BLKHDR2_ID, BLKHDR_ID_LENGTH) != 0) {
263 dev->dev_errno = EIO;
264 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer discarded.\n"),
265 dev->file, dev->block_num, BLKHDR2_ID, Id);
266 if (block->read_errors == 0 || verbose >= 2) {
267 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
269 block->read_errors++;
273 dev->dev_errno = EIO;
274 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer discarded.\n"),
275 dev->file, dev->block_num, BLKHDR2_ID, Id);
276 Dmsg1(50, "%s", dev->errmsg);
277 if (block->read_errors == 0 || verbose >= 2) {
278 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
280 block->read_errors++;
281 unser_uint32(block->VolSessionId);
282 unser_uint32(block->VolSessionTime);
287 if (block_len > MAX_BLOCK_LENGTH) {
288 dev->dev_errno = EIO;
289 Mmsg3(dev->errmsg, _("Volume data error at %u:%u! Block length %u is insane (too large), probably due to a bad archive.\n"),
290 dev->file, dev->block_num, block_len);
291 if (block->read_errors == 0 || verbose >= 2) {
292 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
294 block->read_errors++;
298 Dmsg1(390, "unser_block_header block_len=%d\n", block_len);
299 /* Find end of block or end of buffer whichever is smaller */
300 if (block_len > block->read_len) {
301 block_end = block->read_len;
303 block_end = block_len;
305 block->binbuf = block_end - bhl;
306 block->block_len = block_len;
307 block->BlockNumber = BlockNumber;
308 Dmsg3(390, "Read binbuf = %d %d block_len=%d\n", block->binbuf,
310 if (block_len <= block->read_len && dev->do_checksum()) {
311 BlockCheckSum = bcrc32((uint8_t *)block->buf+BLKHDR_CS_LENGTH,
312 block_len-BLKHDR_CS_LENGTH);
313 if (BlockCheckSum != CheckSum) {
314 dev->dev_errno = EIO;
315 Mmsg6(dev->errmsg, _("Volume data error at %u:%u!\n"
316 "Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n"),
317 dev->file, dev->block_num, (unsigned)BlockNumber,
318 block_len, BlockCheckSum, CheckSum);
319 if (block->read_errors == 0 || verbose >= 2) {
320 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
322 block->read_errors++;
332 * Write a block to the device, with locking and unlocking
334 * Returns: true on success
338 bool write_block_to_device(DCR *dcr)
341 DEVICE *dev = dcr->dev;
345 stat = write_block_to_spool_file(dcr);
349 if (!dcr->is_dev_locked()) { /* device already locked? */
350 /* note, do not change this to dcr->r_dlock */
351 dev->r_dlock(); /* no, lock it */
355 * If a new volume has been mounted since our last write
356 * Create a JobMedia record for the previous volume written,
357 * and set new parameters to write this volume
358 * The same applies for if we are in a new file.
360 if (dcr->NewVol || dcr->NewFile) {
361 if (job_canceled(jcr)) {
365 /* Create a jobmedia record for this job */
366 if (!dir_create_jobmedia_record(dcr)) {
367 dev->dev_errno = EIO;
368 Jmsg2(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"),
369 dcr->getVolCatName(), jcr->Job);
370 set_new_volume_parameters(dcr);
375 /* Note, setting a new volume also handles any pending new file */
376 set_new_volume_parameters(dcr);
378 set_new_file_parameters(dcr);
382 if (!write_block_to_dev(dcr)) {
383 if (job_canceled(jcr) || jcr->getJobType() == JT_SYSTEM) {
386 stat = fixup_device_block_write_error(dcr);
391 if (!dcr->is_dev_locked()) { /* did we lock dev above? */
392 /* note, do not change this to dcr->dunlock */
393 dev->dunlock(); /* unlock it now */
399 * Write a block to the device
401 * Returns: true on success or EOT
402 * false on hard error
404 bool write_block_to_dev(DCR *dcr)
407 uint32_t wlen; /* length to write */
408 int hit_max1, hit_max2;
410 DEVICE *dev = dcr->dev;
412 DEV_BLOCK *block = dcr->block;
414 #ifdef NO_TAPE_WRITE_TEST
418 if (job_canceled(jcr)) {
421 ASSERT(block->binbuf == ((uint32_t) (block->bufp - block->buf)));
422 ASSERT(dev->is_open());
424 /* dump_block(block, "before write"); */
425 if (dev->at_weot()) {
426 Dmsg0(100, "return write_block_to_dev with ST_WEOT\n");
427 dev->dev_errno = ENOSPC;
428 Jmsg0(jcr, M_FATAL, 0, _("Cannot write block. Device at EOM.\n"));
431 if (!dev->can_append()) {
432 dev->dev_errno = EIO;
433 Jmsg(jcr, M_FATAL, 0, _("Attempt to write on read-only Volume.\n"));
436 wlen = block->binbuf;
437 if (wlen <= WRITE_BLKHDR_LENGTH) { /* Does block have data in it? */
438 Dmsg0(100, "return write_block_to_dev no data to write\n");
442 * Clear to the end of the buffer if it is not full,
443 * and on tape devices, apply min and fixed blocking.
445 if (wlen != block->buf_len) {
446 uint32_t blen; /* current buffer length */
448 Dmsg2(250, "binbuf=%d buf_len=%d\n", block->binbuf, block->buf_len);
451 /* Adjust write size to min/max for tapes only */
452 if (dev->is_tape()) {
453 /* check for fixed block size */
454 if (dev->min_block_size == dev->max_block_size) {
455 wlen = block->buf_len; /* fixed block size already rounded */
456 /* Check for min block size */
457 } else if (wlen < dev->min_block_size) {
458 wlen = ((dev->min_block_size + TAPE_BSIZE - 1) / TAPE_BSIZE) * TAPE_BSIZE;
459 /* Ensure size is rounded */
461 wlen = ((wlen + TAPE_BSIZE - 1) / TAPE_BSIZE) * TAPE_BSIZE;
465 memset(block->bufp, 0, wlen-blen); /* clear garbage */
469 ser_block_header(block, dev->do_checksum());
471 /* Limit maximum Volume size to value specified by user */
472 hit_max1 = (dev->max_volume_size > 0) &&
473 ((dev->VolCatInfo.VolCatBytes + block->binbuf)) >= dev->max_volume_size;
474 hit_max2 = (dev->VolCatInfo.VolCatMaxBytes > 0) &&
475 ((dev->VolCatInfo.VolCatBytes + block->binbuf)) >= dev->VolCatInfo.VolCatMaxBytes;
476 if (hit_max1 || hit_max2) {
479 Dmsg0(100, "==== Output bytes Triggered medium max capacity.\n");
481 max_cap = dev->max_volume_size;
483 max_cap = dev->VolCatInfo.VolCatMaxBytes;
485 Jmsg(jcr, M_INFO, 0, _("User defined maximum volume capacity %s exceeded on device %s.\n"),
486 edit_uint64_with_commas(max_cap, ed1), dev->print_name());
487 terminate_writing_volume(dcr);
488 reread_last_block(dcr); /* DEBUG */
489 dev->dev_errno = ENOSPC;
493 /* Limit maximum File size on volume to user specified value */
494 if ((dev->max_file_size > 0) &&
495 (dev->file_size+block->binbuf) >= dev->max_file_size) {
496 dev->file_size = 0; /* reset file size */
498 if (!dev->weof(1)) { /* write eof */
499 Dmsg0(190, "WEOF error in max file size.\n");
500 Jmsg(jcr, M_FATAL, 0, _("Unable to write EOF. ERR=%s\n"),
502 terminate_writing_volume(dcr);
503 dev->dev_errno = ENOSPC;
506 if (!write_ansi_ibm_labels(dcr, ANSI_EOF_LABEL, dev->VolHdr.VolumeName)) {
510 if (!do_new_file_bookkeeping(dcr)) {
511 /* Error message already sent */
516 if (!do_dvd_size_checks(dcr)) {
517 /* Error message already sent */
521 dev->VolCatInfo.VolCatWrites++;
522 Dmsg1(1300, "Write block of %u bytes\n", wlen);
523 #ifdef DEBUG_BLOCK_ZEROING
524 uint32_t *bp = (uint32_t *)block->buf;
525 if (bp[0] == 0 && bp[1] == 0 && bp[2] == 0 && block->buf[12] == 0) {
526 Jmsg0(jcr, M_ABORT, 0, _("Write block header zeroed.\n"));
531 * Do write here, make a somewhat feeble attempt to recover from
532 * I/O errors, or from the OS telling us it is busy.
538 if (retry > 0 && stat == -1 && errno == EBUSY) {
540 Dmsg4(100, "===== write retry=%d stat=%d errno=%d: ERR=%s\n",
541 retry, stat, errno, be.bstrerror());
542 bmicrosleep(5, 0); /* pause a bit if busy or lots of errors */
545 stat = dev->write(block->buf, (size_t)wlen);
547 } while (stat == -1 && (errno == EBUSY || errno == EIO) && retry++ < 3);
549 #ifdef DEBUG_BLOCK_ZEROING
550 if (bp[0] == 0 && bp[1] == 0 && bp[2] == 0 && block->buf[12] == 0) {
551 Jmsg0(jcr, M_ABORT, 0, _("Write block header zeroed.\n"));
555 if (stat != (ssize_t)wlen) {
556 /* Some devices simply report EIO when the volume is full.
557 * With a little more thought we may be able to check
558 * capacity and distinguish real errors and EOT
559 * conditions. In any case, we probably want to
560 * simulate an End of Medium.
565 if (dev->dev_errno == 0) {
566 dev->dev_errno = ENOSPC; /* out of space */
568 if (dev->dev_errno != ENOSPC) {
569 dev->VolCatInfo.VolCatErrors++;
570 Jmsg4(jcr, M_ERROR, 0, _("Write error at %u:%u on device %s. ERR=%s.\n"),
571 dev->file, dev->block_num, dev->print_name(), be.bstrerror());
574 dev->dev_errno = ENOSPC; /* out of space */
576 if (dev->dev_errno == ENOSPC) {
577 Jmsg(jcr, M_INFO, 0, _("End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"),
578 dev->getVolCatName(),
579 dev->file, dev->block_num, dev->print_name(), wlen, stat);
581 if (debug_level >= 100) {
583 Dmsg7(100, "=== Write error. fd=%d size=%u rtn=%d dev_blk=%d blk_blk=%d errno=%d: ERR=%s\n",
584 dev->fd(), wlen, stat, dev->block_num, block->BlockNumber,
585 dev->dev_errno, be.bstrerror(dev->dev_errno));
588 ok = terminate_writing_volume(dcr);
589 if (!ok && !forge_on) {
593 reread_last_block(dcr);
598 /* We successfully wrote the block, now do housekeeping */
599 Dmsg2(1300, "VolCatBytes=%d newVolCatBytes=%d\n", (int)dev->VolCatInfo.VolCatBytes,
600 (int)(dev->VolCatInfo.VolCatBytes+wlen));
601 dev->VolCatInfo.VolCatBytes += wlen;
602 dev->VolCatInfo.VolCatBlocks++;
603 dev->EndBlock = dev->block_num;
604 dev->EndFile = dev->file;
605 dev->LastBlock = block->BlockNumber;
606 block->BlockNumber++;
608 /* Update dcr values */
609 if (dev->is_tape()) {
610 dcr->EndBlock = dev->EndBlock;
611 dcr->EndFile = dev->EndFile;
614 /* Save address of block just written */
615 uint64_t addr = dev->file_addr + wlen - 1;
616 dcr->EndBlock = (uint32_t)addr;
617 dcr->EndFile = (uint32_t)(addr >> 32);
618 dev->block_num = dcr->EndBlock;
619 dev->file = dcr->EndFile;
621 dcr->VolMediaId = dev->VolCatInfo.VolMediaId;
622 if (dcr->VolFirstIndex == 0 && block->FirstIndex > 0) {
623 dcr->VolFirstIndex = block->FirstIndex;
625 if (block->LastIndex > 0) {
626 dcr->VolLastIndex = block->LastIndex;
628 dcr->WroteVol = true;
629 dev->file_addr += wlen; /* update file address */
630 dev->file_size += wlen;
631 dev->part_size += wlen;
633 Dmsg2(1300, "write_block: wrote block %d bytes=%d\n", dev->block_num, wlen);
638 static void reread_last_block(DCR *dcr)
640 #define CHECK_LAST_BLOCK
641 #ifdef CHECK_LAST_BLOCK
643 DEVICE *dev = dcr->dev;
645 DEV_BLOCK *block = dcr->block;
647 * If the device is a tape and it supports backspace record,
648 * we backspace over one or two eof marks depending on
649 * how many we just wrote, then over the last record,
650 * then re-read it and verify that the block number is
653 if (dev->is_tape() && dev->has_cap(CAP_BSR)) {
654 /* Now back up over what we wrote and read the last block */
658 Jmsg(jcr, M_ERROR, 0, _("Backspace file at EOT failed. ERR=%s\n"),
659 be.bstrerror(dev->dev_errno));
661 if (ok && dev->has_cap(CAP_TWOEOF) && !dev->bsf(1)) {
664 Jmsg(jcr, M_ERROR, 0, _("Backspace file at EOT failed. ERR=%s\n"),
665 be.bstrerror(dev->dev_errno));
667 /* Backspace over record */
668 if (ok && !dev->bsr(1)) {
671 Jmsg(jcr, M_ERROR, 0, _("Backspace record at EOT failed. ERR=%s\n"),
672 be.bstrerror(dev->dev_errno));
674 * On FreeBSD systems, if the user got here, it is likely that his/her
675 * tape drive is "frozen". The correct thing to do is a
676 * rewind(), but if we do that, higher levels in cleaning up, will
677 * most likely write the EOS record over the beginning of the
678 * tape. The rewind *is* done later in mount.c when another
679 * tape is requested. Note, the clrerror() call in bsr()
680 * calls ioctl(MTCERRSTAT), which *should* fix the problem.
684 DEV_BLOCK *lblock = new_block(dev);
685 /* Note, this can destroy dev->errmsg */
687 if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
688 Jmsg(jcr, M_ERROR, 0, _("Re-read last block at EOT failed. ERR=%s"),
692 * If we wrote block and the block numbers don't agree
693 * we have a possible problem.
695 if (lblock->BlockNumber != dev->LastBlock) {
696 if (dev->LastBlock > (lblock->BlockNumber + 1)) {
697 Jmsg(jcr, M_FATAL, 0, _(
698 "Re-read of last block: block numbers differ by more than one.\n"
699 "Probable tape misconfiguration and data loss. Read block=%u Want block=%u.\n"),
700 lblock->BlockNumber, dev->LastBlock);
702 Jmsg(jcr, M_ERROR, 0, _(
703 "Re-read of last block OK, but block numbers differ. Read block=%u Want block=%u.\n"),
704 lblock->BlockNumber, dev->LastBlock);
707 Jmsg(jcr, M_INFO, 0, _("Re-read of last block succeeded.\n"));
718 * If this routine is called, we do our bookkeeping and
719 * then assure that the volume will not be written any
722 static bool terminate_writing_volume(DCR *dcr)
724 DEVICE *dev = dcr->dev;
727 /* Create a JobMedia record to indicated end of tape */
728 dev->VolCatInfo.VolCatFiles = dev->file;
729 if (!dir_create_jobmedia_record(dcr)) {
730 Dmsg0(190, "Error from create JobMedia\n");
731 dev->dev_errno = EIO;
732 Jmsg2(dcr->jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"),
733 dcr->getVolCatName(), dcr->jcr->Job);
736 dcr->block->write_failed = true;
737 if (!dev->weof(1)) { /* end the tape */
738 dev->VolCatInfo.VolCatErrors++;
739 Jmsg(dcr->jcr, M_ERROR, 0, _("Error writing final EOF to tape. This Volume may not be readable.\n"
742 Dmsg0(100, "WEOF error.\n");
745 ok = write_ansi_ibm_labels(dcr, ANSI_EOV_LABEL, dev->VolHdr.VolumeName);
747 bstrncpy(dev->VolCatInfo.VolCatStatus, "Full", sizeof(dev->VolCatInfo.VolCatStatus));
748 dev->VolCatInfo.VolCatFiles = dev->file; /* set number of files */
751 if (!dvd_write_part(dcr)) { /* write last part */
752 dev->VolCatInfo.VolCatErrors++;
753 Jmsg(dcr->jcr, M_FATAL, 0, _("Error writing final part to DVD. "
754 "This Volume may not be readable.\n%s"),
757 Dmsg0(100, "dvd_write_part error.\n");
759 dev->VolCatInfo.VolCatParts = dev->num_dvd_parts;
762 if (!dir_update_volume_info(dcr, false, true)) {
765 Dmsg1(100, "dir_update_volume_info terminate writing -- %s\n", ok?"OK":"ERROR");
768 * Walk through all attached dcrs setting flag to call
769 * set_new_file_parameters() when that dcr is next used.
772 foreach_dlist(mdcr, dev->attached_dcrs) {
773 if (mdcr->jcr->JobId == 0) {
776 mdcr->NewFile = true; /* set reminder to do set_new_file_params */
778 /* Set new file/block parameters for current dcr */
779 set_new_file_parameters(dcr);
781 if (ok && dev->has_cap(CAP_TWOEOF) && !dev->weof(1)) { /* end the tape */
782 dev->VolCatInfo.VolCatErrors++;
783 /* This may not be fatal since we already wrote an EOF */
784 Jmsg(dcr->jcr, M_ERROR, 0, "%s", dev->errmsg);
787 dev->set_ateot(); /* no more writing this tape */
788 Dmsg1(50, "*** Leave terminate_writing_volume -- %s\n", ok?"OK":"ERROR");
793 * Do bookkeeping when a new file is created on a Volume. This is
794 * also done for disk files to generate the jobmedia records for
797 static bool do_new_file_bookkeeping(DCR *dcr)
799 DEVICE *dev = dcr->dev;
802 /* Create a JobMedia record so restore can seek */
803 if (!dir_create_jobmedia_record(dcr)) {
804 Dmsg0(190, "Error from create_job_media.\n");
805 dev->dev_errno = EIO;
806 Jmsg2(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"),
807 dcr->getVolCatName(), jcr->Job);
808 terminate_writing_volume(dcr);
809 dev->dev_errno = EIO;
812 dev->VolCatInfo.VolCatFiles = dev->file;
813 if (!dir_update_volume_info(dcr, false, false)) {
814 Dmsg0(190, "Error from update_vol_info.\n");
815 terminate_writing_volume(dcr);
816 dev->dev_errno = EIO;
819 Dmsg0(100, "dir_update_volume_info max file size -- OK\n");
822 * Walk through all attached dcrs setting flag to call
823 * set_new_file_parameters() when that dcr is next used.
826 foreach_dlist(mdcr, dev->attached_dcrs) {
827 if (mdcr->jcr->JobId == 0) {
830 mdcr->NewFile = true; /* set reminder to do set_new_file_params */
832 /* Set new file/block parameters for current dcr */
833 set_new_file_parameters(dcr);
838 * Do all checks for DVD sizes during writing.
840 static bool do_dvd_size_checks(DCR *dcr)
842 DEVICE *dev = dcr->dev;
844 DEV_BLOCK *block = dcr->block;
846 /* Don't go further if the device is not a dvd */
847 if (!dev->is_dvd()) {
851 /* Limit maximum part size to value specified by user
853 if (dev->max_part_size > 0 && ((dev->part_size + block->binbuf) >= dev->max_part_size)) {
854 if (dev->part < dev->num_dvd_parts) {
855 Jmsg3(dcr->jcr, M_FATAL, 0, _("Error while writing, current part number"
856 " is less than the total number of parts (%d/%d, device=%s)\n"),
857 dev->part, dev->num_dvd_parts, dev->print_name());
858 dev->dev_errno = EIO;
862 if (dvd_open_next_part(dcr) < 0) {
863 Jmsg2(dcr->jcr, M_FATAL, 0, _("Unable to open device next part %s: ERR=%s\n"),
864 dev->print_name(), dev->bstrerror());
865 dev->dev_errno = EIO;
869 dev->VolCatInfo.VolCatParts = dev->num_dvd_parts;
871 if (!dir_update_volume_info(dcr, false, false)) {
872 Dmsg0(190, "Error from update_vol_info.\n");
873 dev->dev_errno = EIO;
878 dev->update_freespace();
880 if (!dev->is_freespace_ok()) { /* Error while getting free space */
881 char ed1[50], ed2[50];
882 Dmsg1(100, "Cannot get free space on the device ERR=%s.\n", dev->errmsg);
883 Jmsg(jcr, M_FATAL, 0, _("End of Volume \"%s\" at %u:%u on device %s "
884 "(part_size=%s, free_space=%s, free_space_errno=%d, errmsg=%s).\n"),
885 dev->getVolCatName(),
886 dev->file, dev->block_num, dev->print_name(),
887 edit_uint64_with_commas(dev->part_size, ed1), edit_uint64_with_commas(dev->free_space, ed2),
888 dev->free_space_errno, dev->errmsg);
889 dev->dev_errno = dev->free_space_errno;
893 if ((dev->is_freespace_ok() && (dev->part_size + block->binbuf) >= dev->free_space)) {
894 char ed1[50], ed2[50];
895 Dmsg0(100, "==== Just enough free space on the device to write the current part...\n");
896 Jmsg(jcr, M_INFO, 0, _("End of Volume \"%s\" at %u:%u on device %s "
897 "(part_size=%s, free_space=%s, free_space_errno=%d).\n"),
898 dev->getVolCatName(),
899 dev->file, dev->block_num, dev->print_name(),
900 edit_uint64_with_commas(dev->part_size, ed1), edit_uint64_with_commas(dev->free_space, ed2),
901 dev->free_space_errno);
902 terminate_writing_volume(dcr);
903 dev->dev_errno = ENOSPC;
911 * Read block with locking
914 bool read_block_from_device(DCR *dcr, bool check_block_numbers)
917 DEVICE *dev = dcr->dev;
918 Dmsg0(250, "Enter read_block_from_device\n");
920 ok = read_block_from_dev(dcr, check_block_numbers);
922 Dmsg0(250, "Leave read_block_from_device\n");
927 * Read the next block into the block structure and unserialize
928 * the block header. For a file, the block may be partially
929 * or completely in the current buffer.
931 bool read_block_from_dev(DCR *dcr, bool check_block_numbers)
935 uint32_t BlockNumber;
938 DEVICE *dev = dcr->dev;
939 DEV_BLOCK *block = dcr->block;
941 if (job_canceled(jcr)) {
944 ASSERT(dev->is_open());
950 Dmsg1(250, "Full read in read_block_from_device() len=%d\n",
954 dev->dev_errno = EIO;
955 Mmsg1(dev->errmsg, _("Block buffer size looping problem on device %s\n"),
957 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
962 // #define lots_of_debug
964 if (dev->at_eof() && dev->is_dvd()) {
965 Dmsg1(100, "file_size=%u\n",(unsigned int)dev->file_size);
966 Dmsg1(100, "file_addr=%u\n",(unsigned int)dev->file_addr);
967 Dmsg1(100, "lseek=%u\n",(unsigned int)lseek(dev->fd(), 0, SEEK_CUR));
968 Dmsg1(100, "part_start=%u\n",(unsigned int)dev->part_start);
969 Dmsg1(100, "part_size=%u\n", (unsigned int)dev->part_size);
970 Dmsg2(100, "part=%u num_dvd_parts=%u\n", dev->part, dev->num_dvd_parts);
971 Dmsg1(100, "VolCatInfo.VolCatParts=%u\n", (unsigned int)dev->VolCatInfo.VolCatParts);
972 Dmsg3(100, "Tests : %d %d %d\n", (dev->VolCatInfo.VolCatParts > 0),
973 ((dev->file_addr-dev->part_start) == dev->part_size),
974 (dev->part <= dev->VolCatInfo.VolCatParts));
978 /* Check for DVD part file end */
979 if (dev->at_eof() && dev->is_dvd() && dev->num_dvd_parts > 0 &&
980 dev->part <= dev->num_dvd_parts) {
981 Dmsg0(400, "Call dvd_open_next_part\n");
982 if (dvd_open_next_part(dcr) < 0) {
983 Jmsg3(dcr->jcr, M_FATAL, 0, _("Unable to open device part=%d %s: ERR=%s\n"),
984 dev->part, dev->print_name(), dev->bstrerror());
985 dev->dev_errno = EIO;
994 if ((retry > 0 && stat == -1 && errno == EBUSY)) {
996 Dmsg4(100, "===== read retry=%d stat=%d errno=%d: ERR=%s\n",
997 retry, stat, errno, be.bstrerror());
998 bmicrosleep(10, 0); /* pause a bit if busy or lots of errors */
1001 stat = dev->read(block->buf, (size_t)block->buf_len);
1003 } while (stat == -1 && (errno == EBUSY || errno == EINTR || errno == EIO) && retry++ < 3);
1007 Dmsg1(250, "Read device got: ERR=%s\n", be.bstrerror());
1008 block->read_len = 0;
1009 Mmsg5(dev->errmsg, _("Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n"),
1010 dev->fd(), dev->file, dev->block_num, dev->print_name(), be.bstrerror());
1011 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
1012 if (dev->at_eof()) { /* EOF just seen? */
1013 dev->set_eot(); /* yes, error => EOT */
1017 Dmsg3(250, "Read device got %d bytes at %u:%u\n", stat,
1018 dev->file, dev->block_num);
1019 if (stat == 0) { /* Got EOF ! */
1021 block->read_len = 0;
1022 Mmsg3(dev->errmsg, _("Read zero bytes at %u:%u on device %s.\n"),
1023 dev->file, dev->block_num, dev->print_name());
1024 if (dev->at_eof()) { /* EOF already read? */
1025 dev->set_eot(); /* yes, 2 EOFs => EOT */
1029 return false; /* return eof */
1032 /* Continue here for successful read */
1034 block->read_len = stat; /* save length read */
1035 if (block->read_len == 80 &&
1036 (dcr->VolCatInfo.LabelType != B_BACULA_LABEL ||
1037 dcr->device->label_type != B_BACULA_LABEL)) {
1038 /* ***FIXME*** should check label */
1039 Dmsg2(100, "Ignore 80 byte ANSI label at %u:%u\n", dev->file, dev->block_num);
1041 goto reread; /* skip ANSI/IBM label */
1044 if (block->read_len < BLKHDR2_LENGTH) {
1045 dev->dev_errno = EIO;
1046 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Very short block of %d bytes on device %s discarded.\n"),
1047 dev->file, dev->block_num, block->read_len, dev->print_name());
1048 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
1049 dev->set_short_block();
1050 block->read_len = block->binbuf = 0;
1051 return false; /* return error */
1054 BlockNumber = block->BlockNumber + 1;
1055 if (!unser_block_header(jcr, dev, block)) {
1057 dev->file_addr += block->read_len;
1058 dev->file_size += block->read_len;
1065 * If the block is bigger than the buffer, we reposition for
1066 * re-reading the block, allocate a buffer of the correct size,
1069 if (block->block_len > block->buf_len) {
1070 dev->dev_errno = EIO;
1071 Mmsg2(dev->errmsg, _("Block length %u is greater than buffer %u. Attempting recovery.\n"),
1072 block->block_len, block->buf_len);
1073 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
1074 Pmsg1(000, "%s", dev->errmsg);
1075 /* Attempt to reposition to re-read the block */
1076 if (dev->is_tape()) {
1077 Dmsg0(250, "BSR for reread; block too big for buffer.\n");
1079 Jmsg(jcr, M_ERROR, 0, "%s", dev->bstrerror());
1080 block->read_len = 0;
1084 Dmsg0(250, "Seek to beginning of block for reread.\n");
1085 boffset_t pos = dev->lseek(dcr, (boffset_t)0, SEEK_CUR); /* get curr pos */
1086 pos -= block->read_len;
1087 dev->lseek(dcr, pos, SEEK_SET);
1088 dev->file_addr = pos;
1090 Mmsg1(dev->errmsg, _("Setting block buffer size to %u bytes.\n"), block->block_len);
1091 Jmsg(jcr, M_INFO, 0, "%s", dev->errmsg);
1092 Pmsg1(000, "%s", dev->errmsg);
1093 /* Set new block length */
1094 dev->max_block_size = block->block_len;
1095 block->buf_len = block->block_len;
1096 free_memory(block->buf);
1097 block->buf = get_memory(block->buf_len);
1100 goto reread; /* re-read block with correct block size */
1103 if (block->block_len > block->read_len) {
1104 dev->dev_errno = EIO;
1105 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n"),
1106 dev->file, dev->block_num, block->read_len, dev->print_name());
1107 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
1108 dev->set_short_block();
1109 block->read_len = block->binbuf = 0;
1110 return false; /* return error */
1113 dev->clear_short_block();
1115 dev->VolCatInfo.VolCatReads++;
1116 dev->VolCatInfo.VolCatRBytes += block->read_len;
1118 dev->EndBlock = dev->block_num;
1119 dev->EndFile = dev->file;
1122 /* Update dcr values */
1123 if (dev->is_tape()) {
1124 dcr->EndBlock = dev->EndBlock;
1125 dcr->EndFile = dev->EndFile;
1127 /* We need to take care about a short block in EndBlock/File
1130 uint32_t len = MIN(block->read_len, block->block_len);
1131 uint64_t addr = dev->file_addr + len - 1;
1132 dcr->EndBlock = (uint32_t)addr;
1133 dcr->EndFile = (uint32_t)(addr >> 32);
1134 dev->block_num = dev->EndBlock = dcr->EndBlock;
1135 dev->file = dev->EndFile = dcr->EndFile;
1137 dcr->VolMediaId = dev->VolCatInfo.VolMediaId;
1138 dev->file_addr += block->read_len;
1139 dev->file_size += block->read_len;
1142 * If we read a short block on disk,
1143 * seek to beginning of next block. This saves us
1144 * from shuffling blocks around in the buffer. Take a
1145 * look at this from an efficiency stand point later, but
1146 * it should only happen once at the end of each job.
1148 * I've been lseek()ing negative relative to SEEK_CUR for 30
1149 * years now. However, it seems that with the new off_t definition,
1150 * it is not possible to seek negative amounts, so we use two
1151 * lseek(). One to get the position, then the second to do an
1152 * absolute positioning -- so much for efficiency. KES Sep 02.
1154 Dmsg0(250, "At end of read block\n");
1155 if (block->read_len > block->block_len && !dev->is_tape()) {
1157 boffset_t pos = dev->lseek(dcr, (boffset_t)0, SEEK_CUR); /* get curr pos */
1158 Dmsg1(250, "Current lseek pos=%s\n", edit_int64(pos, ed1));
1159 pos -= (block->read_len - block->block_len);
1160 dev->lseek(dcr, pos, SEEK_SET);
1161 Dmsg3(250, "Did lseek pos=%s blk_size=%d rdlen=%d\n",
1162 edit_int64(pos, ed1), block->block_len,
1164 dev->file_addr = pos;
1165 dev->file_size = pos;
1167 Dmsg2(250, "Exit read_block read_len=%d block_len=%d\n",
1168 block->read_len, block->block_len);
1169 block->block_read = true;