X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fdev.h;h=4efe4bd7d40948b700cceebd5c00e655d9a77e1e;hb=b9265a6898ae36e450755721acfbf4a52342bc2f;hp=797fa441b68dae7c631d65aa4c5c18cb0c70e753;hpb=aa8412d6fbde9fca6621a6631e9ab8b1cbbdba26;p=bacula%2Fbacula diff --git a/bacula/src/stored/dev.h b/bacula/src/stored/dev.h index 797fa441b6..4efe4bd7d4 100644 --- a/bacula/src/stored/dev.h +++ b/bacula/src/stored/dev.h @@ -6,7 +6,7 @@ * */ /* - 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 +29,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)) @@ -43,11 +45,11 @@ #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 */ @@ -82,6 +84,9 @@ #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 */ /* Test state */ #define dev_state(dev, st_state) ((dev)->state & (st_state)) @@ -103,13 +108,15 @@ #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,46 +132,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 */ + 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 */ @@ -172,15 +196,59 @@ 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. + */ +struct DCR { + 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 */ + VOLUME_CAT_INFO VolCatInfo; /* Catalog info for desired volume */ };