]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/dev.c
Simplify two messages in acquire.c
[bacula/bacula] / bacula / src / stored / dev.c
index ac112d5e7cc18afc9298f7eec50740ab4a05b593..86799f5f538fb98f41543f258f7f6c685c0a6f2d 100644 (file)
@@ -146,8 +146,6 @@ init_dev(DEVICE *dev, DEVRES *device)
    dev->capabilities = device->cap_bits;
    dev->min_block_size = device->min_block_size;
    dev->max_block_size = device->max_block_size;
-   dev->max_volume_jobs = device->max_volume_jobs;
-   dev->max_volume_files = device->max_volume_files;
    dev->max_volume_size = device->max_volume_size;
    dev->max_file_size = device->max_file_size;
    dev->volume_capacity = device->volume_capacity;
@@ -260,7 +258,7 @@ open_dev(DEVICE *dev, char *VolName, int mode)
         }
         if (errno == EBUSY && timeout-- > 0) {
             Dmsg2(100, "Device %s busy. ERR=%s\n", dev->dev_name, strerror(errno));
-           sleep(1);
+           bmicrosleep(1, 0);
            continue;
         }
         dev->dev_errno = errno;
@@ -288,7 +286,7 @@ open_dev(DEVICE *dev, char *VolName, int mode)
       Dmsg1(29, "open_dev: tape %d opened\n", dev->fd);
    } else {
       /*
-       * Handle opening of file
+       * Handle opening of File Archive (not a tape)
        */
       archive_name = get_pool_memory(PM_FNAME);
       pm_strcpy(&archive_name, dev->dev_name);
@@ -359,7 +357,7 @@ int rewind_dev(DEVICE *dev)
            clrerror_dev(dev, MTREW);
            if (dev->dev_errno == EIO && i > 0) {
                Dmsg0(200, "Sleeping 5 seconds.\n");
-              sleep(5);
+              bmicrosleep(5, 0);
               continue;
            }
             Mmsg2(&dev->errmsg, _("Rewind error on %s. ERR=%s.\n"),
@@ -412,7 +410,7 @@ eod_dev(DEVICE *dev)
       }
       return 0;
    }
-   if (dev->capabilities & CAP_EOM) {
+   if (dev_cap(dev, CAP_EOM)) {
       mt_com.mt_op = MTEOM;
       mt_com.mt_count = 1;
       if ((stat=ioctl(dev->fd, MTIOCTOP, (char *)&mt_com)) < 0) {
@@ -447,9 +445,20 @@ eod_dev(DEVICE *dev)
         }
       }
    }
-   update_pos_dev(dev);                     /* update position */
+   /*
+    * Some drivers leave us after second EOF when doing
+    * MTEOM, so we must backup so that appending overwrites
+    * the second EOF.
+    */
+   if (dev_cap(dev, CAP_BSFATEOM)) {
+      stat =  (bsf_dev(dev, 1) == 0);
+      dev->file++;                   /* keep same file */
+   } else {
+      update_pos_dev(dev);                  /* update position */
+      stat = 1;
+   }
    Dmsg1(200, "EOD dev->file=%d\n", dev->file);
-   return 1;
+   return stat;
 }
 
 /*
@@ -476,7 +485,7 @@ int update_pos_dev(DEVICE *dev)
       dev->file_addr = 0;
       pos = lseek(dev->fd, (off_t)0, SEEK_CUR);
       if (pos < 0) {
-         Dmsg1(000, "Seek error: ERR=%s\n", strerror(dev->dev_errno));
+         Pmsg1(000, "Seek error: ERR=%s\n", strerror(dev->dev_errno));
         dev->dev_errno = errno;
          Mmsg2(&dev->errmsg, _("lseek error on %s. ERR=%s.\n"),
            dev->dev_name, strerror(dev->dev_errno));
@@ -663,7 +672,6 @@ fsf_dev(DEVICE *dev, int num)
 { 
    struct mtop mt_com;
    int stat = 0;
-   char rbuf[1024];
 
    if (dev->fd < 0) {
       dev->dev_errno = EBADF;
@@ -680,26 +688,37 @@ fsf_dev(DEVICE *dev, int num)
       Mmsg1(&dev->errmsg, _("Device %s at End of Tape.\n"), dev->dev_name);
       return 0;
    }
-   if (dev->state & ST_EOF)
+   if (dev->state & ST_EOF) {
       Dmsg0(200, "ST_EOF set on entry to FSF\n");
-   if (dev->state & ST_EOT)
+   }
+   if (dev->state & ST_EOT) {
       Dmsg0(200, "ST_EOT set on entry to FSF\n");
+   }
       
    Dmsg0(29, "fsf_dev\n");
    dev->block_num = 0;
-   if (dev->capabilities & CAP_FSF) {
+   if (dev_cap(dev, CAP_FSF)) {
+      POOLMEM *rbuf;
+      int rbuf_len;
       Dmsg0(200, "FSF has cap_fsf\n");
+      if (dev->max_block_size == 0) {
+        rbuf_len = DEFAULT_BLOCK_SIZE;
+      } else {
+        rbuf_len = dev->max_block_size;
+      }
+      rbuf = get_memory(rbuf_len);
       mt_com.mt_op = MTFSF;
       mt_com.mt_count = 1;
       while (num-- && !(dev->state & ST_EOT)) {
-         Dmsg0(200, "Doing read for fsf\n");
-        if ((stat = read(dev->fd, rbuf, sizeof(rbuf))) < 0) {
+         Dmsg0(200, "Doing read before fsf\n");
+        if ((stat = read(dev->fd, (char *)rbuf, rbuf_len)) < 0) {
            if (errno == ENOMEM) {     /* tape record exceeds buf len */
-              stat = sizeof(rbuf);   /* This is OK */
+              stat = rbuf_len;        /* This is OK */
            } else {
               dev->state |= ST_EOT;
               clrerror_dev(dev, -1);
-               Dmsg1(200, "Set ST_EOT read error %d\n", dev->dev_errno);
+               Dmsg2(200, "Set ST_EOT read errno=%d. ERR=%s\n", dev->dev_errno,
+                 strerror(dev->dev_errno));
                Mmsg2(&dev->errmsg, _("read error on %s. ERR=%s.\n"),
                  dev->dev_name, strerror(dev->dev_errno));
                Dmsg1(200, "%s", dev->errmsg);
@@ -740,6 +759,7 @@ fsf_dev(DEVICE *dev, int num)
            dev->file_addr = 0;
         }   
       }
+      free_memory(rbuf);
    
    /*
     * No FSF, so use FSR to simulate it