--- /dev/null
+
+ This patch fixes a migration bug that always has a zero index entry
+ (JobMedia record) as the first entry. This causes Bacula to search
+ for the first record during a restore rather than seek directly to
+ it.
+
+ Apply this patch to Bacula 2.2.8 (and possibly any prior 2.2.x version) with:
+
+ cd <bacula-source>
+ patch -p0 <2.2.8-jobmedia.patch
+ ./configure <your-options>
+ make
+ ...
+ make install
+
+
+Index: src/stored/device.c
+===================================================================
+--- src/stored/device.c (revision 6391)
++++ src/stored/device.c (working copy)
+@@ -1,7 +1,7 @@
+ /*
+ Bacula® - The Network Backup Solution
+
+- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
++ Copyright (C) 2000-2007 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.
+@@ -200,6 +200,19 @@
+ return ok; /* device locked */
+ }
+
++void set_start_vol_position(DCR *dcr)
++{
++ DEVICE *dev = dcr->dev;
++ /* Set new start position */
++ if (dev->is_tape()) {
++ dcr->StartBlock = dev->block_num;
++ dcr->StartFile = dev->file;
++ } else {
++ dcr->StartBlock = (uint32_t)dev->file_addr;
++ dcr->StartFile = (uint32_t)(dev->file_addr >> 32);
++ }
++}
++
+ /*
+ * We have a new Volume mounted, so reset the Volume parameters
+ * concerning this job. The global changes were made earlier
+@@ -208,24 +221,11 @@
+ void set_new_volume_parameters(DCR *dcr)
+ {
+ JCR *jcr = dcr->jcr;
+- DEVICE *dev = dcr->dev;
+ if (dcr->NewVol && !dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) {
+ Jmsg1(jcr, M_ERROR, 0, "%s", jcr->errmsg);
+ }
+- /* Set new start/end positions */
+- if (dev->is_tape()) {
+- dcr->StartBlock = dev->block_num;
+- dcr->StartFile = dev->file;
+- } else {
+- dcr->StartBlock = (uint32_t)dev->file_addr;
+- dcr->StartFile = (uint32_t)(dev->file_addr >> 32);
+- }
+- /* Reset indicies */
+- dcr->VolFirstIndex = 0;
+- dcr->VolLastIndex = 0;
++ set_new_file_parameters(dcr);
+ jcr->NumWriteVolumes++;
+- dcr->NewVol = false;
+- dcr->WroteVol = false;
+ }
+
+ /*
+@@ -235,16 +235,8 @@
+ */
+ void set_new_file_parameters(DCR *dcr)
+ {
+- DEVICE *dev = dcr->dev;
++ set_start_vol_position(dcr);
+
+- /* Set new start/end positions */
+- if (dev->is_tape()) {
+- dcr->StartBlock = dev->block_num;
+- dcr->StartFile = dev->file;
+- } else {
+- dcr->StartBlock = (uint32_t)dev->file_addr;
+- dcr->StartFile = (uint32_t)(dev->file_addr >> 32);
+- }
+ /* Reset indicies */
+ dcr->VolFirstIndex = 0;
+ dcr->VolLastIndex = 0;
+Index: src/stored/mac.c
+===================================================================
+--- src/stored/mac.c (revision 6391)
++++ src/stored/mac.c (working copy)
+@@ -1,15 +1,7 @@
+ /*
+- * SD -- mac.c -- responsible for doing
+- * migration, archive, and copy jobs.
+- *
+- * Kern Sibbald, January MMVI
+- *
+- * Version $Id$
+- */
+-/*
+ Bacula® - The Network Backup Solution
+
+- Copyright (C) 2006-2006 Free Software Foundation Europe e.V.
++ Copyright (C) 2006-2008 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.
+@@ -33,6 +25,14 @@
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+ */
++/*
++ * SD -- mac.c -- responsible for doing
++ * migration, archive, and copy jobs.
++ *
++ * Kern Sibbald, January MMVI
++ *
++ * Version $Id$
++ */
+
+ #include "bacula.h"
+ #include "stored.h"
+@@ -108,6 +108,7 @@
+
+ jcr->dcr->VolFirstIndex = jcr->dcr->VolLastIndex = 0;
+ jcr->run_time = time(NULL);
++ set_start_vol_position(jcr->dcr);
+
+ ok = read_records(jcr->read_dcr, record_cb, mount_next_read_volume);
+ goto ok_out;
+Index: src/stored/protos.h
+===================================================================
+--- src/stored/protos.h (revision 6391)
++++ src/stored/protos.h (working copy)
+@@ -126,6 +126,7 @@
+ bool open_device(DCR *dcr);
+ bool first_open_device(DCR *dcr);
+ bool fixup_device_block_write_error(DCR *dcr);
++void set_start_vol_position(DCR *dcr);
+ void set_new_volume_parameters(DCR *dcr);
+ void set_new_file_parameters(DCR *dcr);
+ bool is_device_unmounted(DEVICE *dev);
/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2007 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.
return ok; /* device locked */
}
+void set_start_vol_position(DCR *dcr)
+{
+ DEVICE *dev = dcr->dev;
+ /* Set new start position */
+ if (dev->is_tape()) {
+ dcr->StartBlock = dev->block_num;
+ dcr->StartFile = dev->file;
+ } else {
+ dcr->StartBlock = (uint32_t)dev->file_addr;
+ dcr->StartFile = (uint32_t)(dev->file_addr >> 32);
+ }
+}
+
/*
* We have a new Volume mounted, so reset the Volume parameters
* concerning this job. The global changes were made earlier
void set_new_volume_parameters(DCR *dcr)
{
JCR *jcr = dcr->jcr;
- DEVICE *dev = dcr->dev;
if (dcr->NewVol && !dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) {
Jmsg1(jcr, M_ERROR, 0, "%s", jcr->errmsg);
}
- /* Set new start/end positions */
- if (dev->is_tape()) {
- dcr->StartBlock = dev->block_num;
- dcr->StartFile = dev->file;
- } else {
- dcr->StartBlock = (uint32_t)dev->file_addr;
- dcr->StartFile = (uint32_t)(dev->file_addr >> 32);
- }
- /* Reset indicies */
- dcr->VolFirstIndex = 0;
- dcr->VolLastIndex = 0;
+ set_new_file_parameters(dcr);
jcr->NumWriteVolumes++;
- dcr->NewVol = false;
- dcr->WroteVol = false;
}
/*
*/
void set_new_file_parameters(DCR *dcr)
{
- DEVICE *dev = dcr->dev;
+ set_start_vol_position(dcr);
- /* Set new start/end positions */
- if (dev->is_tape()) {
- dcr->StartBlock = dev->block_num;
- dcr->StartFile = dev->file;
- } else {
- dcr->StartBlock = (uint32_t)dev->file_addr;
- dcr->StartFile = (uint32_t)(dev->file_addr >> 32);
- }
/* Reset indicies */
dcr->VolFirstIndex = 0;
dcr->VolLastIndex = 0;
-/*
- * SD -- mac.c -- responsible for doing
- * migration, archive, and copy jobs.
- *
- * Kern Sibbald, January MMVI
- *
- * Version $Id$
- */
/*
Bacula® - The Network Backup Solution
- Copyright (C) 2006-2006 Free Software Foundation Europe e.V.
+ Copyright (C) 2006-2008 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.
(FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
Switzerland, email:ftf@fsfeurope.org.
*/
+/*
+ * SD -- mac.c -- responsible for doing
+ * migration, archive, and copy jobs.
+ *
+ * Kern Sibbald, January MMVI
+ *
+ * Version $Id$
+ */
#include "bacula.h"
#include "stored.h"
jcr->dcr->VolFirstIndex = jcr->dcr->VolLastIndex = 0;
jcr->run_time = time(NULL);
+ set_start_vol_position(jcr->dcr);
ok = read_records(jcr->read_dcr, record_cb, mount_next_read_volume);
goto ok_out;