--- /dev/null
+
+ This patch corrects a problem when removing a volume from
+ an autochanger and the slot is still empty when running
+ update slots command. #1175
+
+ Apply it to version 2.4.3 with:
+
+ cd <bacula-source>
+ patch -p0 <2.4.3-update-slots.patch
+ ./configure <your-options>
+ make
+ ...
+ make install
+
+Index: src/cats/sql_update.c
+===================================================================
+--- src/cats/sql_update.c (revision 7854)
++++ src/cats/sql_update.c (working copy)
+@@ -445,14 +445,28 @@
+ db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
+ {
+ char ed1[50], ed2[50];
+- if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0 &&
+- mr->MediaId != 0) {
+- Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
+- "Slot=%d AND StorageId=%s AND MediaId!=%s",
+- mr->Slot,
+- edit_int64(mr->StorageId, ed1), edit_int64(mr->MediaId, ed2));
+- Dmsg1(400, "%s\n", mdb->cmd);
+- UPDATE_DB(jcr, mdb, mdb->cmd);
++ if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0) {
++
++ if (mr->MediaId != 0) {
++ Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
++ "Slot=%d AND StorageId=%s AND MediaId!=%s",
++ mr->Slot,
++ edit_int64(mr->StorageId, ed1), edit_int64(mr->MediaId, ed2));
++
++ } else if (*mr->VolumeName) {
++ Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
++ "Slot=%d AND StorageId=%s AND VolumeName!='%s'",
++ mr->Slot,
++ edit_int64(mr->StorageId, ed1), mr->VolumeName);
++
++ } else { /* used by ua_label to reset all volume with this slot */
++ Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
++ "Slot=%d AND StorageId=%s",
++ mr->Slot,
++ edit_int64(mr->StorageId, ed1), mr->VolumeName);
++ }
++ Dmsg1(100, "%s\n", mdb->cmd);
++ UPDATE_DB(jcr, mdb, mdb->cmd);
+ }
+ }
+
+Index: src/cats/sql_create.c
+===================================================================
+--- src/cats/sql_create.c (revision 7854)
++++ src/cats/sql_create.c (working copy)
+@@ -459,14 +459,13 @@
+ "WHERE MediaId=%d", dt, mr->MediaId);
+ stat = UPDATE_DB(jcr, mdb, mdb->cmd);
+ }
++ /*
++ * Make sure that if InChanger is non-zero any other identical slot
++ * has InChanger zero.
++ */
++ db_make_inchanger_unique(jcr, mdb, mr);
+ }
+
+- /*
+- * Make sure that if InChanger is non-zero any other identical slot
+- * has InChanger zero.
+- */
+- db_make_inchanger_unique(jcr, mdb, mr);
+-
+ db_unlock(mdb);
+ return stat;
+ }
}
Dmsg1(050, "fnextvol=%s\n", mdb->cmd);
if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
+Index: src/dird/autoprune.c
+===================================================================
+--- src/dird/autoprune.c (revision 7854)
++++ src/dird/autoprune.c (working copy)
+@@ -204,13 +204,6 @@
+ memcpy(mr, &lmr, sizeof(lmr));
+ break; /* got a volume */
+ }
+- /*
+- * We purged something but did not get a volume in the current pool.
+- * It must be a scratch volume, so try to get it.
+- */
+- if (ok && get_scratch_volume(jcr, InChanger, mr)) {
+- break; /* got a volume */
+- }
+ ok = false; /* clear OK, in case we fall out */
+ } else {
+ Dmsg2(050, "Nothing pruned MediaId=%d Volume=%s\n", (int)lmr.MediaId, lmr.VolumeName);
+++ /dev/null
-
- This patch corrects a problem when removing a volume from
- an autochanger and the slot is still empty when running
- update slots command. #1175
-
- Apply it to version 2.4.3 with:
-
- cd <bacula-source>
- patch -p0 <2.4.3-update-slots.patch
- ./configure <your-options>
- make
- ...
- make install
-
-Index: src/cats/sql_update.c
-===================================================================
---- src/cats/sql_update.c (revision 7854)
-+++ src/cats/sql_update.c (working copy)
-@@ -445,14 +445,28 @@
- db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
- {
- char ed1[50], ed2[50];
-- if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0 &&
-- mr->MediaId != 0) {
-- Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
-- "Slot=%d AND StorageId=%s AND MediaId!=%s",
-- mr->Slot,
-- edit_int64(mr->StorageId, ed1), edit_int64(mr->MediaId, ed2));
-- Dmsg1(400, "%s\n", mdb->cmd);
-- UPDATE_DB(jcr, mdb, mdb->cmd);
-+ if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0) {
-+
-+ if (mr->MediaId != 0) {
-+ Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
-+ "Slot=%d AND StorageId=%s AND MediaId!=%s",
-+ mr->Slot,
-+ edit_int64(mr->StorageId, ed1), edit_int64(mr->MediaId, ed2));
-+
-+ } else if (*mr->VolumeName) {
-+ Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
-+ "Slot=%d AND StorageId=%s AND VolumeName!='%s'",
-+ mr->Slot,
-+ edit_int64(mr->StorageId, ed1), mr->VolumeName);
-+
-+ } else { /* used by ua_label to reset all volume with this slot */
-+ Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
-+ "Slot=%d AND StorageId=%s",
-+ mr->Slot,
-+ edit_int64(mr->StorageId, ed1), mr->VolumeName);
-+ }
-+ Dmsg1(100, "%s\n", mdb->cmd);
-+ UPDATE_DB(jcr, mdb, mdb->cmd);
- }
- }
-
-Index: src/cats/sql_create.c
-===================================================================
---- src/cats/sql_create.c (revision 7854)
-+++ src/cats/sql_create.c (working copy)
-@@ -459,14 +459,13 @@
- "WHERE MediaId=%d", dt, mr->MediaId);
- stat = UPDATE_DB(jcr, mdb, mdb->cmd);
- }
-+ /*
-+ * Make sure that if InChanger is non-zero any other identical slot
-+ * has InChanger zero.
-+ */
-+ db_make_inchanger_unique(jcr, mdb, mr);
- }
-
-- /*
-- * Make sure that if InChanger is non-zero any other identical slot
-- * has InChanger zero.
-- */
-- db_make_inchanger_unique(jcr, mdb, mr);
--
- db_unlock(mdb);
- return stat;
- }