]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/1.36.0/1.36.0-autochanger2.patch
ebl Add patch to cleanup orphaned jobs during startup
[bacula/bacula] / bacula / patches / 1.36.0 / 1.36.0-autochanger2.patch
1
2  This patch fixes an autochanger problem where Bacula was trying
3  to access a Volume that was not in the autochanger. You *must*
4  also apply patch 1.36.0-autochanger.patch for this patch to work
5  correctly. This patch will probably also correct some problems 
6  introduced with version 1.36 (dcrs) that make update slots
7  fail.
8
9  Apply it to 1.36.0 with:
10
11  cd <bacula-source>
12  patch -p0 <1.36.0-autochanger2.patch
13  make
14  make install
15  ...
16
17 Index: src/stored/dircmd.c
18 ===================================================================
19 RCS file: /cvsroot/bacula/bacula/src/stored/dircmd.c,v
20 retrieving revision 1.79
21 diff -u -r1.79 dircmd.c
22 --- src/stored/dircmd.c 21 Nov 2004 13:10:16 -0000      1.79
23 +++ src/stored/dircmd.c 24 Nov 2004 11:46:45 -0000
24 @@ -78,6 +78,7 @@
25  static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *oldname,
26                                char *newname, char *poolname, 
27                                int Slot, int relabel);
28 +static bool try_autoload_device(JCR *jcr, int slot, const char *VolName);
29  
30  struct s_cmds {
31     const char *cmd;
32 @@ -373,21 +374,11 @@
33     DCR *dcr = jcr->dcr;
34     int label_status;
35     
36 +   dcr->dev = dev;
37     steal_device_lock(dev, &hold, BST_WRITING_LABEL);
38     
39 -   bstrncpy(dcr->VolumeName, newname, sizeof(dcr->VolumeName));
40 -   dcr->VolCatInfo.Slot = slot;
41 -   if (autoload_device(dcr, 0, dir) < 0) {    /* autoload if possible */
42 -      goto bail_out;
43 -   }
44 -
45 -   /* Ensure that the device is open -- autoload_device() closes it */
46 -   for ( ; !(dev->state & ST_OPENED); ) {
47 -      if (open_dev(dev, dcr->VolumeName, OPEN_READ_WRITE) < 0) {
48 -         bnet_fsend(dir, _("3910 Unable to open device %s. ERR=%s\n"), 
49 -           dev_name(dev), strerror_dev(dev));
50 -        goto bail_out;
51 -      }
52 +   if (!try_autoload_device(jcr, slot, newname)) {
53 +      goto bail_out;                 /* error */
54     }
55  
56     /* See what we have for a Volume */
57 @@ -845,22 +836,12 @@
58     BSOCK *dir = jcr->dir_bsock;
59     bsteal_lock_t hold;
60     DCR *dcr = jcr->dcr;
61 -   
62 +
63 +   dcr->dev = dev;
64     steal_device_lock(dev, &hold, BST_WRITING_LABEL);
65     
66 -   dcr->VolumeName[0] = 0;
67 -   dcr->VolCatInfo.Slot = Slot;
68 -   if (autoload_device(dcr, 0, dir) < 0) {    /* autoload if possible */
69 -      goto bail_out;
70 -   }
71 -
72 -   /* Ensure that the device is open -- autoload_device() closes it */
73 -   for ( ; !dev_state(dev, ST_OPENED); ) {
74 -      if (open_dev(dev, dcr->VolumeName, OPEN_READ_WRITE) < 0) {
75 -         bnet_fsend(dir, _("3910 Unable to open device \"%s\". ERR=%s\n"), 
76 -           dev_name(dev), strerror_dev(dev));
77 -        goto bail_out;
78 -      }
79 +   if (!try_autoload_device(jcr, Slot, "")) {
80 +      goto bail_out;                 /* error */
81     }
82  
83     dev->state &= ~ST_LABEL;          /* force read of label */
84 @@ -880,3 +861,27 @@
85     give_back_device_lock(dev, &hold);
86     return;
87  }
88 +
89 +static bool try_autoload_device(JCR *jcr, int slot, const char *VolName)
90 +{
91 +   DCR *dcr = jcr->dcr;
92 +   BSOCK *dir = jcr->dir_bsock;
93 +   DEVICE *dev = dcr->dev;
94 +
95 +   bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
96 +   dcr->VolCatInfo.Slot = slot;
97 +   dcr->VolCatInfo.InChanger = slot > 0;
98 +   if (autoload_device(dcr, 0, dir) < 0) {    /* autoload if possible */
99 +      return false; 
100 +   }
101 +
102 +   /* Ensure that the device is open -- autoload_device() closes it */
103 +   for ( ; !(dev->state & ST_OPENED); ) {
104 +      if (open_dev(dev, dcr->VolumeName, OPEN_READ_WRITE) < 0) {
105 +         bnet_fsend(dir, _("3910 Unable to open device %s. ERR=%s\n"), 
106 +           dev_name(dev), strerror_dev(dev));
107 +        return false;
108 +      }
109 +   }
110 +   return true;
111 +}