/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2010 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.
* 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;
/* Continue unlocked, but leave BLOCKED */
dev->dunlock();
- bstrncpy(PrevVolName, dev->VolCatInfo.VolCatName, sizeof(PrevVolName));
+ bstrncpy(PrevVolName, dev->getVolCatName(), sizeof(PrevVolName));
bstrncpy(dev->VolHdr.PrevVolumeName, PrevVolName, sizeof(dev->VolHdr.PrevVolumeName));
label_blk = new_block(dev);
/*
* Walk through all attached jcrs indicating the volume has changed
*/
- Dmsg1(100, "Notify vol change. Volume=%s\n", dev->VolCatInfo.VolCatName);
+ Dmsg1(100, "Notify vol change. Volume=%s\n", dev->getVolCatName());
DCR *mdcr;
foreach_dlist(mdcr, dev->attached_dcrs) {
JCR *mjcr = mdcr->jcr;
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;