]> git.sur5r.net Git - bacula/bacula/commitdiff
Get correct slot when auto unloading a device.
authorKern Sibbald <kern@sibbald.com>
Sat, 31 May 2008 07:09:35 +0000 (07:09 +0000)
committerKern Sibbald <kern@sibbald.com>
Sat, 31 May 2008 07:09:35 +0000 (07:09 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@7067 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/stored/autochanger.c
bacula/technotes-2.3

index e3afcf24d6dde9ff8ffb3afab455651e25af76ef..b6225613356fac309f7002752ebb99e71494c173 100644 (file)
@@ -258,6 +258,7 @@ int get_autochanger_loaded_slot(DCR *dcr)
    if (dev->get_slot() > 0) {
       return dev->get_slot();
    }
+
    /* Virtual disk autochanger */
    if (dcr->device->changer_command[0] == 0) {
       return 1;
@@ -434,6 +435,9 @@ static bool unload_other_drive(DCR *dcr, int slot)
    return unload_dev(dcr, dev);
 }
 
+/*
+ * Unconditionally unload a specified drive
+ */
 bool unload_dev(DCR *dcr, DEVICE *dev)
 {
    JCR *jcr = dcr->jcr;
@@ -443,9 +447,21 @@ bool unload_dev(DCR *dcr, DEVICE *dev)
    DEVICE *save_dev;
    int save_slot;
 
-   if (!changer || dev->get_slot() <= 0) {
+   if (!changer) {
       return false;
    }
+
+   save_dev = dcr->dev;               /* save dcr device */
+   dcr->dev = dev;                    /* temporarily point dcr at other device */
+   save_slot = dcr->VolCatInfo.Slot;
+
+   if (dev->get_slot() <= 0 && get_autochanger_loaded_slot(dcr) <= 0) {
+      dcr->VolCatInfo.Slot = save_slot;
+      dcr->dev = save_dev;
+      return false;
+   }
+   dcr->VolCatInfo.Slot = dev->get_slot();
+
    dev->dlock();
 
    POOLMEM *changer_cmd = get_pool_memory(PM_FNAME);
@@ -458,10 +474,6 @@ bool unload_dev(DCR *dcr, DEVICE *dev)
    Dmsg2(100, "Issuing autochanger \"unload slot %d, drive %d\" command.\n",
         dev->get_slot(), dev->drive_index);
 
-   save_dev = dcr->dev;
-   dcr->dev = dev;
-   save_slot = dcr->VolCatInfo.Slot;
-   dcr->VolCatInfo.Slot = dev->get_slot();
    changer_cmd = edit_device_codes(dcr, changer_cmd, 
                 dcr->device->changer_command, "unload");
    dev->close();
index 917c750d2b050b262c87d2bc2284b7c8fa0ef8b3..255ecbdac6b4c78dce728f40590958304786b4bc 100644 (file)
@@ -24,6 +24,8 @@ Add long term statistics job table
 
 
 General:
+31May08
+kes  Get correct slot when auto unloading a device.
 30May08
 kes  Fix multiple media restore.
 kes  Make DEVICE Slot private and access it via a method.