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
9 Apply it to 1.36.0 with:
12 patch -p0 <1.36.0-autochanger2.patch
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
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);
37 steal_device_lock(dev, &hold, BST_WRITING_LABEL);
39 - bstrncpy(dcr->VolumeName, newname, sizeof(dcr->VolumeName));
40 - dcr->VolCatInfo.Slot = slot;
41 - if (autoload_device(dcr, 0, dir) < 0) { /* autoload if possible */
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));
52 + if (!try_autoload_device(jcr, slot, newname)) {
53 + goto bail_out; /* error */
56 /* See what we have for a Volume */
58 BSOCK *dir = jcr->dir_bsock;
64 steal_device_lock(dev, &hold, BST_WRITING_LABEL);
66 - dcr->VolumeName[0] = 0;
67 - dcr->VolCatInfo.Slot = Slot;
68 - if (autoload_device(dcr, 0, dir) < 0) { /* autoload if possible */
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));
79 + if (!try_autoload_device(jcr, Slot, "")) {
80 + goto bail_out; /* error */
83 dev->state &= ~ST_LABEL; /* force read of label */
85 give_back_device_lock(dev, &hold);
89 +static bool try_autoload_device(JCR *jcr, int slot, const char *VolName)
91 + DCR *dcr = jcr->dcr;
92 + BSOCK *dir = jcr->dir_bsock;
93 + DEVICE *dev = dcr->dev;
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 */
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));