3 * block.c -- tape block handling functions
5 * Kern Sibbald, March MMI
6 * added BB02 format October MMII
12 Copyright (C) 2001-2006 Kern Sibbald
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License
16 version 2 as amended with additional clauses defined in the
17 file LICENSE in the main source directory.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 the file LICENSE for additional details.
30 extern int debug_level;
31 static bool terminate_writing_volume(DCR *dcr);
32 static bool do_new_file_bookkeeping(DCR *dcr);
33 static bool do_dvd_size_checks(DCR *dcr);
34 static void reread_last_block(DCR *dcr);
37 * Dump the block header, then walk through
38 * the block printing out the record headers.
40 void dump_block(DEV_BLOCK *b, const char *msg)
44 char Id[BLKHDR_ID_LENGTH+1];
45 uint32_t CheckSum, BlockCheckSum;
48 uint32_t VolSessionId, VolSessionTime, data_len;
52 char buf1[100], buf2[100];
54 unser_begin(b->buf, BLKHDR1_LENGTH);
55 unser_uint32(CheckSum);
56 unser_uint32(block_len);
57 unser_uint32(BlockNumber);
58 unser_bytes(Id, BLKHDR_ID_LENGTH);
59 ASSERT(unser_length(b->buf) == BLKHDR1_LENGTH);
60 Id[BLKHDR_ID_LENGTH] = 0;
62 unser_uint32(VolSessionId);
63 unser_uint32(VolSessionTime);
67 VolSessionId = VolSessionTime = 0;
72 if (block_len > 100000) {
73 Dmsg3(20, "Dump block %s 0x%x blocksize too big %u\n", msg, b, block_len);
77 BlockCheckSum = bcrc32((uint8_t *)b->buf+BLKHDR_CS_LENGTH,
78 block_len-BLKHDR_CS_LENGTH);
79 Pmsg6(000, _("Dump block %s %x: size=%d BlkNum=%d\n"
80 " Hdrcksum=%x cksum=%x\n"),
81 msg, b, block_len, BlockNumber, CheckSum, BlockCheckSum);
83 while (p < (b->buf + block_len+WRITE_RECHDR_LENGTH)) {
84 unser_begin(p, WRITE_RECHDR_LENGTH);
85 if (rhl == RECHDR1_LENGTH) {
86 unser_uint32(VolSessionId);
87 unser_uint32(VolSessionTime);
89 unser_int32(FileIndex);
91 unser_uint32(data_len);
92 Pmsg6(000, _(" Rec: VId=%u VT=%u FI=%s Strm=%s len=%d p=%x\n"),
93 VolSessionId, VolSessionTime, FI_to_ascii(buf1, FileIndex),
94 stream_to_ascii(buf2, Stream, FileIndex), data_len, p);
100 * Create a new block structure.
101 * We pass device so that the block can inherit the
102 * min and max block sizes.
104 DEV_BLOCK *new_block(DEVICE *dev)
106 DEV_BLOCK *block = (DEV_BLOCK *)get_memory(sizeof(DEV_BLOCK));
108 memset(block, 0, sizeof(DEV_BLOCK));
110 /* If the user has specified a max_block_size, use it as the default */
111 if (dev->max_block_size == 0) {
112 block->buf_len = DEFAULT_BLOCK_SIZE;
114 block->buf_len = dev->max_block_size;
117 block->block_len = block->buf_len; /* default block size */
118 block->buf = get_memory(block->buf_len);
120 block->BlockVer = BLOCK_VER; /* default write version */
121 Dmsg1(650, "Returning new block=%x\n", block);
127 * Duplicate an existing block (eblock)
129 DEV_BLOCK *dup_block(DEV_BLOCK *eblock)
131 DEV_BLOCK *block = (DEV_BLOCK *)get_memory(sizeof(DEV_BLOCK));
132 int buf_len = sizeof_pool_memory(eblock->buf);
134 memcpy(block, eblock, sizeof(DEV_BLOCK));
135 block->buf = get_memory(buf_len);
136 memcpy(block->buf, eblock->buf, buf_len);
142 * Only the first block checksum error was reported.
143 * If there are more, report it now.
145 void print_block_read_errors(JCR *jcr, DEV_BLOCK *block)
147 if (block->read_errors > 1) {
148 Jmsg(jcr, M_ERROR, 0, _("%d block read errors not printed.\n"),
156 void free_block(DEV_BLOCK *block)
158 Dmsg1(999, "free_block buffer %x\n", block->buf);
159 free_memory(block->buf);
160 Dmsg1(999, "free_block block %x\n", block);
161 free_memory((POOLMEM *)block);
164 /* Empty the block -- for writing */
165 void empty_block(DEV_BLOCK *block)
167 block->binbuf = WRITE_BLKHDR_LENGTH;
168 block->bufp = block->buf + block->binbuf;
170 block->write_failed = false;
171 block->block_read = false;
172 block->FirstIndex = block->LastIndex = 0;
176 * Create block header just before write. The space
177 * in the buffer should have already been reserved by
180 void ser_block_header(DEV_BLOCK *block)
183 uint32_t CheckSum = 0;
184 uint32_t block_len = block->binbuf;
186 Dmsg1(1390, "ser_block_header: block_len=%d\n", block_len);
187 ser_begin(block->buf, BLKHDR2_LENGTH);
188 ser_uint32(CheckSum);
189 ser_uint32(block_len);
190 ser_uint32(block->BlockNumber);
191 ser_bytes(WRITE_BLKHDR_ID, BLKHDR_ID_LENGTH);
192 if (BLOCK_VER >= 2) {
193 ser_uint32(block->VolSessionId);
194 ser_uint32(block->VolSessionTime);
197 /* Checksum whole block except for the checksum */
198 CheckSum = bcrc32((uint8_t *)block->buf+BLKHDR_CS_LENGTH,
199 block_len-BLKHDR_CS_LENGTH);
200 Dmsg1(1390, "ser_bloc_header: checksum=%x\n", CheckSum);
201 ser_begin(block->buf, BLKHDR2_LENGTH);
202 ser_uint32(CheckSum); /* now add checksum to block header */
206 * Unserialize the block header for reading block.
207 * This includes setting all the buffer pointers correctly.
209 * Returns: false on failure (not a block)
212 static bool unser_block_header(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
215 char Id[BLKHDR_ID_LENGTH+1];
216 uint32_t CheckSum, BlockCheckSum;
219 uint32_t BlockNumber;
222 unser_begin(block->buf, BLKHDR_LENGTH);
223 unser_uint32(CheckSum);
224 unser_uint32(block_len);
225 unser_uint32(BlockNumber);
226 unser_bytes(Id, BLKHDR_ID_LENGTH);
227 ASSERT(unser_length(block->buf) == BLKHDR1_LENGTH);
229 Id[BLKHDR_ID_LENGTH] = 0;
231 bhl = BLKHDR1_LENGTH;
233 block->bufp = block->buf + bhl;
234 if (strncmp(Id, BLKHDR1_ID, BLKHDR_ID_LENGTH) != 0) {
235 dev->dev_errno = EIO;
236 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer discarded.\n"),
237 dev->file, dev->block_num, BLKHDR1_ID, Id);
238 if (block->read_errors == 0 || verbose >= 2) {
239 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
241 block->read_errors++;
244 } else if (Id[3] == '2') {
245 unser_uint32(block->VolSessionId);
246 unser_uint32(block->VolSessionTime);
247 bhl = BLKHDR2_LENGTH;
249 block->bufp = block->buf + bhl;
250 if (strncmp(Id, BLKHDR2_ID, BLKHDR_ID_LENGTH) != 0) {
251 dev->dev_errno = EIO;
252 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer discarded.\n"),
253 dev->file, dev->block_num, BLKHDR2_ID, Id);
254 if (block->read_errors == 0 || verbose >= 2) {
255 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
257 block->read_errors++;
261 dev->dev_errno = EIO;
262 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Wanted ID: \"%s\", got \"%s\". Buffer discarded.\n"),
263 dev->file, dev->block_num, BLKHDR2_ID, Id);
264 if (block->read_errors == 0 || verbose >= 2) {
265 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
267 block->read_errors++;
268 unser_uint32(block->VolSessionId);
269 unser_uint32(block->VolSessionTime);
274 if (block_len > MAX_BLOCK_LENGTH) {
275 dev->dev_errno = EIO;
276 Mmsg3(dev->errmsg, _("Volume data error at %u:%u! Block length %u is insane (too large), probably due to a bad archive.\n"),
277 dev->file, dev->block_num, block_len);
278 if (block->read_errors == 0 || verbose >= 2) {
279 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
281 block->read_errors++;
285 Dmsg1(390, "unser_block_header block_len=%d\n", block_len);
286 /* Find end of block or end of buffer whichever is smaller */
287 if (block_len > block->read_len) {
288 block_end = block->read_len;
290 block_end = block_len;
292 block->binbuf = block_end - bhl;
293 block->block_len = block_len;
294 block->BlockNumber = BlockNumber;
295 Dmsg3(390, "Read binbuf = %d %d block_len=%d\n", block->binbuf,
297 if (block_len <= block->read_len) {
298 BlockCheckSum = bcrc32((uint8_t *)block->buf+BLKHDR_CS_LENGTH,
299 block_len-BLKHDR_CS_LENGTH);
300 if (BlockCheckSum != CheckSum) {
301 dev->dev_errno = EIO;
302 Mmsg6(dev->errmsg, _("Volume data error at %u:%u!\n"
303 "Block checksum mismatch in block=%u len=%d: calc=%x blk=%x\n"),
304 dev->file, dev->block_num, (unsigned)BlockNumber,
305 block_len, BlockCheckSum, CheckSum);
306 if (block->read_errors == 0 || verbose >= 2) {
307 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
309 block->read_errors++;
319 * Write a block to the device, with locking and unlocking
321 * Returns: true on success
325 bool write_block_to_device(DCR *dcr)
328 DEVICE *dev = dcr->dev;
332 stat = write_block_to_spool_file(dcr);
336 if (!dcr->dev_locked) {
341 * If a new volume has been mounted since our last write
342 * Create a JobMedia record for the previous volume written,
343 * and set new parameters to write this volume
344 * The same applies for if we are in a new file.
346 if (dcr->NewVol || dcr->NewFile) {
347 if (job_canceled(jcr)) {
351 /* Create a jobmedia record for this job */
352 if (!dir_create_jobmedia_record(dcr)) {
353 dev->dev_errno = EIO;
354 Jmsg(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"),
355 dcr->VolCatInfo.VolCatName, jcr->Job);
356 set_new_volume_parameters(dcr);
361 /* Note, setting a new volume also handles any pending new file */
362 set_new_volume_parameters(dcr);
363 dcr->NewFile = false; /* this handled for new file too */
365 set_new_file_parameters(dcr);
369 if (!write_block_to_dev(dcr)) {
370 if (job_canceled(jcr) || jcr->JobType == JT_SYSTEM) {
373 stat = fixup_device_block_write_error(dcr);
378 if (!dcr->dev_locked) {
385 * Write a block to the device
387 * Returns: true on success or EOT
388 * false on hard error
390 bool write_block_to_dev(DCR *dcr)
393 uint32_t wlen; /* length to write */
394 int hit_max1, hit_max2;
396 DEVICE *dev = dcr->dev;
398 DEV_BLOCK *block = dcr->block;
400 #ifdef NO_TAPE_WRITE_TEST
404 ASSERT(block->binbuf == ((uint32_t) (block->bufp - block->buf)));
406 /* dump_block(block, "before write"); */
407 if (dev->at_weot()) {
408 Dmsg0(100, "return write_block_to_dev with ST_WEOT\n");
409 dev->dev_errno = ENOSPC;
410 Jmsg(jcr, M_FATAL, 0, _("Cannot write block. Device at EOM.\n"));
413 if (!dev->can_append()) {
414 dev->dev_errno = EIO;
415 Jmsg(jcr, M_FATAL, 0, _("Attempt to write on read-only Volume.\n"));
418 wlen = block->binbuf;
419 if (wlen <= WRITE_BLKHDR_LENGTH) { /* Does block have data in it? */
420 Dmsg0(100, "return write_block_to_dev no data to write\n");
424 * Clear to the end of the buffer if it is not full,
425 * and on tape devices, apply min and fixed blocking.
427 if (wlen != block->buf_len) {
428 uint32_t blen; /* current buffer length */
430 Dmsg2(200, "binbuf=%d buf_len=%d\n", block->binbuf, block->buf_len);
433 /* Adjust write size to min/max for tapes only */
434 if (dev->is_tape()) {
435 /* check for fixed block size */
436 if (dev->min_block_size == dev->max_block_size) {
437 wlen = block->buf_len; /* fixed block size already rounded */
438 /* Check for min block size */
439 } else if (wlen < dev->min_block_size) {
440 wlen = ((dev->min_block_size + TAPE_BSIZE - 1) / TAPE_BSIZE) * TAPE_BSIZE;
441 /* Ensure size is rounded */
443 wlen = ((wlen + TAPE_BSIZE - 1) / TAPE_BSIZE) * TAPE_BSIZE;
447 memset(block->bufp, 0, wlen-blen); /* clear garbage */
451 ser_block_header(block);
453 /* Limit maximum Volume size to value specified by user */
454 hit_max1 = (dev->max_volume_size > 0) &&
455 ((dev->VolCatInfo.VolCatBytes + block->binbuf)) >= dev->max_volume_size;
456 hit_max2 = (dev->VolCatInfo.VolCatMaxBytes > 0) &&
457 ((dev->VolCatInfo.VolCatBytes + block->binbuf)) >= dev->VolCatInfo.VolCatMaxBytes;
458 if (hit_max1 || hit_max2) {
461 Dmsg0(10, "==== Output bytes Triggered medium max capacity.\n");
463 max_cap = dev->max_volume_size;
465 max_cap = dev->VolCatInfo.VolCatMaxBytes;
467 Jmsg(jcr, M_INFO, 0, _("User defined maximum volume capacity %s exceeded on device %s.\n"),
468 edit_uint64_with_commas(max_cap, ed1), dev->print_name());
469 terminate_writing_volume(dcr);
470 reread_last_block(dcr); /* DEBUG */
471 dev->dev_errno = ENOSPC;
475 /* Limit maximum File size on volume to user specified value */
476 if ((dev->max_file_size > 0) &&
477 (dev->file_size+block->binbuf) >= dev->max_file_size) {
478 dev->file_size = 0; /* reset file size */
480 if (weof_dev(dev, 1) != 0) { /* write eof */
481 Dmsg0(190, "WEOF error in max file size.\n");
482 Jmsg(jcr, M_FATAL, 0, _("Unable to write EOF. ERR=%s\n"),
484 terminate_writing_volume(dcr);
485 dev->dev_errno = ENOSPC;
488 if (!write_ansi_ibm_labels(dcr, ANSI_EOF_LABEL, dev->VolHdr.VolumeName)) {
492 if (!do_new_file_bookkeeping(dcr)) {
493 /* Error message already sent */
498 if (!do_dvd_size_checks(dcr)) {
499 /* Error message already sent */
503 dev->VolCatInfo.VolCatWrites++;
504 Dmsg1(1300, "Write block of %u bytes\n", wlen);
505 #ifdef DEBUG_BLOCK_ZEROING
506 uint32_t *bp = (uint32_t *)block->buf;
507 if (bp[0] == 0 && bp[1] == 0 && bp[2] == 0 && block->buf[12] == 0) {
508 Jmsg0(jcr, M_ABORT, 0, _("Write block header zeroed.\n"));
515 stat = write(dev->fd, block->buf, (size_t)wlen);
517 #ifdef DEBUG_BLOCK_ZEROING
518 if (bp[0] == 0 && bp[1] == 0 && bp[2] == 0 && block->buf[12] == 0) {
519 Jmsg0(jcr, M_ABORT, 0, _("Write block header zeroed.\n"));
523 if (stat != (ssize_t)wlen) {
524 /* Some devices simply report EIO when the volume is full.
525 * With a little more thought we may be able to check
526 * capacity and distinguish real errors and EOT
527 * conditions. In any case, we probably want to
528 * simulate an End of Medium.
532 clrerror_dev(dev, -1);
533 if (dev->dev_errno == 0) {
534 dev->dev_errno = ENOSPC; /* out of space */
536 if (dev->dev_errno != ENOSPC) {
537 Jmsg4(jcr, M_ERROR, 0, _("Write error at %u:%u on device %s. ERR=%s.\n"),
538 dev->file, dev->block_num, dev->print_name(), be.strerror());
541 dev->dev_errno = ENOSPC; /* out of space */
543 if (dev->dev_errno == ENOSPC) {
544 Jmsg(jcr, M_INFO, 0, _("End of Volume \"%s\" at %u:%u on device %s. Write of %u bytes got %d.\n"),
545 dev->VolCatInfo.VolCatName,
546 dev->file, dev->block_num, dev->print_name(), wlen, stat);
548 Dmsg7(100, "=== Write error. fd=%d size=%u rtn=%d dev_blk=%d blk_blk=%d errno=%d: ERR=%s\n",
549 dev->fd, wlen, stat, dev->block_num, block->BlockNumber,
550 dev->dev_errno, strerror(dev->dev_errno));
552 ok = terminate_writing_volume(dcr);
553 if (!ok && !forge_on) {
557 reread_last_block(dcr);
562 /* We successfully wrote the block, now do housekeeping */
564 dev->VolCatInfo.VolCatBytes += block->binbuf;
565 dev->VolCatInfo.VolCatBlocks++;
566 dev->EndBlock = dev->block_num;
567 dev->EndFile = dev->file;
569 block->BlockNumber++;
571 /* Update dcr values */
572 if (dev->is_tape()) {
573 dcr->EndBlock = dev->EndBlock;
574 dcr->EndFile = dev->EndFile;
576 /* Save address of block just written */
577 uint64_t addr = dev->file_addr + wlen - 1;
578 dcr->EndBlock = (uint32_t)addr;
579 dcr->EndFile = (uint32_t)(addr >> 32);
580 dev->block_num = dcr->EndBlock;
581 dev->file = dcr->EndFile;
583 if (dcr->VolFirstIndex == 0 && block->FirstIndex > 0) {
584 dcr->VolFirstIndex = block->FirstIndex;
586 if (block->LastIndex > 0) {
587 dcr->VolLastIndex = block->LastIndex;
589 dcr->WroteVol = true;
590 dev->file_addr += wlen; /* update file address */
591 dev->file_size += wlen;
592 dev->part_size += wlen;
594 Dmsg2(1300, "write_block: wrote block %d bytes=%d\n", dev->block_num, wlen);
599 static void reread_last_block(DCR *dcr)
601 #define CHECK_LAST_BLOCK
602 #ifdef CHECK_LAST_BLOCK
604 DEVICE *dev = dcr->dev;
606 DEV_BLOCK *block = dcr->block;
608 * If the device is a tape and it supports backspace record,
609 * we backspace over one or two eof marks depending on
610 * how many we just wrote, then over the last record,
611 * then re-read it and verify that the block number is
614 if (dev->is_tape() && dev_cap(dev, CAP_BSR)) {
615 /* Now back up over what we wrote and read the last block */
619 Jmsg(jcr, M_ERROR, 0, _("Backspace file at EOT failed. ERR=%s\n"),
620 be.strerror(dev->dev_errno));
622 if (ok && dev->has_cap(CAP_TWOEOF) && !dev->bsf(1)) {
625 Jmsg(jcr, M_ERROR, 0, _("Backspace file at EOT failed. ERR=%s\n"),
626 be.strerror(dev->dev_errno));
628 /* Backspace over record */
629 if (ok && !bsr_dev(dev, 1)) {
632 Jmsg(jcr, M_ERROR, 0, _("Backspace record at EOT failed. ERR=%s\n"),
633 be.strerror(dev->dev_errno));
635 * On FreeBSD systems, if the user got here, it is likely that his/her
636 * tape drive is "frozen". The correct thing to do is a
637 * rewind(), but if we do that, higher levels in cleaning up, will
638 * most likely write the EOS record over the beginning of the
639 * tape. The rewind *is* done later in mount.c when another
640 * tape is requested. Note, the clrerror_dev() call in bsr_dev()
641 * calls ioctl(MTCERRSTAT), which *should* fix the problem.
645 DEV_BLOCK *lblock = new_block(dev);
646 /* Note, this can destroy dev->errmsg */
648 if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
649 Jmsg(jcr, M_ERROR, 0, _("Re-read last block at EOT failed. ERR=%s"),
652 if (lblock->BlockNumber+1 == block->BlockNumber) {
653 Jmsg(jcr, M_INFO, 0, _("Re-read of last block succeeded.\n"));
655 Jmsg(jcr, M_ERROR, 0, _(
656 "Re-read of last block failed. Last block=%u Current block=%u.\n"),
657 lblock->BlockNumber, block->BlockNumber);
667 static bool terminate_writing_volume(DCR *dcr)
669 DEVICE *dev = dcr->dev;
672 /* Create a JobMedia record to indicated end of tape */
673 dev->VolCatInfo.VolCatFiles = dev->file;
674 if (!dir_create_jobmedia_record(dcr)) {
675 Dmsg0(190, "Error from create JobMedia\n");
676 dev->dev_errno = EIO;
677 Jmsg(dcr->jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"),
678 dcr->VolCatInfo.VolCatName, dcr->jcr->Job);
682 dcr->block->write_failed = true;
683 if (weof_dev(dev, 1) != 0) { /* end the tape */
684 dev->VolCatInfo.VolCatErrors++;
685 Jmsg(dcr->jcr, M_ERROR, 0, _("Error writing final EOF to tape. This Volume may not be readable.\n"
688 Dmsg0(100, "WEOF error.\n");
691 ok = write_ansi_ibm_labels(dcr, ANSI_EOV_LABEL, dev->VolHdr.VolumeName);
693 bstrncpy(dev->VolCatInfo.VolCatStatus, "Full", sizeof(dev->VolCatInfo.VolCatStatus));
694 dev->VolCatInfo.VolCatFiles = dev->file; /* set number of files */
695 dev->VolCatInfo.VolCatJobs++; /* increment number of jobs */
698 dvd_write_part(dcr); /* write last part */
699 dev->VolCatInfo.VolCatParts = dev->num_parts;
702 if (!dir_update_volume_info(dcr, false)) {
705 Dmsg1(100, "dir_update_volume_info terminate writing -- %s\n", ok?"OK":"ERROR");
708 * Walk through all attached dcrs setting flag to call
709 * set_new_file_parameters() when that dcr is next used.
712 foreach_dlist(mdcr, dev->attached_dcrs) {
713 if (mdcr->jcr->JobId == 0) {
716 mdcr->NewFile = true; /* set reminder to do set_new_file_params */
718 /* Set new file/block parameters for current dcr */
719 set_new_file_parameters(dcr);
721 if (ok && dev_cap(dev, CAP_TWOEOF) && weof_dev(dev, 1) != 0) { /* end the tape */
722 dev->VolCatInfo.VolCatErrors++;
723 /* This may not be fatal since we already wrote an EOF */
724 Jmsg(dcr->jcr, M_ERROR, 0, "%s", dev->errmsg);
727 dev->set_ateot(); /* no more writing this tape */
728 Dmsg1(100, "Leave terminate_writing_volume -- %s\n", ok?"OK":"ERROR");
733 * Do bookkeeping when a new file is created on a Volume. This is
734 * also done for disk files to generate the jobmedia records for
737 static bool do_new_file_bookkeeping(DCR *dcr)
739 DEVICE *dev = dcr->dev;
742 /* Create a JobMedia record so restore can seek */
743 if (!dir_create_jobmedia_record(dcr)) {
744 Dmsg0(190, "Error from create_job_media.\n");
745 dev->dev_errno = EIO;
746 Jmsg(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"),
747 dcr->VolCatInfo.VolCatName, jcr->Job);
748 terminate_writing_volume(dcr);
749 dev->dev_errno = EIO;
752 dev->VolCatInfo.VolCatFiles = dev->file;
753 if (!dir_update_volume_info(dcr, false)) {
754 Dmsg0(190, "Error from update_vol_info.\n");
755 terminate_writing_volume(dcr);
756 dev->dev_errno = EIO;
759 Dmsg0(100, "dir_update_volume_info max file size -- OK\n");
762 * Walk through all attached dcrs setting flag to call
763 * set_new_file_parameters() when that dcr is next used.
766 foreach_dlist(mdcr, dev->attached_dcrs) {
767 if (mdcr->jcr->JobId == 0) {
770 mdcr->NewFile = true; /* set reminder to do set_new_file_params */
772 /* Set new file/block parameters for current dcr */
773 set_new_file_parameters(dcr);
778 * Do all checks for DVD sizes during writing.
780 static bool do_dvd_size_checks(DCR *dcr)
782 DEVICE *dev = dcr->dev;
784 DEV_BLOCK *block = dcr->block;
786 /* Don't go further if the device is not a dvd */
787 if (!dev->is_dvd()) {
791 /* Limit maximum part size to value specified by user
793 if (dev->max_part_size > 0 && ((dev->part_size + block->binbuf) >= dev->max_part_size)) {
794 if (dev->part < dev->num_parts) {
795 Jmsg3(dcr->jcr, M_FATAL, 0, _("Error while writing, current part number"
796 " is less than the total number of parts (%d/%d, device=%s)\n"),
797 dev->part, dev->num_parts, dev->print_name());
798 dev->dev_errno = EIO;
802 if (dvd_open_next_part(dcr) < 0) {
803 Jmsg2(dcr->jcr, M_FATAL, 0, _("Unable to open device next part %s: ERR=%s\n"),
804 dev->print_name(), strerror_dev(dev));
805 dev->dev_errno = EIO;
809 dev->VolCatInfo.VolCatParts = dev->num_parts;
811 if (!dir_update_volume_info(dcr, false)) {
812 Dmsg0(190, "Error from update_vol_info.\n");
813 dev->dev_errno = EIO;
818 if (!dev->is_freespace_ok()) { /* Error while getting free space */
819 char ed1[50], ed2[50];
820 Dmsg1(10, "Cannot get free space on the device ERR=%s.\n", dev->errmsg);
821 Jmsg(jcr, M_FATAL, 0, _("End of Volume \"%s\" at %u:%u on device %s "
822 "(part_size=%s, free_space=%s, free_space_errno=%d, errmsg=%s).\n"),
823 dev->VolCatInfo.VolCatName,
824 dev->file, dev->block_num, dev->print_name(),
825 edit_uint64_with_commas(dev->part_size, ed1), edit_uint64_with_commas(dev->free_space, ed2),
826 dev->free_space_errno, dev->errmsg);
827 dev->dev_errno = dev->free_space_errno;
831 if ((dev->is_freespace_ok() && (dev->part_size + block->binbuf) >= dev->free_space)) {
832 char ed1[50], ed2[50];
833 Dmsg0(10, "==== Just enough free space on the device to write the current part...\n");
834 Jmsg(jcr, M_INFO, 0, _("End of Volume \"%s\" at %u:%u on device %s "
835 "(part_size=%s, free_space=%s, free_space_errno=%d).\n"),
836 dev->VolCatInfo.VolCatName,
837 dev->file, dev->block_num, dev->print_name(),
838 edit_uint64_with_commas(dev->part_size, ed1), edit_uint64_with_commas(dev->free_space, ed2),
839 dev->free_space_errno);
840 terminate_writing_volume(dcr);
841 dev->dev_errno = ENOSPC;
849 * Read block with locking
852 bool read_block_from_device(DCR *dcr, bool check_block_numbers)
855 DEVICE *dev = dcr->dev;
856 Dmsg0(200, "Enter read_block_from_device\n");
858 ok = read_block_from_dev(dcr, check_block_numbers);
860 Dmsg0(200, "Leave read_block_from_device\n");
865 * Read the next block into the block structure and unserialize
866 * the block header. For a file, the block may be partially
867 * or completely in the current buffer.
869 bool read_block_from_dev(DCR *dcr, bool check_block_numbers)
873 uint32_t BlockNumber;
876 DEVICE *dev = dcr->dev;
877 DEV_BLOCK *block = dcr->block;
883 Dmsg1(200, "Full read() in read_block_from_device() len=%d\n",
887 dev->dev_errno = EIO;
888 Mmsg1(dev->errmsg, _("Block buffer size looping problem on device %s\n"),
890 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
895 /*Dmsg1(100, "dev->file_size=%u\n",(unsigned int)dev->file_size);
896 Dmsg1(100, "dev->file_addr=%u\n",(unsigned int)dev->file_addr);
897 Dmsg1(100, "lseek=%u\n",(unsigned int)lseek(dev->fd, 0, SEEK_CUR));
898 Dmsg1(100, "dev->part_start=%u\n",(unsigned int)dev->part_start);
899 Dmsg1(100, "dev->file_addr-dev->part_start=%u\n",(unsigned int)dev->file_addr-dev->part_start);
900 Dmsg1(100, "dev->file_size-dev->part_start=%u\n",(unsigned int)dev->file_size-dev->part_start);
901 Dmsg1(100, "dev->part_size=%u\n", (unsigned int)dev->part_size);
902 Dmsg1(100, "dev->part=%u\n", (unsigned int)dev->part);
903 Dmsg1(100, "dev->num_parts=%u\n", (unsigned int)dev->num_parts);
904 Dmsg1(100, "dev->VolCatInfo.VolCatParts=%u\n", (unsigned int)dev->VolCatInfo.VolCatParts);
905 Dmsg3(100, "Tests : %d %d %d\n", (dev->VolCatInfo.VolCatParts > 0),
906 ((dev->file_addr-dev->part_start) == dev->part_size),
907 (dev->part <= dev->VolCatInfo.VolCatParts));*/
908 /* Check for part file end */
909 if ((dev->num_parts > 0) &&
910 ((dev->file_addr-dev->part_start) == dev->part_size) &&
911 (dev->part < dev->num_parts)) {
912 if (dvd_open_next_part(dcr) < 0) {
913 Jmsg2(dcr->jcr, M_FATAL, 0, _("Unable to open device next part %s: ERR=%s\n"),
914 dev->print_name(), strerror_dev(dev));
915 dev->dev_errno = EIO;
922 // uint32_t *bp = (uint32_t *)block->buf;
923 // Pmsg3(000, "Read %p %u at %llu\n", block->buf, block->buf_len, lseek(dev->fd, 0, SEEK_CUR));
925 stat = read(dev->fd, block->buf, (size_t)block->buf_len);
927 // Pmsg8(000, "stat=%d Csum=%u blen=%u bnum=%u %c%c%c%c\n",stat, bp[0],bp[1],bp[2],
928 // block->buf[12],block->buf[13],block->buf[14],block->buf[15]);
931 dev->VolCatInfo.VolCatErrors++;
933 } while (stat == -1 && (errno == EINTR || errno == EIO) && retry++ < 11);
936 clrerror_dev(dev, -1);
937 Dmsg1(200, "Read device got: ERR=%s\n", be.strerror());
939 Mmsg4(dev->errmsg, _("Read error at file:blk %u:%u on device %s. ERR=%s.\n"),
940 dev->file, dev->block_num, dev->print_name(), be.strerror());
941 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
942 if (dev->at_eof()) { /* EOF just seen? */
943 dev->set_eot(); /* yes, error => EOT */
947 Dmsg3(200, "Read device got %d bytes at %u:%u\n", stat,
948 dev->file, dev->block_num);
949 if (stat == 0) { /* Got EOF ! */
952 Mmsg3(dev->errmsg, _("Read zero bytes at %u:%u on device %s.\n"),
953 dev->file, dev->block_num, dev->print_name());
954 if (dev->at_eof()) { /* EOF already read? */
955 dev->set_eot(); /* yes, 2 EOFs => EOT */
959 return false; /* return eof */
961 /* Continue here for successful read */
962 block->read_len = stat; /* save length read */
963 if (block->read_len < BLKHDR2_LENGTH) {
964 dev->dev_errno = EIO;
965 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Very short block of %d bytes on device %s discarded.\n"),
966 dev->file, dev->block_num, block->read_len, dev->print_name());
967 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
968 dev->set_short_block();
969 block->read_len = block->binbuf = 0;
970 return false; /* return error */
973 BlockNumber = block->BlockNumber + 1;
974 if (!unser_block_header(jcr, dev, block)) {
976 dev->file_addr += block->read_len;
977 dev->file_size += block->read_len;
984 * If the block is bigger than the buffer, we reposition for
985 * re-reading the block, allocate a buffer of the correct size,
988 if (block->block_len > block->buf_len) {
989 dev->dev_errno = EIO;
990 Mmsg2(dev->errmsg, _("Block length %u is greater than buffer %u. Attempting recovery.\n"),
991 block->block_len, block->buf_len);
992 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
993 Pmsg1(000, "%s", dev->errmsg);
994 /* Attempt to reposition to re-read the block */
995 if (dev->is_tape()) {
996 Dmsg0(200, "BSR for reread; block too big for buffer.\n");
997 if (!bsr_dev(dev, 1)) {
998 Jmsg(jcr, M_ERROR, 0, "%s", strerror_dev(dev));
1003 Dmsg0(200, "Seek to beginning of block for reread.\n");
1004 off_t pos = lseek_dev(dev, (off_t)0, SEEK_CUR); /* get curr pos */
1005 pos -= block->read_len;
1006 lseek_dev(dev, pos, SEEK_SET);
1007 dev->file_addr = pos;
1009 Mmsg1(dev->errmsg, _("Setting block buffer size to %u bytes.\n"), block->block_len);
1010 Jmsg(jcr, M_INFO, 0, "%s", dev->errmsg);
1011 Pmsg1(000, "%s", dev->errmsg);
1012 /* Set new block length */
1013 dev->max_block_size = block->block_len;
1014 block->buf_len = block->block_len;
1015 free_memory(block->buf);
1016 block->buf = get_memory(block->buf_len);
1019 goto reread; /* re-read block with correct block size */
1022 if (block->block_len > block->read_len) {
1023 dev->dev_errno = EIO;
1024 Mmsg4(dev->errmsg, _("Volume data error at %u:%u! Short block of %d bytes on device %s discarded.\n"),
1025 dev->file, dev->block_num, block->read_len, dev->print_name());
1026 Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
1027 dev->set_short_block();
1028 block->read_len = block->binbuf = 0;
1029 return false; /* return error */
1032 dev->clear_short_block();
1034 dev->VolCatInfo.VolCatReads++;
1035 dev->VolCatInfo.VolCatRBytes += block->read_len;
1037 dev->VolCatInfo.VolCatBytes += block->block_len;
1038 dev->VolCatInfo.VolCatBlocks++;
1039 dev->EndBlock = dev->block_num;
1040 dev->EndFile = dev->file;
1043 /* Update dcr values */
1044 if (dev->is_tape()) {
1045 dcr->EndBlock = dev->EndBlock;
1046 dcr->EndFile = dev->EndFile;
1048 uint64_t addr = dev->file_addr + block->read_len - 1;
1049 dcr->EndBlock = (uint32_t)addr;
1050 dcr->EndFile = (uint32_t)(addr >> 32);
1051 dev->block_num = dcr->EndBlock;
1052 dev->file = dcr->EndFile;
1054 dev->file_addr += block->read_len;
1055 dev->file_size += block->read_len;
1058 * If we read a short block on disk,
1059 * seek to beginning of next block. This saves us
1060 * from shuffling blocks around in the buffer. Take a
1061 * look at this from an efficiency stand point later, but
1062 * it should only happen once at the end of each job.
1064 * I've been lseek()ing negative relative to SEEK_CUR for 30
1065 * years now. However, it seems that with the new off_t definition,
1066 * it is not possible to seek negative amounts, so we use two
1067 * lseek(). One to get the position, then the second to do an
1068 * absolute positioning -- so much for efficiency. KES Sep 02.
1070 Dmsg0(200, "At end of read block\n");
1071 if (block->read_len > block->block_len && !dev->is_tape()) {
1073 off_t pos = lseek_dev(dev, (off_t)0, SEEK_CUR); /* get curr pos */
1074 pos -= (block->read_len - block->block_len);
1075 lseek_dev(dev, pos, SEEK_SET);
1076 Dmsg3(200, "Did lseek pos=%s blk_size=%d rdlen=%d\n",
1077 edit_uint64(pos, ed1), block->block_len,
1079 dev->file_addr = pos;
1080 dev->file_size = pos;
1082 Dmsg2(200, "Exit read_block read_len=%d block_len=%d\n",
1083 block->read_len, block->block_len);
1084 block->block_read = true;