]> git.sur5r.net Git - bacula/bacula/commitdiff
Allow restore from stream device
authorKern Sibbald <kern@sibbald.com>
Sat, 18 Jan 2003 16:09:31 +0000 (16:09 +0000)
committerKern Sibbald <kern@sibbald.com>
Sat, 18 Jan 2003 16:09:31 +0000 (16:09 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@306 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/stored/block.c
bacula/src/stored/block.h
bacula/src/stored/label.c
bacula/src/stored/read.c
bacula/src/stored/record.c

index 53dfe824ec14308d22796cbd5f41ff3f95dc856b..43b349ee0f3853e80bb961d714b4a4163cd50ea4 100644 (file)
@@ -501,10 +501,12 @@ reread:
       Mmsg1(&dev->errmsg, _("Read zero bytes on device %s.\n"), dev->dev_name);
       if (dev->state & ST_EOF) { /* EOF alread read? */
         dev->state |= ST_EOT;  /* yes, 2 EOFs => EOT */
+        block->read_len = 0;
         return 0;
       }
       dev->file++;             /* increment file */
       dev->state |= ST_EOF;    /* set EOF read */
+      block->read_len = 0;
       return 0;                /* return eof */
    }
    /* Continue here for successful read */
@@ -518,6 +520,7 @@ reread:
    }  
 
    if (!unser_block_header(dev, block)) {
+      block->read_len = 0;
       return 0;
    }
 
@@ -536,6 +539,7 @@ reread:
          Dmsg0(100, "Backspace record for reread.\n");
         if (bsf_dev(dev, 1) != 0) {
            Emsg0(M_ERROR, 0, dev->errmsg);
+           block->read_len = 0;
            return 0;
         }
       } else {
index bb9e72a9d964d4aa4397e4dfda4d0083beab00e1..2ff4cf826b4cb1c2dfdecc97b58f2ca1bd91d40f 100644 (file)
@@ -93,7 +93,7 @@ typedef struct s_dev_block {
    uint32_t block_len;                /* length of current block read */
    uint32_t buf_len;                  /* max/default block length */
    uint32_t BlockNumber;              /* sequential block number */
-   uint32_t read_len;                 /* bytes read into buffer */  
+   uint32_t read_len;                 /* bytes read into buffer, if zero, block empty */
    uint32_t VolSessionId;             /* */
    uint32_t VolSessionTime;           /* */
    int      BlockVer;                 /* block version 1 or 2 */
@@ -104,4 +104,6 @@ typedef struct s_dev_block {
                                        */
 } DEV_BLOCK;
 
+#define block_is_empty(block) !((block)->read_len)
+
 #endif
index 60505c4fe01a301ad1f5e1e98ee954f4f46399b7..87feb01013b3e6a4d150a446eae0a6c971816054 100644 (file)
@@ -117,8 +117,11 @@ because:\n   %s"), dev_name(dev), strerror_dev(dev));
    }
 
    free_record(record);
-   empty_block(block);
-   rewind_dev(dev);
+   /* If we are a streaming device, we only get one chance to read */
+   if (!dev_cap(dev, CAP_STREAM)) {
+      empty_block(block);
+      rewind_dev(dev);
+   }
 
    if (dev->VolHdr.VerNum != BaculaTapeVersion && 
        dev->VolHdr.VerNum != OldCompatibleBaculaTapeVersion1 &&  
index 34cbd58d1cbde3dc91dc0a7dfba29a13953a2d23..2b020b43ef820e6c81641e233dbef9453781b53c 100644 (file)
@@ -121,7 +121,7 @@ int do_read_data(JCR *jcr)
       /* Read Record */
       Dmsg1(500, "Main read_record. rem=%d\n", rec->remainder);
 
-      if (!read_block_from_device(dev, block)) {
+      if (block_is_empty(block) && !read_block_from_device(dev, block)) {
          Dmsg1(500, "Main read record failed. rem=%d\n", rec->remainder);
         if (dev->state & ST_EOT) {
            DEV_RECORD *record;
index 9a68849af2640eee8a950ba77f67a55bbe626239..963749357214315a69707095bb101e27bfdb420e 100644 (file)
@@ -448,6 +448,7 @@ remlen=%d data_len=%d\n",
       }
 #endif
       rec->state |= (REC_NO_HEADER | REC_BLOCK_EMPTY);
+      empty_block(block);                     /* mark block empty */
       return 0;
    }