From: Kern Sibbald Date: Tue, 9 Sep 2003 19:21:46 +0000 (+0000) Subject: Print warning when drive is unmounted + misc cleanups X-Git-Tag: Release-1.32~28 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=2f1a4a9fc6c919f8e2fd7599293765fe52202ea6;p=bacula%2Fbacula Print warning when drive is unmounted + misc cleanups git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@691 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/stored/acquire.c b/bacula/src/stored/acquire.c index 9242ca96d2..48fe3ecaa8 100644 --- a/bacula/src/stored/acquire.c +++ b/bacula/src/stored/acquire.c @@ -46,6 +46,9 @@ int acquire_device_for_read(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) int autochanger = 0; int i; + if (device_is_unmounted(dev)) { + Jmsg(jcr, M_WARNING, 0, _("device is BLOCKED due to user unmount.\n")); + } lock_device(dev); block_device(dev, BST_DOING_ACQUIRE); unlock_device(dev); @@ -164,6 +167,9 @@ DEVICE * acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) int do_mount = 0; DEVICE *rtn_dev = NULL; + if (device_is_unmounted(dev)) { + Jmsg(jcr, M_WARNING, 0, _("device is BLOCKED due to user unmount.\n")); + } lock_device(dev); block_device(dev, BST_DOING_ACQUIRE); unlock_device(dev); diff --git a/bacula/src/stored/dev.c b/bacula/src/stored/dev.c index f28eb4344d..8f8ffb9da0 100644 --- a/bacula/src/stored/dev.c +++ b/bacula/src/stored/dev.c @@ -1125,7 +1125,9 @@ static void do_close(DEVICE *dev) { Dmsg1(29, "really close_dev %s\n", dev->dev_name); - close(dev->fd); + if (dev->fd >= 0) { + close(dev->fd); + } /* Clean up device packet so it can be reused */ dev->fd = -1; dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF); @@ -1164,7 +1166,7 @@ close_dev(DEVICE *dev) } /* - * Used when unmounting the device + * Used when unmounting the device, ignore use_count */ void force_close_dev(DEVICE *dev) { diff --git a/bacula/src/stored/device.c b/bacula/src/stored/device.c index 525003555f..4fd675c138 100644 --- a/bacula/src/stored/device.c +++ b/bacula/src/stored/device.c @@ -307,6 +307,19 @@ void _lock_device(char *file, int line, DEVICE *dev) } } +/* + * Check if the device is blocked or not + */ +int device_is_unmounted(DEVICE *dev) +{ + int stat; + P(dev->mutex); + stat = (dev->dev_blocked == BST_UNMOUNTED) || + (dev->dev_blocked == BST_UNMOUNTED_WAITING_FOR_SYSOP); + V(dev->mutex); + return stat; +} + void _unlock_device(char *file, int line, DEVICE *dev) { Dmsg2(100, "unlock from %s:%d\n", file, line); diff --git a/bacula/src/stored/dircmd.c b/bacula/src/stored/dircmd.c index 68d6b4d038..068bf73c60 100644 --- a/bacula/src/stored/dircmd.c +++ b/bacula/src/stored/dircmd.c @@ -648,7 +648,7 @@ static int unmount_cmd(JCR *jcr) /* On FreeBSD, I am having ASSERT() failures in block_device() * and I can only imagine that the thread id that we are * leaving in no_wait_id is being re-used. So here, - * we simply do it by hand. Gross, but maybe a solutions + * we simply do it by hand. Gross, but a solution. */ /* block_device(dev, BST_UNMOUNTED); replace with 2 lines below */ dev->dev_blocked = BST_UNMOUNTED; diff --git a/bacula/src/stored/label.c b/bacula/src/stored/label.c index 59f8a1dd77..4b270c82ee 100644 --- a/bacula/src/stored/label.c +++ b/bacula/src/stored/label.c @@ -319,7 +319,7 @@ static void create_volume_label_record(JCR *jcr, DEVICE *dev, DEV_RECORD *rec) * Returns: 0 on error * 1 on success */ -void create_volume_label(DEVICE *dev, char *VolName) +void create_volume_label(DEVICE *dev, char *VolName, char *PoolName) { struct date_time dt; DEVRES *device = (DEVRES *)dev->device; @@ -332,14 +332,14 @@ void create_volume_label(DEVICE *dev, char *VolName) /* ***FIXME*** we really need to get the volume name, * pool name, and pool type from the database. - * We also need to pickup the MediaType. */ strcpy(dev->VolHdr.Id, BaculaId); dev->VolHdr.VerNum = BaculaTapeVersion; dev->VolHdr.LabelType = PRE_LABEL; /* Mark tape as unused */ bstrncpy(dev->VolHdr.VolName, VolName, sizeof(dev->VolHdr.VolName)); - strcpy(dev->VolHdr.PoolName, "Default"); + bstrncpy(dev->VolHdr.PoolName, PoolName, sizeof(dev->VolHdr.PoolName)); bstrncpy(dev->VolHdr.MediaType, device->media_type, sizeof(dev->VolHdr.MediaType)); + strcpy(dev->VolHdr.PoolType, "Backup"); /* Put label time/date in header */ @@ -386,10 +386,7 @@ int write_volume_label_to_dev(JCR *jcr, DEVRES *device, char *VolName, char *Poo Dmsg0(99, "write_volume_label()\n"); - create_volume_label(dev, VolName); - bstrncpy(dev->VolHdr.MediaType, device->media_type, sizeof(dev->VolHdr.MediaType)); - bstrncpy(dev->VolHdr.VolName, VolName, sizeof(dev->VolHdr.VolName)); - bstrncpy(dev->VolHdr.PoolName, PoolName, sizeof(dev->VolHdr.PoolName)); + create_volume_label(dev, VolName, PoolName); if (!rewind_dev(dev)) { memset(&dev->VolHdr, 0, sizeof(dev->VolHdr)); diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index 40fdc4dd9d..4ed36c3d93 100644 --- a/bacula/src/stored/mount.c +++ b/bacula/src/stored/mount.c @@ -143,7 +143,7 @@ read_volume: */ if (dev_cap(dev, CAP_STREAM)) { vol_label_status = VOL_OK; - create_volume_label(dev, jcr->VolumeName); + create_volume_label(dev, jcr->VolumeName, "Default"); dev->VolHdr.LabelType = PRE_LABEL; } else { vol_label_status = read_dev_volume_label(jcr, dev, block); @@ -189,13 +189,16 @@ read_volume: recycle = 1; } break; /* got a Volume */ - + /* + * At this point, we assume we have a blank tape mounted. + */ case VOL_NO_LABEL: case VOL_IO_ERROR: Dmsg1(500, "Vol NO_LABEL or IO_ERROR name=%s\n", jcr->VolumeName); /* If permitted, create a label */ if (dev_cap(dev, CAP_LABEL)) { Dmsg0(100, "Create volume label\n"); + /* ***FIXME*** ask for label name */ if (!write_volume_label_to_dev(jcr, (DEVRES *)dev->device, jcr->VolumeName, jcr->pool_name)) { Dmsg0(100, "!write_vol_label\n"); @@ -206,6 +209,7 @@ read_volume: goto read_volume; /* read label we just wrote */ } /* NOTE! Fall-through wanted. */ + case VOL_NO_MEDIA: default: mount_error: /* Send error message */ @@ -281,7 +285,7 @@ mount_error: dev->VolCatInfo.VolCatWrites = 1; dev->VolCatInfo.VolCatReads = 1; } - strcpy(dev->VolCatInfo.VolCatStatus, "Append"); + bstrncpy(dev->VolCatInfo.VolCatStatus, "Append", sizeof(dev->VolCatInfo.VolCatStatus)); Dmsg0(200, "dir_update_vol_info. Set Append\n"); dir_update_volume_info(jcr, &dev->VolCatInfo, 1); /* indicate doing relabel */ if (recycle) { @@ -383,7 +387,8 @@ void release_volume(JCR *jcr, DEVICE *dev) dev->state &= ~ST_LABEL; /* label not yet read */ jcr->VolumeName[0] = 0; - if (!dev_is_tape(dev) || !dev_cap(dev, CAP_ALWAYSOPEN)) { + if ((dev->state & ST_OPENED) && + (!dev_is_tape(dev) || !dev_cap(dev, CAP_ALWAYSOPEN))) { offline_or_rewind_dev(dev); close_dev(dev); } diff --git a/bacula/src/stored/protos.h b/bacula/src/stored/protos.h index 20046490eb..88c4629d29 100644 --- a/bacula/src/stored/protos.h +++ b/bacula/src/stored/protos.h @@ -28,92 +28,92 @@ uint32_t new_VolSessionId(); /* From acquire.c */ -DEVICE *acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); -int acquire_device_for_read(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); -int release_device(JCR *jcr, DEVICE *dev); +DEVICE *acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); +int acquire_device_for_read(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); +int release_device(JCR *jcr, DEVICE *dev); /* From askdir.c */ enum get_vol_info_rw { GET_VOL_INFO_FOR_WRITE, GET_VOL_INFO_FOR_READ }; -int dir_get_volume_info(JCR *jcr, enum get_vol_info_rw); -int dir_find_next_appendable_volume(JCR *jcr); -int dir_update_volume_info(JCR *jcr, VOLUME_CAT_INFO *vol, int relabel); -int dir_ask_sysop_to_mount_next_volume(JCR *jcr, DEVICE *dev); -int dir_ask_sysop_to_mount_volume(JCR *jcr, DEVICE *dev); -int dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec); -int dir_send_job_status(JCR *jcr); -int dir_create_jobmedia_record(JCR *jcr); +int dir_get_volume_info(JCR *jcr, enum get_vol_info_rw); +int dir_find_next_appendable_volume(JCR *jcr); +int dir_update_volume_info(JCR *jcr, VOLUME_CAT_INFO *vol, int relabel); +int dir_ask_sysop_to_mount_next_volume(JCR *jcr, DEVICE *dev); +int dir_ask_sysop_to_mount_volume(JCR *jcr, DEVICE *dev); +int dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec); +int dir_send_job_status(JCR *jcr); +int dir_create_jobmedia_record(JCR *jcr); /* authenticate.c */ -int authenticate_director(JCR *jcr); -int authenticate_filed(JCR *jcr); +int authenticate_director(JCR *jcr); +int authenticate_filed(JCR *jcr); /* From block.c */ -void dump_block(DEV_BLOCK *b, char *msg); +void dump_block(DEV_BLOCK *b, char *msg); DEV_BLOCK *new_block(DEVICE *dev); -void init_block_write(DEV_BLOCK *block); -void empty_block(DEV_BLOCK *block); -void free_block(DEV_BLOCK *block); -int write_block_to_device(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); -int write_block_to_dev(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); +void init_block_write(DEV_BLOCK *block); +void empty_block(DEV_BLOCK *block); +void free_block(DEV_BLOCK *block); +int write_block_to_device(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); +int write_block_to_dev(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); #define CHECK_BLOCK_NUMBERS true #define NO_BLOCK_NUMBER_CHECK false -int read_block_from_device(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, bool check_block_numbers); -int read_block_from_dev(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, bool check_block_numbers); +int read_block_from_device(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, bool check_block_numbers); +int read_block_from_dev(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, bool check_block_numbers); /* From butil.c -- utilities for SD tool programs */ -void print_ls_output(char *fname, char *link, int type, struct stat *statp); +void print_ls_output(char *fname, char *link, int type, struct stat *statp); JCR *setup_jcr(char *name, char *device, BSR *bsr, char *VolumeName); DEVICE *setup_to_access_device(JCR *jcr, int read_access); -void display_tape_error_status(JCR *jcr, DEVICE *dev); +void display_tape_error_status(JCR *jcr, DEVICE *dev); DEVRES *find_device_res(char *device_name, int read_access); /* From dev.c */ -DEVICE *init_dev(DEVICE *dev, DEVRES *device); -int open_dev(DEVICE *dev, char *VolName, int mode); -void close_dev(DEVICE *dev); -void force_close_dev(DEVICE *dev); -int truncate_dev(DEVICE *dev); -void term_dev(DEVICE *dev); -char * strerror_dev(DEVICE *dev); -void clrerror_dev(DEVICE *dev, int func); -int update_pos_dev(DEVICE *dev); -int rewind_dev(DEVICE *dev); -int load_dev(DEVICE *dev); -int offline_dev(DEVICE *dev); -int flush_dev(DEVICE *dev); -int weof_dev(DEVICE *dev, int num); -int write_block(DEVICE *dev); -int write_dev(DEVICE *dev, char *buf, size_t len); -int read_dev(DEVICE *dev, char *buf, size_t len); -int status_dev(DEVICE *dev, uint32_t *status); -int eod_dev(DEVICE *dev); -int fsf_dev(DEVICE *dev, int num); -int fsr_dev(DEVICE *dev, int num); -int bsf_dev(DEVICE *dev, int num); -int bsr_dev(DEVICE *dev, int num); -void attach_jcr_to_device(DEVICE *dev, JCR *jcr); -void detach_jcr_from_device(DEVICE *dev, JCR *jcr); -JCR *next_attached_jcr(DEVICE *dev, JCR *jcr); -int dev_can_write(DEVICE *dev); -int offline_or_rewind_dev(DEVICE *dev); -int reposition_dev(DEVICE *dev, uint32_t file, uint32_t block); +DEVICE *init_dev(DEVICE *dev, DEVRES *device); +int open_dev(DEVICE *dev, char *VolName, int mode); +void close_dev(DEVICE *dev); +void force_close_dev(DEVICE *dev); +int truncate_dev(DEVICE *dev); +void term_dev(DEVICE *dev); +char * strerror_dev(DEVICE *dev); +void clrerror_dev(DEVICE *dev, int func); +int update_pos_dev(DEVICE *dev); +int rewind_dev(DEVICE *dev); +int load_dev(DEVICE *dev); +int offline_dev(DEVICE *dev); +int flush_dev(DEVICE *dev); +int weof_dev(DEVICE *dev, int num); +int write_block(DEVICE *dev); +int write_dev(DEVICE *dev, char *buf, size_t len); +int read_dev(DEVICE *dev, char *buf, size_t len); +int status_dev(DEVICE *dev, uint32_t *status); +int eod_dev(DEVICE *dev); +int fsf_dev(DEVICE *dev, int num); +int fsr_dev(DEVICE *dev, int num); +int bsf_dev(DEVICE *dev, int num); +int bsr_dev(DEVICE *dev, int num); +void attach_jcr_to_device(DEVICE *dev, JCR *jcr); +void detach_jcr_from_device(DEVICE *dev, JCR *jcr); +JCR *next_attached_jcr(DEVICE *dev, JCR *jcr); +int dev_can_write(DEVICE *dev); +int offline_or_rewind_dev(DEVICE *dev); +int reposition_dev(DEVICE *dev, uint32_t file, uint32_t block); /* Get info about device */ -char * dev_name(DEVICE *dev); -char * dev_vol_name(DEVICE *dev); +char * dev_name(DEVICE *dev); +char * dev_vol_name(DEVICE *dev); uint32_t dev_block(DEVICE *dev); uint32_t dev_file(DEVICE *dev); -int dev_is_tape(DEVICE *dev); +int dev_is_tape(DEVICE *dev); /* From device.c */ -int open_device(DEVICE *dev); -int fixup_device_block_write_error(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); +int open_device(DEVICE *dev); +int fixup_device_block_write_error(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); void _lock_device(char *file, int line, DEVICE *dev); void _unlock_device(char *file, int line, DEVICE *dev); void _block_device(char *file, int line, DEVICE *dev, int state); @@ -122,47 +122,48 @@ void _steal_device_lock(char *file, int line, DEVICE *dev, bsteal_lock_t *hold, void _give_back_device_lock(char *file, int line, DEVICE *dev, bsteal_lock_t *hold); void set_new_volume_parameters(JCR *jcr, DEVICE *dev); void set_new_file_parameters(JCR *jcr, DEVICE *dev); +int device_is_unmounted(DEVICE *dev); /* From dircmd.c */ -void *connection_request(void *arg); +void *connection_request(void *arg); /* From fd_cmds.c */ -void run_job(JCR *jcr); +void run_job(JCR *jcr); /* From job.c */ -void stored_free_jcr(JCR *jcr); -void connection_from_filed(void *arg); -void handle_filed_connection(BSOCK *fd, char *job_name); +void stored_free_jcr(JCR *jcr); +void connection_from_filed(void *arg); +void handle_filed_connection(BSOCK *fd, char *job_name); /* From label.c */ -int read_dev_volume_label(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); -void create_session_label(JCR *jcr, DEV_RECORD *rec, int label); -void create_volume_label(DEVICE *dev, char *VolName); -int write_volume_label_to_dev(JCR *jcr, DEVRES *device, char *VolName, char *PoolName); -int write_session_label(JCR *jcr, DEV_BLOCK *block, int label); -int write_volume_label_to_block(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); -void dump_volume_label(DEVICE *dev); -void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose); -int unser_volume_label(DEVICE *dev, DEV_RECORD *rec); -int unser_session_label(SESSION_LABEL *label, DEV_RECORD *rec); +int read_dev_volume_label(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); +void create_session_label(JCR *jcr, DEV_RECORD *rec, int label); +void create_volume_label(DEVICE *dev, char *VolName, char *PoolName); +int write_volume_label_to_dev(JCR *jcr, DEVRES *device, char *VolName, char *PoolName); +int write_session_label(JCR *jcr, DEV_BLOCK *block, int label); +int write_volume_label_to_block(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); +void dump_volume_label(DEVICE *dev); +void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose); +int unser_volume_label(DEVICE *dev, DEV_RECORD *rec); +int unser_session_label(SESSION_LABEL *label, DEV_RECORD *rec); /* From match_bsr.c */ int match_bsr(BSR *bsr, DEV_RECORD *rec, VOLUME_LABEL *volrec, - SESSION_LABEL *sesrec); + SESSION_LABEL *sesrec); int match_bsr_block(BSR *bsr, DEV_BLOCK *block); void position_bsr_block(BSR *bsr, DEV_BLOCK *block); BSR *find_next_bsr(BSR *root_bsr, DEVICE *dev); /* From mount.c */ -int mount_next_write_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, int release); -int mount_next_read_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); -void release_volume(JCR *jcr, DEVICE *dev); +int mount_next_write_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, int release); +int mount_next_read_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); +void release_volume(JCR *jcr, DEVICE *dev); /* From autochanger.c */ -int autoload_device(JCR *jcr, DEVICE *dev, int writing, BSOCK *dir); -int autochanger_list(JCR *jcr, DEVICE *dev, BSOCK *dir); -void invalidate_slot_in_catalog(JCR *jcr); +int autoload_device(JCR *jcr, DEVICE *dev, int writing, BSOCK *dir); +int autochanger_list(JCR *jcr, DEVICE *dev, BSOCK *dir); +void invalidate_slot_in_catalog(JCR *jcr); /* From parse_bsr.c */ @@ -177,11 +178,11 @@ extern void create_vol_list(JCR *jcr); /* From record.c */ char *FI_to_ascii(int fi); char *stream_to_ascii(int stream, int fi); -int write_record_to_block(DEV_BLOCK *block, DEV_RECORD *rec); -int can_write_record_to_block(DEV_BLOCK *block, DEV_RECORD *rec); -int read_record_from_block(DEV_BLOCK *block, DEV_RECORD *rec); +int write_record_to_block(DEV_BLOCK *block, DEV_RECORD *rec); +int can_write_record_to_block(DEV_BLOCK *block, DEV_RECORD *rec); +int read_record_from_block(DEV_BLOCK *block, DEV_RECORD *rec); DEV_RECORD *new_record(); -void free_record(DEV_RECORD *rec); +void free_record(DEV_RECORD *rec); /* From read_record.c */ int read_records(JCR *jcr, DEVICE *dev,