From 318981d26231a796a1a9b3721681f3c8c64ce4b3 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Sun, 11 Oct 2009 18:17:19 +0200 Subject: [PATCH] Recursively call fix_device_block_write_error on error --- bacula/src/stored/device.c | 12 +++++++++--- bacula/src/stored/protos.h | 2 +- bacula/technotes | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) 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 -- 2.39.5