]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/dev.h
Massive SD calling sequence reorganization
[bacula/bacula] / bacula / src / stored / dev.h
index 53969ba5aa482ea536d93db56b0e73f4e27134c7..4516c626c90e3252583b050ec604b650d8b49f15 100644 (file)
@@ -2,11 +2,13 @@
  * Definitions for using the Device functions in Bacula
  *  Tape and File storage access
  *
+ * Kern Sibbald, MM
+ *
  *   Version $Id$
  *
  */
 /*
-   Copyright (C) 2000-2003 Kern Sibbald and John Walker
+   Copyright (C) 2000-2004 Kern Sibbald and John Walker
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -29,6 +31,8 @@
 #ifndef __DEV_H
 #define __DEV_H 1
 
+#undef DCR                            /* used by Bacula */
+
 /* #define NEW_LOCK 1 */
 
 #define new_lock_device(dev)             _new_lock_device(__FILE__, __LINE__, (dev)) 
 #define give_back_device_lock(d, p) _give_back_device_lock(__FILE__, __LINE__, (d), (p))
 
 /* Arguments to open_dev() */
-#define READ_WRITE       0
-#define READ_ONLY        1
-#define OPEN_READ_WRITE  0
-#define OPEN_READ_ONLY   1
-#define OPEN_WRITE_ONLY  2
+enum {
+   OPEN_READ_WRITE = 0,
+   OPEN_READ_ONLY,
+   OPEN_WRITE_ONLY   
+};
 
 /* Generic status bits returned from status_dev() */
 #define BMT_TAPE           (1<<0)     /* is tape device */
 #define CAP_OFFLINEUNMOUNT (1<<13)    /* Offline before unmount */
 #define CAP_STREAM         (1<<14)    /* Stream device */
 #define CAP_BSFATEOM       (1<<15)    /* Backspace file at EOM */
+#define CAP_FASTFSF        (1<<16)    /* Fast forward space file */
+#define CAP_TWOEOF         (1<<17)    /* Write two eofs for EOM */
+#define CAP_CLOSEONPOLL    (1<<18)    /* Close device on polling */
+#define CAP_POSITIONBLOCKS (1<<19)    /* Use block positioning */
 
 /* Test state */
 #define dev_state(dev, st_state) ((dev)->state & (st_state))
 #define ST_SHORT           (1<<13)    /* Short block read */
 
 /* dev_blocked states (mutually exclusive) */
-#define BST_NOT_BLOCKED       0       /* not blocked */
-#define BST_UNMOUNTED         1       /* User unmounted device */
-#define BST_WAITING_FOR_SYSOP 2       /* Waiting for operator to mount tape */
-#define BST_DOING_ACQUIRE     3       /* Opening/validating/moving tape */
-#define BST_WRITING_LABEL     4       /* Labeling a tape */  
-#define BST_UNMOUNTED_WAITING_FOR_SYSOP 5 /* Closed by user during mount request */
-#define BST_MOUNT             6       /* Mount request */
+enum {
+   BST_NOT_BLOCKED = 0,               /* not blocked */
+   BST_UNMOUNTED,                     /* User unmounted device */
+   BST_WAITING_FOR_SYSOP,             /* Waiting for operator to mount tape */
+   BST_DOING_ACQUIRE,                 /* Opening/validating/moving tape */
+   BST_WRITING_LABEL,                  /* Labeling a tape */  
+   BST_UNMOUNTED_WAITING_FOR_SYSOP,    /* Closed by user during mount request */
+   BST_MOUNT                           /* Mount request */
+};
 
 /* Volume Catalog Information structure definition */
 struct VOLUME_CAT_INFO {
@@ -125,48 +135,63 @@ struct VOLUME_CAT_INFO {
    uint64_t VolCatRBytes;             /* Number of bytes read */
    uint32_t VolCatRecycles;           /* Number of recycles this volume */
    int32_t  Slot;                     /* Slot in changer */
-   int32_t  Drive;                    /* Changer drive */
    bool     InChanger;                /* Set if vol in current magazine */
    uint32_t VolCatMaxJobs;            /* Maximum Jobs to write to volume */
    uint32_t VolCatMaxFiles;           /* Maximum files to write to volume */
    uint64_t VolCatMaxBytes;           /* Max bytes to write to volume */
    uint64_t VolCatCapacityBytes;      /* capacity estimate */
+   uint64_t VolReadTime;              /* time spent reading */
+   uint64_t VolWriteTime;             /* time spent writing this Volume */
    char VolCatStatus[20];             /* Volume status */
    char VolCatName[MAX_NAME_LENGTH];  /* Desired volume to mount */
 };                
 
 
 typedef struct s_steal_lock {
-   pthread_t         no_wait_id;      /* id of no wait thread */
-   int               dev_blocked;     /* state */
+   pthread_t  no_wait_id;             /* id of no wait thread */
+   int        dev_blocked;            /* state */
+   int        dev_prev_blocked;       /* previous blocked state */
 } bsteal_lock_t;
 
 struct DEVRES;                        /* Device resource defined in stored_conf.h */
 
-/* Device structure definition */
+/*
+ * Device structure definition. There is one of these for
+ *  each physical device. Everything here is "global" to 
+ *  that device and effects all jobs using the device.
+ */
 struct DEVICE {
 public:
    DEVICE *next;                      /* pointer to next open device */
    DEVICE *prev;                      /* pointer to prev open device */
    JCR *attached_jcrs;                /* attached JCR list */
+   dlist *attached_dcrs;              /* attached DCR list */
    pthread_mutex_t mutex;             /* access control */
+   pthread_mutex_t spool_mutex;       /* mutex for updating spool_size */
    pthread_cond_t wait;               /* thread wait variable */
    pthread_cond_t wait_next_vol;      /* wait for tape to be mounted */
    pthread_t no_wait_id;              /* this thread must not wait */
    int dev_blocked;                   /* set if we must wait (i.e. change tape) */
+   int dev_prev_blocked;              /* previous blocked state */
    int num_waiting;                   /* number of threads waiting */
    int num_writers;                   /* number of writing threads */
+
+   /* New access control in process of being implemented */
+   brwlock_t lock;                    /* New mutual exclusion lock */
+
    int use_count;                     /* usage count on this device */
    int fd;                            /* file descriptor */
    int capabilities;                  /* capabilities mask */
    int state;                         /* state mask */
    int dev_errno;                     /* Our own errno */
    int mode;                          /* read/write modes */
-   char *dev_name;                    /* device name */
+   uint32_t drive_index;              /* Autochanger drive index */
+   POOLMEM *dev_name;                 /* device name */
    char *errmsg;                      /* nicely edited error message */
    uint32_t block_num;                /* current block number base 0 */
    uint32_t file;                     /* current file number base 0 */
    uint64_t file_addr;                /* Current file read/write address */
+   uint64_t file_size;                /* Current file size */
    uint32_t EndBlock;                 /* last block written */
    uint32_t EndFile;                  /* last file written */
    uint32_t min_block_size;           /* min block size */
@@ -174,15 +199,64 @@ public:
    uint64_t max_volume_size;          /* max bytes to put on one volume */
    uint64_t max_file_size;            /* max file size to put in one file on volume */
    uint64_t volume_capacity;          /* advisory capacity */
+   uint64_t max_spool_size;           /* maximum spool file size */
+   uint64_t spool_size;               /* curren spool size */
    uint32_t max_rewind_wait;          /* max secs to allow for rewind */
    uint32_t max_open_wait;            /* max secs to allow for open */
    uint32_t max_open_vols;            /* max simultaneous open volumes */
+   utime_t  vol_poll_interval;        /* interval between polling Vol mount */
    DEVRES *device;                    /* pointer to Device Resource */
-   btimer_id tid;                     /* timer id */
+   btimer_t *tid;                     /* timer id */
 
    VOLUME_CAT_INFO VolCatInfo;        /* Volume Catalog Information */
    VOLUME_LABEL VolHdr;               /* Actual volume label */
    
+   /* Device wait times ***FIXME*** look at durations */
+   char BadVolName[MAX_NAME_LENGTH];  /* Last wrong Volume mounted */
+   bool poll;                         /* set to poll Volume */
+   int min_wait;
+   int max_wait;
+   int max_num_wait;
+   int wait_sec;
+   int rem_wait_sec;
+   int num_wait;
+};
+
+/*
+ * Device Context (or Control) Record.  
+ *  There is one of these records for each Job that is using    
+ *  the device. Items in this record are "local" to the Job and
+ *  do not affect other Jobs.
+ */
+class DCR {
+public:
+   dlink dev_link;                    /* link to attach to dev */
+   JCR *jcr;                          /* pointer to JCR */
+   DEVICE *dev;                       /* pointer to device */
+   DEV_BLOCK *block;                  /* pointer to block */
+   DEV_RECORD *rec;                   /* pointer to record */
+   int spool_fd;                      /* fd if spooling */
+   bool spool_data;                   /* set to spool data */
+   bool spooling;                     /* set when actually spooling */
+   bool dev_locked;                   /* set if dev already locked */
+   bool NewVol;                       /* set if new Volume mounted */
+   bool WroteVol;                     /* set if Volume written */
+   bool NewFile;                      /* set when EOF written */
+   uint32_t VolFirstIndex;            /* First file index this Volume */
+   uint32_t VolLastIndex;             /* Last file index this Volume */
+   uint32_t FileIndex;                /* Current File Index */
+   uint32_t EndFile;                  /* End file written */
+   uint32_t StartFile;                /* Start write file */
+   uint32_t StartBlock;               /* Start write block */
+   uint32_t EndBlock;                 /* Ending block written */
+   int64_t spool_size;                /* Current spool size */
+   int64_t max_spool_size;            /* Max job spool size */
+   char VolumeName[MAX_NAME_LENGTH];  /* Volume name */
+   char pool_name[MAX_NAME_LENGTH];   /* pool name */
+   char pool_type[MAX_NAME_LENGTH];   /* pool type */
+   char media_type[MAX_NAME_LENGTH];  /* media type */
+   char dev_name[MAX_NAME_LENGTH];    /* dev name */
+   VOLUME_CAT_INFO VolCatInfo;        /* Catalog info for desired volume */
 };