X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fblock.c;h=2db124e5ba57c7b97d586988a4ea29ed9239caf7;hb=8ec0de6a73f09501ee0d8da46a40d46b4c41d26a;hp=8ebdaf7edff00a1cdec6593edb31949ce3aad031;hpb=f3b4206edb45f57c82fd689ca70facf39dd832ec;p=bacula%2Fbacula diff --git a/bacula/src/stored/block.c b/bacula/src/stored/block.c index 8ebdaf7edf..2db124e5ba 100644 --- a/bacula/src/stored/block.c +++ b/bacula/src/stored/block.c @@ -11,7 +11,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2001-2006 Free Software Foundation Europe e.V. + Copyright (C) 2001-2007 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -346,7 +346,7 @@ bool write_block_to_device(DCR *dcr) } if (!dcr->dev_locked) { /* device already locked? */ - lock_device(dev); /* no, lock it */ + dev->r_dlock(); /* no, lock it */ } /* @@ -388,7 +388,7 @@ bool write_block_to_device(DCR *dcr) bail_out: if (!dcr->dev_locked) { /* did we lock dev above? */ - unlock_device(dev); /* unlock it now */ + dev->dunlock(); /* unlock it now */ } return stat; } @@ -533,15 +533,12 @@ bool write_block_to_dev(DCR *dcr) if (retry > 0 && stat == -1 && errno == EBUSY) { berrno be; Dmsg4(100, "===== write retry=%d stat=%d errno=%d: ERR=%s\n", - retry, stat, errno, be.strerror()); + retry, stat, errno, be.bstrerror()); bmicrosleep(5, 0); /* pause a bit if busy or lots of errors */ dev->clrerror(-1); } - if (dev->is_tape()) { - stat = tape_write(dev->fd, block->buf, (size_t)wlen); - } else { - stat = write(dev->fd, block->buf, (size_t)wlen); - } + stat = dev->write(block->buf, (size_t)wlen); + } while (stat == -1 && (errno == EBUSY || errno == EIO) && retry++ < 3); #ifdef DEBUG_BLOCK_ZEROING @@ -566,7 +563,7 @@ bool write_block_to_dev(DCR *dcr) if (dev->dev_errno != ENOSPC) { dev->VolCatInfo.VolCatErrors++; Jmsg4(jcr, M_ERROR, 0, _("Write error at %u:%u on device %s. ERR=%s.\n"), - dev->file, dev->block_num, dev->print_name(), be.strerror()); + dev->file, dev->block_num, dev->print_name(), be.bstrerror()); } } else { dev->dev_errno = ENOSPC; /* out of space */ @@ -577,7 +574,7 @@ bool write_block_to_dev(DCR *dcr) dev->file, dev->block_num, dev->print_name(), wlen, stat); } Dmsg7(100, "=== Write error. fd=%d size=%u rtn=%d dev_blk=%d blk_blk=%d errno=%d: ERR=%s\n", - dev->fd, wlen, stat, dev->block_num, block->BlockNumber, + dev->fd(), wlen, stat, dev->block_num, block->BlockNumber, dev->dev_errno, strerror(dev->dev_errno)); ok = terminate_writing_volume(dcr); @@ -649,20 +646,20 @@ static void reread_last_block(DCR *dcr) berrno be; ok = false; Jmsg(jcr, M_ERROR, 0, _("Backspace file at EOT failed. ERR=%s\n"), - be.strerror(dev->dev_errno)); + be.bstrerror(dev->dev_errno)); } if (ok && dev->has_cap(CAP_TWOEOF) && !dev->bsf(1)) { berrno be; ok = false; Jmsg(jcr, M_ERROR, 0, _("Backspace file at EOT failed. ERR=%s\n"), - be.strerror(dev->dev_errno)); + be.bstrerror(dev->dev_errno)); } /* Backspace over record */ if (ok && !dev->bsr(1)) { berrno be; ok = false; Jmsg(jcr, M_ERROR, 0, _("Backspace record at EOT failed. ERR=%s\n"), - be.strerror(dev->dev_errno)); + be.bstrerror(dev->dev_errno)); /* * On FreeBSD systems, if the user got here, it is likely that his/her * tape drive is "frozen". The correct thing to do is a @@ -729,7 +726,6 @@ static bool terminate_writing_volume(DCR *dcr) } bstrncpy(dev->VolCatInfo.VolCatStatus, "Full", sizeof(dev->VolCatInfo.VolCatStatus)); dev->VolCatInfo.VolCatFiles = dev->file; /* set number of files */ - dev->VolCatInfo.VolCatJobs++; /* increment number of jobs */ if (dev->is_dvd()) { if (!dvd_write_part(dcr)) { /* write last part */ @@ -900,9 +896,9 @@ bool read_block_from_device(DCR *dcr, bool check_block_numbers) bool ok; DEVICE *dev = dcr->dev; Dmsg0(200, "Enter read_block_from_device\n"); - lock_device(dev); + dev->r_dlock(); ok = read_block_from_dev(dcr, check_block_numbers); - unlock_device(dev); + dev->dunlock(); Dmsg0(200, "Leave read_block_from_device\n"); return ok; } @@ -945,7 +941,7 @@ reread: if (dev->at_eof() && dev->is_dvd()) { Dmsg1(100, "file_size=%u\n",(unsigned int)dev->file_size); Dmsg1(100, "file_addr=%u\n",(unsigned int)dev->file_addr); - Dmsg1(100, "lseek=%u\n",(unsigned int)lseek(dev->fd, 0, SEEK_CUR)); + Dmsg1(100, "lseek=%u\n",(unsigned int)lseek(dev->fd(), 0, SEEK_CUR)); Dmsg1(100, "part_start=%u\n",(unsigned int)dev->part_start); Dmsg1(100, "part_size=%u\n", (unsigned int)dev->part_size); Dmsg2(100, "part=%u num_dvd_parts=%u\n", dev->part, dev->num_dvd_parts); @@ -975,23 +971,20 @@ reread: if ((retry > 0 && stat == -1 && errno == EBUSY)) { berrno be; Dmsg4(100, "===== read retry=%d stat=%d errno=%d: ERR=%s\n", - retry, stat, errno, be.strerror()); + retry, stat, errno, be.bstrerror()); bmicrosleep(10, 0); /* pause a bit if busy or lots of errors */ dev->clrerror(-1); } - if (dev->is_tape()) { - stat = tape_read(dev->fd, block->buf, (size_t)block->buf_len); - } else { - stat = read(dev->fd, block->buf, (size_t)block->buf_len); - } + stat = dev->read(block->buf, (size_t)block->buf_len); + } while (stat == -1 && (errno == EBUSY || errno == EINTR || errno == EIO) && retry++ < 3); if (stat < 0) { berrno be; dev->clrerror(-1); - Dmsg1(200, "Read device got: ERR=%s\n", be.strerror()); + Dmsg1(200, "Read device got: ERR=%s\n", be.bstrerror()); block->read_len = 0; Mmsg5(dev->errmsg, _("Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n"), - dev->fd, dev->file, dev->block_num, dev->print_name(), be.strerror()); + dev->fd(), dev->file, dev->block_num, dev->print_name(), be.bstrerror()); Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg); if (dev->at_eof()) { /* EOF just seen? */ dev->set_eot(); /* yes, error => EOT */ @@ -1088,11 +1081,6 @@ reread: dev->VolCatInfo.VolCatReads++; dev->VolCatInfo.VolCatRBytes += block->read_len; - dev->VolCatInfo.VolCatBytes += block->block_len; - dev->VolCatInfo.VolCatBlocks++; - if (dev->VolCatInfo.VolFirstWritten == 0) { - dev->VolCatInfo.VolFirstWritten = (utime_t)time(NULL); /* Set first written time */ - } dev->EndBlock = dev->block_num; dev->EndFile = dev->file; dev->block_num++;