/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
*
* Kern Sibbald, MM
*
- * Version $Id$
- *
*/
/*
#define CAP_CLOSEONPOLL (1<<18) /* Close device on polling */
#define CAP_POSITIONBLOCKS (1<<19) /* Use block positioning */
#define CAP_MTIOCGET (1<<20) /* Basic support for fileno and blkno */
-#define CAP_REQMOUNT (1<<21) /* Require mount to read files back (typically: DVD) */
+#define CAP_REQMOUNT (1<<21) /* Require mount/unmount */
#define CAP_CHECKLABELS (1<<22) /* Check for ANSI/IBM labels */
#define CAP_BLOCKCHECKSUM (1<<23) /* Create/test block checksum */
utime_t VolFirstWritten; /* Time of first write */
utime_t VolLastWritten; /* Time of last write */
bool InChanger; /* Set if vol in current magazine */
+ bool is_valid; /* set if this data is valid */
char VolCatStatus[20]; /* Volume status */
char VolCatName[MAX_NAME_LENGTH]; /* Desired volume to mount */
};
public:
DEVICE * volatile swap_dev; /* Swap vol from this device */
dlist *attached_dcrs; /* attached DCR list */
- pthread_mutex_t m_mutex; /* access control */
- pthread_mutex_t spool_mutex; /* mutex for updating spool_size */
- pthread_mutex_t acquire_mutex; /* mutex for acquire code */
+ bthread_mutex_t m_mutex; /* access control */
+ bthread_mutex_t spool_mutex; /* mutex for updating spool_size */
+ bthread_mutex_t acquire_mutex; /* mutex for acquire code */
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 openmode; /* parameter passed to open_dev (useful to reopen the device) */
int dev_type; /* device type */
bool autoselect; /* Autoselect in autochanger */
- bool truncate_on_purge; /* Truncate this volume when it gets purged? */
bool initiated; /* set when init_dev() called */
int label_type; /* Bacula/ANSI/IBM label types */
uint32_t drive_index; /* Autochanger drive index (base 0) */
uint32_t EndFile; /* last file written */
uint32_t min_block_size; /* min block size */
uint32_t max_block_size; /* max block size */
+ uint32_t max_concurrent_jobs; /* maximum simultaneous jobs this drive */
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 max_concurrent_jobs; /* maximum simultaneous jobs this drive */
uint64_t volume_capacity; /* advisory capacity */
uint64_t max_spool_size; /* maximum spool file size */
uint64_t spool_size; /* current spool size for this device */
char *bstrerror(void) { return errmsg; };
char *print_errmsg() { return errmsg; };
int32_t get_slot() const { return m_slot; };
+ void setVolCatInfo(bool valid) { VolCatInfo.is_valid = valid; };
+ bool haveVolCatInfo() const { return VolCatInfo.is_valid; };
+ void setVolCatName(const char *name) {
+ bstrncpy(VolCatInfo.VolCatName, name, sizeof(VolCatInfo.VolCatName));
+ setVolCatInfo(false);
+ };
+ char *getVolCatName() { return VolCatInfo.VolCatName; };
void set_unload(); /* in dev.c */
void clear_volhdr(); /* in dev.c */
void _dlock(const char *, int); /* in lock.c */
void _dunlock(const char *, int); /* in lock.c */
#else
- void r_dlock(bool locked=false); /* in lock.c */
+ void r_dlock(bool locked=false); /* in lock.c */
void r_dunlock() { dunlock(); }
void dlock() { P(m_mutex); }
void dunlock() { V(m_mutex); }
const char *print_blocked() const; /* in dev.c */
private:
- bool do_mount(int mount, int timeout); /* in dev.c */
- void set_mode(int omode); /* in dev.c */
- void open_tape_device(DCR *dcr, int omode); /* in dev.c */
- void open_file_device(DCR *dcr, int omode); /* in dev.c */
- void open_dvd_device(DCR *dcr, int omode); /* in dev.c */
+ bool do_tape_mount(int mount, int dotimeout); /* in dev.c */
+ bool do_file_mount(int mount, int dotimeout); /* in dev.c */
+ void set_mode(int omode); /* in dev.c */
+ void open_tape_device(DCR *dcr, int omode); /* in dev.c */
+ void open_file_device(DCR *dcr, int omode); /* in dev.c */
+ void open_dvd_device(DCR *dcr, int omode); /* in dev.c */
};
inline const char *DEVICE::strerror() const { return errmsg; }
* the device. Items in this record are "local" to the Job and
* do not affect other Jobs. Note, a job can have multiple
* DCRs open, each pointing to a different device.
+ * Normally, there is only one JCR thread per DCR. However, the
+ * big and important exception to this is when a Job is being
+ * canceled. At that time, there may be two threads using the
+ * same DCR. Consequently, when creating/attaching/detaching
+ * and freeing the DCR we must lock it (m_mutex).
*/
class DCR {
private:
public:
dlink dev_link; /* link to attach to dev */
JCR *jcr; /* pointer to JCR */
+ bthread_mutex_t m_mutex; /* access control */
DEVICE * volatile dev; /* pointer to device */
DEVRES *device; /* pointer to device resource */
DEV_BLOCK *block; /* pointer to block */
void dunlock() { m_dev_locked = false; dev->dunlock(); }
#endif
void dblock(int why) { dev->dblock(why); }
+ void setVolCatInfo(bool valid) { VolCatInfo.is_valid = valid; };
+ bool haveVolCatInfo() const { return VolCatInfo.is_valid; };
+ void setVolCatName(const char *name) {
+ bstrncpy(VolCatInfo.VolCatName, name, sizeof(VolCatInfo.VolCatName));
+ setVolCatInfo(false);
+ };
+ char *getVolCatName() { return VolCatInfo.VolCatName; };
/* Methods in reserve.c */