]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Rework code in acquire.c that switches drives for reading when
authorKern Sibbald <kern@sibbald.com>
Sun, 29 Jul 2007 12:50:33 +0000 (12:50 +0000)
committerKern Sibbald <kern@sibbald.com>
Sun, 29 Jul 2007 12:50:33 +0000 (12:50 +0000)
     the Media Type does not match. This should fix bug #906

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@5263 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/stored/acquire.c
bacula/src/stored/reserve.c
bacula/src/version.h
bacula/technotes-2.1

index 6ff42474fb4fc107233ead7a7e4296a528ff83e8..51827a3351937c69ee0a414f01541801363d7c68 100644 (file)
@@ -103,13 +103,15 @@ bool acquire_device_for_read(DCR *dcr)
       RCTX rctx;
       DIRSTORE *store;
       int stat;
-      DCR *dcr_save = jcr->dcr;
 
       Jmsg3(jcr, M_INFO, 0, _("Changing device. Want Media Type=\"%s\" have=\"%s\"\n"
                               "  device=%s\n"), 
             dcr->media_type, dev->device->media_type, dev->print_name());
+
+      dev->dunblock(DEV_UNLOCKED);
+      detach_dcr_from_dev(dcr);    /* release old device */
+
       lock_reservations();
-      jcr->dcr = NULL;
       memset(&rctx, 0, sizeof(RCTX));
       rctx.jcr = jcr;
       jcr->reserve_msgs = New(alist(10, not_owned_by_alist));
@@ -132,17 +134,7 @@ bool acquire_device_for_read(DCR *dcr)
       release_reserve_messages(jcr);         /* release queued messages */
       unlock_reservations();
       if (stat == 1) {
-         DCR *ndcr = jcr->read_dcr;
-         dev->dunblock(DEV_UNLOCKED);
-         detach_dcr_from_dev(dcr);    /* release old device */
-         /* Copy important info from the new dcr */
-         dev = dcr->dev = ndcr->dev; 
-         jcr->read_dcr = dcr; 
-         dcr->device = ndcr->device;
-         dcr->max_job_spool_size = dcr->device->max_job_spool_size;
-         attach_dcr_to_dev(dcr);
-         ndcr->VolumeName[0] = 0;
-         free_dcr(ndcr);
+         dcr->VolumeName[0] = 0;
          dev->dblock(BST_DOING_ACQUIRE); 
          Jmsg(jcr, M_INFO, 0, _("Media Type change.  New device %s chosen.\n"),
             dev->print_name());
@@ -157,10 +149,8 @@ bool acquire_device_for_read(DCR *dcr)
          /* error */
          Jmsg1(jcr, M_FATAL, 0, _("No suitable device found to read Volume \"%s\"\n"),
             vol->VolumeName);
-         jcr->dcr = dcr_save;
          goto get_out;
       }
-      jcr->dcr = dcr_save;
    }
 
 
@@ -620,6 +610,9 @@ DCR *new_dcr(JCR *jcr, DCR *dcr, DEVICE *dev)
  * Search the dcrs list for the given dcr. If it is found,
  *  as it should be, then remove it. Also zap the jcr pointer
  *  to the dcr if it is the same one.
+ *
+ * Note, this code will be turned on when we can write to multiple
+ *  dcrs at the same time.
  */
 #ifdef needed
 static void remove_dcr_from_dcrs(DCR *dcr)
@@ -657,14 +650,17 @@ static void attach_dcr_to_dev(DCR *dcr)
 
 void detach_dcr_from_dev(DCR *dcr)
 {
+   DEVICE *dev = dcr->dev;
    Dmsg1(500, "JobId=%u enter detach_dcr_from_dev\n", (uint32_t)dcr->jcr->JobId);
 
    /* Detach this dcr only if attached */
-   if (dcr->attached_to_dev && dcr->dev) {
+   if (dcr->attached_to_dev && dev) {
+      dev->dlock();
       unreserve_device(dcr);
       dcr->dev->attached_dcrs->remove(dcr);  /* detach dcr from device */
       dcr->attached_to_dev = false;
 //    remove_dcr_from_dcrs(dcr);      /* remove dcr from jcr list */
+      dev->dunlock();
    }
 }
 
index 797a85c263ca3114b0f166e8c8325589a1d020dd..9f140ab0fdb50e9061e33e0dd0b04cf1deb63317 100644 (file)
@@ -416,7 +416,6 @@ VOLRES *find_volume(DCR *dcr)
 void unreserve_device(DCR *dcr)
 {
    DEVICE *dev = dcr->dev;
-   dev->dlock();
    if (dcr->reserved_device) {
       dcr->reserved_device = false;
       dev->reserved_device--;
@@ -433,7 +432,6 @@ void unreserve_device(DCR *dcr)
    }
 
    volume_unused(dcr);
-   dev->dunlock();
 }
 
 /*  
index 6c8607883408b33c9ba7dfc6d26c17c2ff30991d..ab8365e80016c62bd44ab8ff6e13919dd010a8d5 100644 (file)
@@ -4,8 +4,8 @@
 
 #undef  VERSION
 #define VERSION "2.1.29"
-#define BDATE   "28 July 2007"
-#define LSMDATE "28Jul07"
+#define BDATE   "29 July 2007"
+#define LSMDATE "29Jul07"
 
 #define PROG_COPYRIGHT "Copyright (C) %d-2007 Free Software Foundation Europe e.V.\n"
 #define BYEAR "2007"       /* year for copyright messages in progs */
index 84fa959895acd45aabea404421abc6cc6e87c6be..c951df563d2a4c472b0e9b5d7c496ba928c3ebff 100644 (file)
@@ -1,7 +1,10 @@
               Technical notes on version 2.1
 
 General:
-28Jui07
+29Jul07
+kes  Rework code in acquire.c that switches drives for reading when
+     the Media Type does not match. This should fix bug #906
+28Jul07
 ebl  Fix a director segfault during job setup #907
 kes  Correct seg fault in postgresql when first operation returns no
      rows.  Fixes Dirks File browser problem seg fault with bat.