From 1e32b9b18aa40e516767aae2503fe3d8620ef286 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Sun, 11 Oct 2009 17:58:46 +0200 Subject: [PATCH] Recursively call fix_device_block_write_error on error --- bacula/src/stored/device.c | 15 +++++++++------ bacula/src/stored/protos.h | 2 +- bacula/technotes | 2 ++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/bacula/src/stored/device.c b/bacula/src/stored/device.c index 20a6c3a8a3..a3eb0c5d98 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,10 +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)); - 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; + /* 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 e18ca3aa32..fd51df7f72 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 f76aafa251..f484fe1432 100644 --- a/bacula/technotes +++ b/bacula/technotes @@ -3,6 +3,8 @@ General: 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 08Oct09 -- 2.39.5