]> git.sur5r.net Git - bacula/bacula/commitdiff
Implement BlockChecksum in Device
authorKern Sibbald <kern@sibbald.com>
Fri, 4 Sep 2009 13:46:33 +0000 (15:46 +0200)
committerKern Sibbald <kern@sibbald.com>
Fri, 4 Sep 2009 13:46:33 +0000 (15:46 +0200)
bacula/src/stored/block.c
bacula/src/stored/dev.h
bacula/src/stored/stored_conf.c
bacula/src/version.h
bacula/technotes

index abb53c25c37489e26826ef2cfc79330325a9f9e5..7899621399baae42242e1b392e32105c8688d650 100644 (file)
@@ -189,7 +189,7 @@ void empty_block(DEV_BLOCK *block)
  * in the buffer should have already been reserved by
  * init_block.
  */
-void ser_block_header(DEV_BLOCK *block)
+static void ser_block_header(DEV_BLOCK *block, bool do_checksum)
 {
    ser_declare;
    uint32_t CheckSum = 0;
@@ -207,8 +207,10 @@ void ser_block_header(DEV_BLOCK *block)
    }
 
    /* Checksum whole block except for the checksum */
-   CheckSum = bcrc32((uint8_t *)block->buf+BLKHDR_CS_LENGTH,
-                 block_len-BLKHDR_CS_LENGTH);
+   if (do_checksum) {
+      CheckSum = bcrc32((uint8_t *)block->buf+BLKHDR_CS_LENGTH,
+                    block_len-BLKHDR_CS_LENGTH);
+   }
    Dmsg1(1390, "ser_bloc_header: checksum=%x\n", CheckSum);
    ser_begin(block->buf, BLKHDR2_LENGTH);
    ser_uint32(CheckSum);              /* now add checksum to block header */
@@ -307,7 +309,7 @@ static bool unser_block_header(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
    block->BlockNumber = BlockNumber;
    Dmsg3(390, "Read binbuf = %d %d block_len=%d\n", block->binbuf,
       bhl, block_len);
-   if (block_len <= block->read_len) {
+   if (block_len <= block->read_len && dev->do_checksum()) {
       BlockCheckSum = bcrc32((uint8_t *)block->buf+BLKHDR_CS_LENGTH,
                          block_len-BLKHDR_CS_LENGTH);
       if (BlockCheckSum != CheckSum) {
@@ -466,7 +468,7 @@ bool write_block_to_dev(DCR *dcr)
       }
    }
 
-   ser_block_header(block);
+   ser_block_header(block, dev->do_checksum());
 
    /* Limit maximum Volume size to value specified by user */
    hit_max1 = (dev->max_volume_size > 0) &&
index 22734bb8052d8e80aada2fc22cc1d5ca1342278d..f77c18f0d325faee31d562a31a83b438675ca9c4 100644 (file)
@@ -136,6 +136,7 @@ enum {
 #define CAP_MTIOCGET       (1<<20)    /* Basic support for fileno and blkno */
 #define CAP_REQMOUNT       (1<<21)    /* Require mount to read files back (typically: DVD) */
 #define CAP_CHECKLABELS    (1<<22)    /* Check for ANSI/IBM labels */
+#define CAP_BLOCKCHECKSUM  (1<<23)    /* Create/test block checksum */
 
 /* Test state */
 #define dev_state(dev, st_state) ((dev)->state & (st_state))
@@ -307,6 +308,7 @@ public:
    int has_cap(int cap) const { return capabilities & cap; }
    void clear_cap(int cap) { capabilities &= ~cap; }
    void set_cap(int cap) { capabilities |= cap; }
+   bool do_checksum() const { return (capabilities & CAP_BLOCKCHECKSUM) != 0; }
    int is_autochanger() const { return capabilities & CAP_AUTOCHANGER; }
    int requires_mount() const { return capabilities & CAP_REQMOUNT; }
    int is_removable() const { return capabilities & CAP_REM; }
index 19bfec3720c47f68fdcb8a881c4b432766fca315..a2080234a84587c4f112ac9f9303f7fbd98a03ab 100644 (file)
@@ -29,8 +29,6 @@
  * Configuration file parser for Bacula Storage daemon
  *
  *     Kern Sibbald, March MM
- *
- *   Version $Id$
  */
 
 #include "bacula.h"
@@ -142,6 +140,7 @@ static RES_ITEM dev_items[] = {
    {"checklabels",           store_bit,  ITEM(res_dev.cap_bits), CAP_CHECKLABELS, ITEM_DEFAULT, 0},
    {"requiresmount",         store_bit,  ITEM(res_dev.cap_bits), CAP_REQMOUNT, ITEM_DEFAULT, 0},
    {"offlineonunmount",      store_bit,  ITEM(res_dev.cap_bits), CAP_OFFLINEUNMOUNT, ITEM_DEFAULT, 0},
+   {"blockchecksum",         store_bit,  ITEM(res_dev.cap_bits), CAP_BLOCKCHECKSUM, ITEM_DEFAULT, 1},
    {"autoselect",            store_bool, ITEM(res_dev.autoselect), 1, ITEM_DEFAULT, 1},
    {"changerdevice",         store_strname,ITEM(res_dev.changer_name), 0, 0, 0},
    {"changercommand",        store_strname,ITEM(res_dev.changer_command), 0, 0, 0},
index 2dcac1e48ccb882bf09ce184df3fb24649c9b7df..faa1016baa5d7b9ae1d97485c2da99a1b2c627a5 100644 (file)
@@ -4,8 +4,8 @@
 
 #undef  VERSION
 #define VERSION "3.0.3"
-#define BDATE   "28 August 2009"
-#define LSMDATE "28Aug09"
+#define BDATE   "04 September 2009"
+#define LSMDATE "04Sep09"
 
 #define PROG_COPYRIGHT "Copyright (C) %d-2009 Free Software Foundation Europe e.V.\n"
 #define BYEAR "2009"       /* year for copyright messages in progs */
index fc0fe514cc678d5df878109951dcd5e0c747a647..bd61638160f4956545d22295a7c683f563a66f2c 100644 (file)
@@ -2,6 +2,9 @@
           
 General:
 
+04Sep09
+kes  Implement BlockChecksum in Device to be able to turn off checksum
+       for performance reasons
 03Sep09
 ebl  Use MaxFileSize device configuration in btape
 ebl  Make less tweaks in random buffer in btape