]> git.sur5r.net Git - bacula/bacula/commitdiff
Recursively call fix_device_block_write_error on error
authorKern Sibbald <kern@sibbald.com>
Sun, 11 Oct 2009 16:17:19 +0000 (18:17 +0200)
committerKern Sibbald <kern@sibbald.com>
Sun, 11 Oct 2009 16:17:19 +0000 (18:17 +0200)
bacula/src/stored/device.c
bacula/src/stored/protos.h
bacula/technotes

index 594c5005c4f0e18210b83354fd77707f79c2082e..1e5a2e01ff22e14223d1f53cfccfb5b4d026b7e7 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2009 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.
@@ -82,7 +82,7 @@
  *  Returns: true  on success
  *           false on failure
  */
-bool fixup_device_block_write_error(DCR *dcr)
+bool fixup_device_block_write_error(DCR *dcr, int retries)
 {
    char PrevVolName[MAX_NAME_LENGTH];
    DEV_BLOCK *label_blk;
@@ -185,7 +185,13 @@ bool fixup_device_block_write_error(DCR *dcr)
       berrno be;
       Dmsg1(0, _("write_block_to_device overflow block failed. ERR=%s"),
         be.bstrerror(dev->dev_errno));
-      goto bail_out;
+      /* Note: recursive call */
+      if (retries-- <= 0 || !fixup_device_block_write_error(dcr, retries)) {
+         Jmsg2(jcr, M_FATAL, 0, 
+              _("Catastrophic error. Cannot write overflow block to device %s. ERR=%s"),
+              dev->print_name(), be.bstrerror(dev->dev_errno));
+         goto bail_out;
+      }
    }
    ok = true;
 
index db34f428e0c27c1ffaa0f745801d32719d8b670b..526d59fa1c6b7b1fe791cf54d4bff4c4899f7ef4 100644 (file)
@@ -127,7 +127,7 @@ void    dvd_remove_empty_part(DCR *dcr);
 /* From device.c */
 bool     open_device(DCR *dcr);
 bool     first_open_device(DCR *dcr);
-bool     fixup_device_block_write_error(DCR *dcr);
+bool     fixup_device_block_write_error(DCR *dcr, int retries=4);
 void     set_start_vol_position(DCR *dcr);
 void     set_new_volume_parameters(DCR *dcr);
 void     set_new_file_parameters(DCR *dcr);
index e9c7a327b9a0f39f7c3c3314eddeeaf49cec5b79..b38498f754e61614b8544afd0237372194962c30 100644 (file)
@@ -5,6 +5,8 @@ General:
 Release Version 3.0.3:
 =======
 11Oct09
+kes  Apply Graham's idea for recovering from disk full by recursing
+     when doing fixup_write_error ...
 kes  Make fix for VirtualFull changing device based on suggestion by
      Nicolae Mihalache <mache@abcpages.com>
 05Oct09