X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fbtape.c;h=967887290d4de97d85527c210001ec3654b60246;hb=c961a7fccda3a0bdb1f8decf16d3602b4b394d51;hp=ace8d8ffd0cbbc62c703cafe1ef168a2d01516f1;hpb=bc52f91c71c9ea44063408e89c110cc04c7354fd;p=bacula%2Fbacula diff --git a/bacula/src/stored/btape.c b/bacula/src/stored/btape.c index ace8d8ffd0..967887290d 100644 --- a/bacula/src/stored/btape.c +++ b/bacula/src/stored/btape.c @@ -1,12 +1,12 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2009 Free Software Foundation Europe e.V. + Copyright (C) 2000-2012 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. This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public + modify it under the terms of version three of the GNU Affero General Public License as published by the Free Software Foundation and included in the file LICENSE. @@ -15,7 +15,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -171,6 +171,7 @@ int main(int margc, char *margv[]) bindtextdomain("bacula", LOCALEDIR); textdomain("bacula"); init_stack_dump(); + lmgr_init_thread(); /* Sanity checks */ if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) { @@ -316,7 +317,10 @@ int main(int margc, char *margv[]) static void terminate_btape(int stat) { - sm_check(__FILE__, __LINE__, false); + Dsm_check(200); + free_jcr(jcr); + jcr = NULL; + if (configfile) { free(configfile); } @@ -338,8 +342,6 @@ static void terminate_btape(int stat) free_bsr(bsr); } - free_jcr(jcr); - jcr = NULL; free_volume_lists(); @@ -467,7 +469,7 @@ static bool open_the_device() block = new_block(dev); dev->r_dlock(); Dmsg1(200, "Opening device %s\n", dcr->VolumeName); - if (dev->open(dcr, OPEN_READ_WRITE) < 0) { + if (!dev->open(dcr, OPEN_READ_WRITE)) { Emsg1(M_FATAL, 0, _("dev open failed: %s\n"), dev->errmsg); ok = false; goto bail_out; @@ -731,7 +733,7 @@ static void capcmd() */ static void rectestcmd() { - DEV_BLOCK *block; + DEV_BLOCK *save_block; DEV_RECORD *rec; int i, blkno = 0; @@ -747,27 +749,29 @@ static void rectestcmd() return; } - sm_check(__FILE__, __LINE__, false); - block = new_block(dev); + Dsm_check(200); + save_block = dcr->block; + dcr->block = new_block(dev); rec = new_record(); for (i=1; i<500000; i++) { rec->data = check_pool_memory_size(rec->data, i); memset(rec->data, i & 0xFF, i); rec->data_len = i; - sm_check(__FILE__, __LINE__, false); - if (write_record_to_block(block, rec)) { - empty_block(block); + Dsm_check(200); + if (write_record_to_block(dcr, rec)) { + empty_block(dcr->block); blkno++; Pmsg2(0, _("Block %d i=%d\n"), blkno, i); } else { break; } - sm_check(__FILE__, __LINE__, false); + Dsm_check(200); } free_record(rec); - free_block(block); - sm_check(__FILE__, __LINE__, false); + free_block(dcr->block); + dcr->block = save_block; /* restore block to dcr */ + Dsm_check(200); } /* @@ -801,33 +805,33 @@ static bool re_read_block_test() rec->data = check_pool_memory_size(rec->data, block->buf_len); len = rec->data_len = block->buf_len-100; memset(rec->data, 1, rec->data_len); - if (!write_record_to_block(block, rec)) { + if (!write_record_to_block(dcr, rec)) { Pmsg0(0, _("Error writing record to block.\n")); goto bail_out; } - if (!write_block_to_dev(dcr)) { + if (!dcr->write_block_to_dev()) { Pmsg0(0, _("Error writing block to device.\n")); goto bail_out; } else { Pmsg1(0, _("Wrote first record of %d bytes.\n"), rec->data_len); } memset(rec->data, 2, rec->data_len); - if (!write_record_to_block(block, rec)) { + if (!write_record_to_block(dcr, rec)) { Pmsg0(0, _("Error writing record to block.\n")); goto bail_out; } - if (!write_block_to_dev(dcr)) { + if (!dcr->write_block_to_dev()) { Pmsg0(0, _("Error writing block to device.\n")); goto bail_out; } else { Pmsg1(0, _("Wrote second record of %d bytes.\n"), rec->data_len); } memset(rec->data, 3, rec->data_len); - if (!write_record_to_block(block, rec)) { + if (!write_record_to_block(dcr, rec)) { Pmsg0(0, _("Error writing record to block.\n")); goto bail_out; } - if (!write_block_to_dev(dcr)) { + if (!dcr->write_block_to_dev()) { Pmsg0(0, _("Error writing block to device.\n")); goto bail_out; } else { @@ -853,13 +857,13 @@ static bool re_read_block_test() goto bail_out; } Pmsg0(0, _("Backspace record OK.\n")); - if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) { + if (!dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK)) { berrno be; Pmsg1(0, _("Read block failed! ERR=%s\n"), be.bstrerror(dev->dev_errno)); goto bail_out; } memset(rec->data, 0, rec->data_len); - if (!read_record_from_block(dcr, block, rec)) { + if (!read_record_from_block(dcr, rec)) { berrno be; Pmsg1(0, _("Read block failed! ERR=%s\n"), be.bstrerror(dev->dev_errno)); goto bail_out; @@ -963,11 +967,11 @@ static bool speed_test_bacula(fill_mode_t mode, uint64_t nb_gb, uint32_t nb) init_speed(); for ( ; written < nb_gb; ) { - if (!write_record_to_block(block, rec)) { + if (!write_record_to_block(dcr, rec)) { Pmsg0(0, _("\nError writing record to block.\n")); goto bail_out; } - if (!write_block_to_dev(dcr)) { + if (!dcr->write_block_to_dev()) { Pmsg0(0, _("\nError writing block to device.\n")); goto bail_out; } @@ -1111,7 +1115,13 @@ static bool write_two_files() int len, i, j; int *p; bool rc = false; /* bad return code */ + DEVICE *dev = dcr->dev; + /* + * Set big max_file_size so that write_record_to_block + * doesn't insert any additional EOF marks + */ + dev->max_file_size = 2 * num_recs * dev->max_block_size; Pmsg2(-1, _("\n=== Write, rewind, and re-read test ===\n\n" "I'm going to write %d records and an EOF\n" "then write %d records and an EOF, then rewind,\n" @@ -1135,11 +1145,11 @@ static bool write_two_files() for (j=0; jwrite_block_to_dev()) { Pmsg0(0, _("Error writing block to device.\n")); goto bail_out; } @@ -1151,11 +1161,11 @@ static bool write_two_files() for (j=0; jwrite_block_to_dev()) { Pmsg0(0, _("Error writing block to device.\n")); goto bail_out; } @@ -1212,7 +1222,7 @@ static bool write_read_test() /* Now read it back */ for (i=1; i<=2*num_recs; i++) { read_again: - if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) { + if (!dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK)) { berrno be; if (dev_state(dev, ST_EOF)) { Pmsg0(-1, _("Got EOF on tape.\n")); @@ -1224,7 +1234,7 @@ read_again: goto bail_out; } memset(rec->data, 0, rec->data_len); - if (!read_record_from_block(dcr, block, rec)) { + if (!read_record_from_block(dcr, rec)) { berrno be; Pmsg2(0, _("Read record failed. Block %d! ERR=%s\n"), i, be.bstrerror(dev->dev_errno)); goto bail_out; @@ -1331,7 +1341,7 @@ static bool position_test() goto bail_out; } read_again: - if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) { + if (!dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK)) { berrno be; if (dev_state(dev, ST_EOF)) { Pmsg0(-1, _("Got EOF on tape.\n")); @@ -1356,7 +1366,7 @@ read_again: goto bail_out; } memset(rec->data, 0, rec->data_len); - if (!read_record_from_block(dcr, block, rec)) { + if (!read_record_from_block(dcr, rec)) { berrno be; Pmsg1(0, _("Read record failed! ERR=%s\n"), be.bstrerror(dev->dev_errno)); goto bail_out; @@ -1866,7 +1876,7 @@ static void fsrcmd() static void rbcmd() { dev->open(dcr, OPEN_READ_ONLY); - read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK); + dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK); } /* @@ -1881,7 +1891,7 @@ static void wrcmd() if (!dev->is_open()) { open_the_device(); } - sm_check(__FILE__, __LINE__, false); + Dsm_check(200); empty_block(block); if (verbose > 1) { dump_block(block, "test"); @@ -1892,12 +1902,12 @@ static void wrcmd() rec->data = check_pool_memory_size(rec->data, i); memset(rec->data, i & 0xFF, i); rec->data_len = i; - sm_check(__FILE__, __LINE__, false); - if (!write_record_to_block(block, rec)) { + Dsm_check(200); + if (!write_record_to_block(dcr, rec)) { Pmsg0(0, _("Error writing record to block.\n")); goto bail_out; } - if (!write_block_to_dev(dcr)) { + if (!dcr->write_block_to_dev()) { Pmsg0(0, _("Error writing block to device.\n")); goto bail_out; } else { @@ -1906,8 +1916,7 @@ static void wrcmd() Pmsg0(0, _("Wrote block to device.\n")); bail_out: - sm_check(__FILE__, __LINE__, false); - sm_check(__FILE__, __LINE__, false); + Dsm_check(200); } /* @@ -2043,7 +2052,7 @@ static void scan_blocks() dev->update_pos(dcr); tot_files = dev->file; for (;;) { - if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) { + if (!dcr->read_block_from_device(NO_BLOCK_NUMBER_CHECK)) { Dmsg1(100, "!read_block(): ERR=%s\n", dev->bstrerror()); if (dev->state & ST_EOT) { if (blocks > 0) { @@ -2106,7 +2115,7 @@ static void scan_blocks() block->VolSessionId, block->VolSessionTime); if (verbose == 1) { DEV_RECORD *rec = new_record(); - read_record_from_block(dcr, block, rec); + read_record_from_block(dcr, rec); Pmsg9(-1, _("Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n"), block->BlockNumber, dev->file, dev->block_num, block->block_len, FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, rec->VolSessionTime, @@ -2211,7 +2220,7 @@ static void fillcmd() */ Dmsg0(100, "just before acquire_device\n"); if (!acquire_device_for_append(dcr)) { - set_jcr_job_status(jcr, JS_ErrorTerminated); + jcr->setJobStatus(JS_ErrorTerminated); exit_code = 1; return; } @@ -2222,7 +2231,7 @@ static void fillcmd() * Write Begin Session Record */ if (!write_session_label(dcr, SOS_LABEL)) { - set_jcr_job_status(jcr, JS_ErrorTerminated); + jcr->setJobStatus(JS_ErrorTerminated); Jmsg1(jcr, M_FATAL, 0, _("Write session label failed. ERR=%s\n"), dev->bstrerror()); ok = false; @@ -2255,6 +2264,7 @@ static void fillcmd() rec.VolSessionTime = jcr->VolSessionTime; rec.FileIndex = ++file_index; rec.Stream = STREAM_FILE_DATA; + rec.maskedStream = STREAM_FILE_DATA; /* Mix up the data just a bit */ mix_buffer(FILL_RANDOM, rec.data, rec.data_len); @@ -2264,7 +2274,7 @@ static void fillcmd() stream_to_ascii(buf1, rec.Stream, rec.FileIndex), rec.data_len); - while (!write_record_to_block(block, &rec)) { + while (!write_record_to_block(dcr, &rec)) { /* * When we get here we have just filled a block */ @@ -2334,10 +2344,10 @@ static void fillcmd() Dmsg0(100, "Write_end_session_label()\n"); /* Create Job status for end of session label */ if (!job_canceled(jcr) && ok) { - set_jcr_job_status(jcr, JS_Terminated); + jcr->setJobStatus(JS_Terminated); } else if (!ok) { Pmsg0(000, _("Job canceled.\n")); - set_jcr_job_status(jcr, JS_ErrorTerminated); + jcr->setJobStatus(JS_ErrorTerminated); exit_code = 1; } if (!write_session_label(dcr, EOS_LABEL)) { @@ -2346,7 +2356,7 @@ static void fillcmd() exit_code = 1; } /* Write out final block of this session */ - if (!write_block_to_device(dcr)) { + if (!dcr->write_block_to_device()) { Pmsg0(-1, _("Set ok=false after write_block_to_device.\n")); ok = false; exit_code = 1; @@ -2544,13 +2554,14 @@ static bool do_unfill() goto bail_out; } Pmsg1(-1, _("Reading block %u.\n"), last_block_num); - if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) { + if (!dcr->read_block_from_device(NO_BLOCK_NUMBER_CHECK)) { Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror()); goto bail_out; } if (compare_blocks(last_block, block)) { if (simple) { Pmsg0(-1, _("\nThe last block on the tape matches. Test succeeded.\n\n")); + rc = true; } else { Pmsg0(-1, _("\nThe last block of the first tape matches.\n\n")); } @@ -2595,7 +2606,7 @@ static bool do_unfill() goto bail_out; } Pmsg1(-1, _("Reading block %d.\n"), dev->block_num); - if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) { + if (!dcr->read_block_from_device(NO_BLOCK_NUMBER_CHECK)) { Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror()); goto bail_out; } @@ -2611,7 +2622,7 @@ static bool do_unfill() goto bail_out; } Pmsg1(-1, _("Reading block %d.\n"), dev->block_num); - if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) { + if (!dcr->read_block_from_device(NO_BLOCK_NUMBER_CHECK)) { Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror()); goto bail_out; } @@ -2641,7 +2652,10 @@ static bool quickie_cb(DCR *dcr, DEV_RECORD *rec) static bool compare_blocks(DEV_BLOCK *last_block, DEV_BLOCK *block) { char *p, *q; - uint32_t CheckSum, block_len; + union { + uint32_t CheckSum; + uint32_t block_len; + }; ser_declare; p = last_block->buf; @@ -2695,7 +2709,7 @@ static int flush_block(DEV_BLOCK *block, int dump) /* Copy block */ this_file = dev->file; this_block_num = dev->block_num; - if (!write_block_to_dev(dcr)) { + if (!dcr->write_block_to_dev()) { Pmsg3(000, _("Last block at: %u:%u this_dev_block_num=%d\n"), last_file, last_block_num, this_block_num); if (vol_num == 1) { @@ -2789,7 +2803,7 @@ static void qfillcmd() count = 1000; } - sm_check(__FILE__, __LINE__, false); + Dsm_check(200); i = block->buf_len - 100; ASSERT (i > 0); @@ -2805,11 +2819,11 @@ static void qfillcmd() printf("+"); fflush(stdout); } - if (!write_record_to_block(block, rec)) { + if (!write_record_to_block(dcr, rec)) { Pmsg0(0, _("Error writing record to block.\n")); goto bail_out; } - if (!write_block_to_dev(dcr)) { + if (!dcr->write_block_to_dev()) { Pmsg0(0, _("Error writing block to device.\n")); goto bail_out; } @@ -2824,7 +2838,7 @@ static void qfillcmd() scan_blocks(); bail_out: - sm_check(__FILE__, __LINE__, false); + Dsm_check(200); } /* @@ -2912,7 +2926,7 @@ do_tape_cmds() bool found; while (!quit && get_cmd("*")) { - sm_check(__FILE__, __LINE__, false); + Dsm_check(200); found = false; parse_args(cmd, &args, &argc, argk, argv, MAX_CMD_ARGS); for (i=0; iVolCatInfo.VolCatName, dcr->VolumeName, sizeof(dcr->VolCatInfo.VolCatName)); + dcr->setVolCatName(dcr->VolumeName); return 1; } @@ -3116,8 +3130,8 @@ static void set_volume_name(const char *VolName, int volnum) DCR *dcr = jcr->dcr; VolumeName = VolName; vol_num = volnum; - bstrncpy(dev->VolCatInfo.VolCatName, VolName, sizeof(dev->VolCatInfo.VolCatName)); - bstrncpy(dcr->VolCatInfo.VolCatName, VolName, sizeof(dcr->VolCatInfo.VolCatName)); + dev->setVolCatName(VolName); + dcr->setVolCatName(VolName); bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName)); dcr->VolCatInfo.Slot = volnum; dcr->VolCatInfo.InChanger = true;