]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/dev.c
Add V: to bextract and bscan
[bacula/bacula] / bacula / src / stored / dev.c
index b97a1bc3f0444051cf076e7155b2cf9d56deb2ef..1994e23c1c290cb880029acf8cda4180615473bf 100644 (file)
 #include "stored.h"
 
 /* Forward referenced functions */
-int dev_is_tape(DEVICE *dev);
-void clrerror_dev(DEVICE *dev, int func);
-int fsr_dev(DEVICE *dev, int num);
-
-extern int debug_level;
 
 /* 
  * Allocate and initialize the DEVICE structure
@@ -275,7 +270,7 @@ open_dev(DEVICE *dev, char *VolName, int mode)
       if (dev->fd >= 0) {
         dev->dev_errno = 0;
         dev->state |= ST_OPENED;
-        dev->use_count++;
+        dev->use_count = 1;
         update_pos_dev(dev);             /* update position */
       }
       /* Stop any open() timer we started */
@@ -317,7 +312,7 @@ open_dev(DEVICE *dev, char *VolName, int mode)
       } else {
         dev->dev_errno = 0;
         dev->state |= ST_OPENED;
-        dev->use_count++;
+        dev->use_count = 1;
         update_pos_dev(dev);                /* update position */
       }
       Dmsg1(29, "open_dev: disk fd=%d opened\n", dev->fd);
@@ -344,7 +339,7 @@ int rewind_dev(DEVICE *dev)
       Emsg0(M_FATAL, 0, dev->errmsg);
       return 0;
    }
-   dev->state &= ~(ST_APPEND|ST_READ|ST_EOT | ST_EOF | ST_WEOT);  /* remove EOF/EOT flags */
+   dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
    dev->block_num = dev->file = 0;
    dev->file_addr = 0;
    if (dev->state & ST_TAPE) {
@@ -651,6 +646,7 @@ int offline_dev(DEVICE *dev)
       return 1;
    }
 
+   dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
    dev->block_num = dev->file = 0;
    dev->file_addr = 0;
 #ifdef MTUNLOCK
@@ -1079,7 +1075,7 @@ int flush_dev(DEVICE *dev)
 static void do_close(DEVICE *dev)
 {
 
-   Dmsg0(29, "really close_dev\n");
+   Dmsg1(29, "really close_dev %s\n", dev->dev_name);
    close(dev->fd);
    /* Clean up device packet so it can be reused */
    dev->fd = -1;
@@ -1093,6 +1089,7 @@ static void do_close(DEVICE *dev)
       stop_thread_timer(dev->tid);
       dev->tid = 0;
    }
+   dev->use_count = 0;
 }
 
 /* 
@@ -1108,8 +1105,13 @@ close_dev(DEVICE *dev)
    }
    if (dev->fd >= 0 && dev->use_count == 1) {
       do_close(dev);
+   } else if (dev->use_count > 0) {
+      dev->use_count--;
    }
-   dev->use_count--;
+          
+#ifdef FULL_DEBUG
+   ASSERT(dev->use_count >= 0);
+#endif
 }
 
 /*
@@ -1122,9 +1124,12 @@ void force_close_dev(DEVICE *dev)
       Emsg0(M_FATAL, 0, dev->errmsg);
       return;
    }
-   Dmsg0(29, "really close_dev\n");
+   Dmsg1(29, "Force close_dev %s\n", dev->dev_name);
    do_close(dev);
-   dev->use_count--;
+
+#ifdef FULL_DEBUG
+   ASSERT(dev->use_count >= 0);
+#endif
 }
 
 int truncate_dev(DEVICE *dev)