From: Kern Sibbald Date: Sun, 11 Oct 2009 16:17:19 +0000 (+0200) Subject: Recursively call fix_device_block_write_error on error X-Git-Tag: Release-3.0.3~31 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=318981d26231a796a1a9b3721681f3c8c64ce4b3;p=bacula%2Fbacula Recursively call fix_device_block_write_error on error --- diff --git a/bacula/src/stored/device.c b/bacula/src/stored/device.c index 594c5005c4..1e5a2e01ff 100644 --- a/bacula/src/stored/device.c +++ b/bacula/src/stored/device.c @@ -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; diff --git a/bacula/src/stored/protos.h b/bacula/src/stored/protos.h index db34f428e0..526d59fa1c 100644 --- a/bacula/src/stored/protos.h +++ b/bacula/src/stored/protos.h @@ -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); diff --git a/bacula/technotes b/bacula/technotes index e9c7a327b9..b38498f754 100644 --- a/bacula/technotes +++ b/bacula/technotes @@ -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 05Oct09