]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/acquire.c
Print length if Hello to short or long
[bacula/bacula] / bacula / src / stored / acquire.c
index 99a6f33333bce08898177e03ae7807c8ae714d60..a2971c17b38f72fc17a18873d554a82580967bac 100644 (file)
@@ -67,7 +67,7 @@ int acquire_device_for_read(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
    }
    pm_strcpy(&jcr->VolumeName, vol->VolumeName);
 
-   for (;;) {
+   for (int i=0; i<5; i++) {
       if (job_cancelled(jcr)) {
          Mmsg0(&dev->errmsg, _("Job cancelled.\n"));
         goto get_out;                /* error return */
@@ -90,6 +90,7 @@ int acquire_device_for_read(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
       Dmsg0(200, "calling read-vol-label\n");
       switch (read_dev_volume_label(jcr, dev, block)) {
         case VOL_OK:
+           stat = 1;
            break;                    /* got it */
         case VOL_IO_ERROR:
            /*
@@ -123,10 +124,14 @@ default_path:
       }
       break;
    }
+   if (stat == 0) {
+      Jmsg1(jcr, M_FATAL, 0, _("Too many errors trying to mount device \"%s\".\n"),
+           dev_name(dev));
+      goto get_out;
+   }
 
    dev->state |= ST_READ;
    attach_jcr_to_device(dev, jcr);    /* attach jcr to device */
-   stat = 1;                         /* good return */
    if ((dev->state & ST_TAPE) && vol->start_file > 0) {
       Dmsg1(200, "====== Got start_file = %d\n", vol->start_file);
       Jmsg(jcr, M_INFO, 0, _("Forward spacing to file %d.\n"), vol->start_file);
@@ -146,6 +151,9 @@ get_out:
  *
  *  Returns: NULL if failed for any reason
  *          dev if successful (may change if new dev opened)
+ *  This routine must be single threaded because we may create
+ *   multiple devices (for files), thus we have our own mutex 
+ *   on top of the device mutex.
  */
 DEVICE * acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
 {
@@ -156,6 +164,7 @@ DEVICE * acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
    lock_device(dev);
    block_device(dev, BST_DOING_ACQUIRE);
    unlock_device(dev);
+   P(mutex);                        /* lock all devices */
    Dmsg1(190, "acquire_append device is %s\n", dev_is_tape(dev)?"tape":"disk");
             
 
@@ -170,7 +179,7 @@ DEVICE * acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
        *    dir_find_next_appendable_volume
        */
       strcpy(jcr->VolumeName, dev->VolHdr.VolName);
-      if (!dir_get_volume_info(jcr, 1) ||
+      if (!dir_get_volume_info(jcr, 1) &&
          !(dir_find_next_appendable_volume(jcr) &&
            strcmp(dev->VolHdr.VolName, jcr->VolumeName) == 0)) { /* wrong tape mounted */
         if (dev->num_writers != 0) {
@@ -180,7 +189,6 @@ DEVICE * acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
               open_vols++;
            }
            if (dev->state & ST_FILE && dev->max_open_vols > open_vols) {
-              P(mutex);              /* lock all devices */
               d = init_dev(NULL, (DEVRES *)dev->device); /* init new device */
               d->prev = dev;                   /* chain in new device */
               d->next = dev->next;
@@ -194,7 +202,6 @@ DEVICE * acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
               lock_device(dev);
               block_device(dev, BST_DOING_ACQUIRE);
               unlock_device(dev);
-              V(mutex);
            } else {
                Jmsg(jcr, M_FATAL, 0, _("Device %s is busy writing on another Volume.\n"), dev_name(dev));
               goto get_out;
@@ -237,6 +244,7 @@ get_out:
    P(dev->mutex); 
    unblock_device(dev);
    V(dev->mutex);
+   V(mutex);                         /* unlock other threads */
    return rtn_dev;
 }