From 0eb8a11d7d736b0c05c8771324292bd24ad1550c Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Fri, 16 Jul 2004 21:27:10 +0000 Subject: [PATCH] More DCR changes git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1471 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/filed/backup.c | 6 +- bacula/src/filed/restore.c | 6 +- bacula/src/stored/acquire.c | 19 +-- bacula/src/stored/append.c | 2 +- bacula/src/stored/askdir.c | 52 ++++--- bacula/src/stored/autochanger.c | 25 ++-- bacula/src/stored/bcopy.c | 17 +-- bacula/src/stored/bextract.c | 17 +-- bacula/src/stored/block.c | 20 +-- bacula/src/stored/bls.c | 17 +-- bacula/src/stored/bscan.c | 17 +-- bacula/src/stored/btape.c | 32 +++-- bacula/src/stored/dev.c | 8 ++ bacula/src/stored/dev.h | 4 + bacula/src/stored/device.c | 33 +++-- bacula/src/stored/dircmd.c | 27 ++-- bacula/src/stored/mount.c | 20 +-- bacula/src/stored/protos.h | 240 ++++++++++++++++---------------- 18 files changed, 312 insertions(+), 250 deletions(-) diff --git a/bacula/src/filed/backup.c b/bacula/src/filed/backup.c index 6adc77ecc3..8680c9ea64 100644 --- a/bacula/src/filed/backup.c +++ b/bacula/src/filed/backup.c @@ -483,7 +483,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr) /* If there is no default ACL get standard ACL */ myAcl = acl_get_file(ff_pkt->fname, ACL_TYPE_ACCESS); if (!myAcl) { - Emsg1(M_WARNING, 0, "Error while trying to get ACL of directory: %s!\n", ff_pkt->fname); + Jmsg1(jcr, M_WARNING, 0, "Error while trying to get ACL of directory: %s!\n", ff_pkt->fname); } } acl_text = acl_to_any_text(myAcl, NULL, ',', TEXT_ABBREVIATE); @@ -493,7 +493,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr) /* Files or links */ acl_t myAcl = acl_get_file(ff_pkt->fname, ACL_TYPE_ACCESS); if (!myAcl) { - Emsg1(M_WARNING, 0, "Error while trying to get ACL of file: %s!\n", ff_pkt->fname); + Jmsg1(jcr, M_WARNING, 0, "Error while trying to get ACL of file: %s!\n", ff_pkt->fname); acl_free(myAcl); } acl_text = acl_to_any_text(myAcl, NULL, ',', TEXT_ABBREVIATE); @@ -523,7 +523,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr) sd->msglen = 0; bclose(&ff_pkt->bfd); set_jcr_job_status(jcr, JS_ErrorTerminated); - Emsg1(M_WARNING, 0, "Error while trying to send ACL of %s to SD!\n", ff_pkt->fname); + Jmsg1(jcr, M_FATAL, 0, "Error while trying to send ACL of %s to SD!\n", ff_pkt->fname); } else { jcr->JobBytes += sd->msglen; sd->msg = msgsave; diff --git a/bacula/src/filed/restore.c b/bacula/src/filed/restore.c index e2da0c849a..af7e6bdfdd 100644 --- a/bacula/src/filed/restore.c +++ b/bacula/src/filed/restore.c @@ -320,7 +320,7 @@ void do_restore(JCR *jcr) /* Recover ACL from stream and check it */ acl = acl_from_text(sd->msg); if (acl_valid(acl) != 0) { - Emsg1(M_WARNING, 0, "Failure in the ACL of %s! FD is not able to restore it!\n", jcr->last_fname); + Jmsg1(jcr, M_WARNING, 0, "Failure in the ACL of %s! FD is not able to restore it!\n", jcr->last_fname); acl_free(acl); } @@ -329,11 +329,11 @@ void do_restore(JCR *jcr) /* Directory */ if (acl_set_file(jcr->last_fname, ACL_TYPE_DEFAULT, acl) != 0 && acl_set_file(jcr->last_fname, ACL_TYPE_ACCESS, acl) != 0) { - Emsg1(M_WARNING, 0, "Error! Can't restore ACL of directory: %s! Maybe system does not support ACLs!\n", jcr->last_fname); + Jmsg1(jcr, M_WARNING, 0, "Error! Can't restore ACL of directory: %s! Maybe system does not support ACLs!\n", jcr->last_fname); } /* File or Link */ } else if (acl_set_file(jcr->last_fname, ACL_TYPE_ACCESS, acl) != 0) { - Emsg1(M_WARNING, 0, "Error! Can't restore ACL of file: %s! Maybe system does not support ACLs!\n", jcr->last_fname); + Jmsg1(jcr, M_WARNING, 0, "Error! Can't restore ACL of file: %s! Maybe system does not support ACLs!\n", jcr->last_fname); } acl_free(acl); Dmsg1(200, "ACL of file: %s successfully restored!", jcr->last_fname); diff --git a/bacula/src/stored/acquire.c b/bacula/src/stored/acquire.c index 026fccc29f..a1b2d5458a 100644 --- a/bacula/src/stored/acquire.c +++ b/bacula/src/stored/acquire.c @@ -46,11 +46,13 @@ DCR *new_dcr(JCR *jcr, DEVICE *dev) dcr->rec = new_record(); dcr->spool_fd = -1; dcr->max_spool_size = dev->device->max_spool_size; +// dev->attached_dcrs->append(dcr); return dcr; } void free_dcr(DCR *dcr) { +// dcr->dev->attached_dcrs->remove(dcr); if (dcr->block) { free_block(dcr->block); } @@ -171,7 +173,7 @@ DCR *acquire_device_for_read(JCR *jcr) default_path: tape_previously_mounted = true; Dmsg0(200, "dir_get_volume_info\n"); - if (!dir_get_volume_info(jcr, GET_VOL_INFO_FOR_READ)) { + if (!dir_get_volume_info(dcr, GET_VOL_INFO_FOR_READ)) { Jmsg1(jcr, M_WARNING, 0, "%s", jcr->errmsg); } /* Call autochanger only once unless ask_sysop called */ @@ -179,7 +181,7 @@ default_path: int stat; Dmsg2(200, "calling autoload Vol=%s Slot=%d\n", jcr->VolumeName, jcr->VolCatInfo.Slot); - stat = autoload_device(jcr, dev, 0, NULL); + stat = autoload_device(dcr, 0, NULL); if (stat > 0) { try_autochanger = false; continue; @@ -187,7 +189,7 @@ default_path: } /* Mount a specific volume and no other */ Dmsg0(200, "calling dir_ask_sysop\n"); - if (!dir_ask_sysop_to_mount_volume(jcr)) { + if (!dir_ask_sysop_to_mount_volume(dcr)) { goto get_out; /* error return */ } try_autochanger = true; /* permit using autochanger again */ @@ -262,8 +264,8 @@ DCR *acquire_device_for_append(JCR *jcr) */ pm_strcpy(&jcr->VolumeName, dev->VolHdr.VolName); bstrncpy(dcr->VolumeName, dev->VolHdr.VolName, sizeof(dcr->VolumeName)); - if (!dir_get_volume_info(jcr, GET_VOL_INFO_FOR_WRITE) && - !(dir_find_next_appendable_volume(jcr) && + if (!dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE) && + !(dir_find_next_appendable_volume(dcr) && strcmp(dev->VolHdr.VolName, jcr->VolumeName) == 0)) { /* wrong tape mounted */ if (dev->num_writers != 0) { DEVICE *d = ((DEVRES *)dev->device)->dev; @@ -360,7 +362,8 @@ ok_out: */ bool release_device(JCR *jcr) { - DEVICE *dev = jcr->dcr->dev; + DCR *dcr = jcr->dcr; + DEVICE *dev = dcr->dev; lock_device(dev); Dmsg1(100, "release_device device is %s\n", dev_is_tape(dev)?"tape":"disk"); if (dev_state(dev, ST_READ)) { @@ -376,7 +379,7 @@ bool release_device(JCR *jcr) Dmsg1(100, "There are %d writers in release_device\n", dev->num_writers); if (dev_state(dev, ST_LABEL)) { Dmsg0(100, "dir_create_jobmedia_record. Release\n"); - if (!dir_create_jobmedia_record(jcr)) { + if (!dir_create_jobmedia_record(dcr)) { Jmsg(jcr, M_ERROR, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), jcr->VolCatInfo.VolCatName, jcr->Job); } @@ -388,7 +391,7 @@ bool release_device(JCR *jcr) dev->VolCatInfo.VolCatJobs++; /* increment number of jobs */ /* Note! do volume update before close, which zaps VolCatInfo */ Dmsg0(100, "dir_update_vol_info. Release0\n"); - dir_update_volume_info(jcr, false); /* send Volume info to Director */ + dir_update_volume_info(dcr, false); /* send Volume info to Director */ } if (!dev->num_writers && (!dev_is_tape(dev) || !dev_cap(dev, CAP_ALWAYSOPEN))) { diff --git a/bacula/src/stored/append.c b/bacula/src/stored/append.c index cbe87c3be0..2a8df378ff 100644 --- a/bacula/src/stored/append.c +++ b/bacula/src/stored/append.c @@ -209,7 +209,7 @@ int do_append_data(JCR *jcr) jcr->dir_bsock->spool = true; } Dmsg0(200, "Send attributes.\n"); - if (!dir_update_file_attributes(jcr, &rec)) { + if (!dir_update_file_attributes(dcr, &rec)) { jcr->dir_bsock->spool = false; Jmsg(jcr, M_FATAL, 0, _("Error updating file attributes. ERR=%s\n"), bnet_strerror(jcr->dir_bsock)); diff --git a/bacula/src/stored/askdir.c b/bacula/src/stored/askdir.c index 116a650f4d..9677fe50cf 100644 --- a/bacula/src/stored/askdir.c +++ b/bacula/src/stored/askdir.c @@ -54,7 +54,7 @@ static char OK_media[] = "1000 OK VolName=%127s VolJobs=%u VolFiles=%u" static char OK_create[] = "1000 OK CreateJobMedia\n"; /* Forward referenced functions */ -static int wait_for_sysop(JCR *jcr, DEVICE *dev); +static int wait_for_sysop(DCR *dcr); /* * Send current JobStatus to Director @@ -73,10 +73,10 @@ bool dir_send_job_status(JCR *jcr) * Returns: true on success and vol info in jcr->VolCatInfo * false on failure */ -static bool do_get_volume_info(JCR *jcr) +static bool do_get_volume_info(DCR *dcr) { + JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; - DCR *dcr = jcr->dcr; VOLUME_CAT_INFO vol; int n; int InChanger; @@ -126,8 +126,9 @@ static bool do_get_volume_info(JCR *jcr) * * Volume information returned in jcr */ -bool dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) +bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { + JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; bstrncpy(jcr->VolCatInfo.VolCatName, jcr->VolumeName, sizeof(jcr->VolCatInfo.VolCatName)); @@ -135,7 +136,7 @@ bool dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) bash_spaces(jcr->VolCatInfo.VolCatName); bnet_fsend(dir, Get_Vol_Info, jcr->Job, jcr->VolCatInfo.VolCatName, writing==GET_VOL_INFO_FOR_WRITE?1:0); - return do_get_volume_info(jcr); + return do_get_volume_info(dcr); } @@ -148,15 +149,16 @@ bool dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) * Volume information returned in jcr * */ -bool dir_find_next_appendable_volume(JCR *jcr) +bool dir_find_next_appendable_volume(DCR *dcr) { + JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; JCR *njcr; Dmsg0(200, "dir_find_next_appendable_volume\n"); for (int vol_index=1; vol_index < 3; vol_index++) { bnet_fsend(dir, Find_media, jcr->Job, vol_index); - if (do_get_volume_info(jcr)) { + if (do_get_volume_info(dcr)) { Dmsg2(200, "JobId=%d got possible Vol=%s\n", jcr->JobId, jcr->VolumeName); bool found = false; /* @@ -200,10 +202,11 @@ bool dir_find_next_appendable_volume(JCR *jcr) * back to the director. The information comes from the * dev record. */ -bool dir_update_volume_info(JCR *jcr, bool label) +bool dir_update_volume_info(DCR *dcr, bool label) { + JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; - DEVICE *dev = jcr->dcr->dev; + DEVICE *dev = dcr->dev; time_t LastWritten = time(NULL); char ed1[50], ed2[50], ed3[50], ed4[50]; VOLUME_CAT_INFO *vol = &dev->VolCatInfo; @@ -239,7 +242,7 @@ bool dir_update_volume_info(JCR *jcr, bool label) Dmsg1(120, "update_volume_info(): %s", dir->msg); unbash_spaces(vol->VolCatName); - if (!do_get_volume_info(jcr)) { + if (!do_get_volume_info(dcr)) { Jmsg(jcr, M_ERROR, 0, "%s", jcr->errmsg); return false; } @@ -252,10 +255,10 @@ bool dir_update_volume_info(JCR *jcr, bool label) /* * After writing a Volume, create the JobMedia record. */ -bool dir_create_jobmedia_record(JCR *jcr) +bool dir_create_jobmedia_record(DCR *dcr) { + JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; - DCR *dcr = jcr->dcr; if (!dcr->WroteVol) { return true; /* nothing written to tape */ @@ -286,8 +289,9 @@ bool dir_create_jobmedia_record(JCR *jcr) /* * Update File Attribute data */ -bool dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) +bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { + JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; ser_declare; @@ -324,12 +328,13 @@ bool dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) * actually be mounted. The calling routine must read it and * verify the label. */ -bool dir_ask_sysop_to_create_appendable_volume(JCR *jcr) +bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { int stat = 0, jstat; bool unmounted; bool first = true; - DEVICE *dev = jcr->dcr->dev; + DEVICE *dev = dcr->dev; + JCR *jcr = dcr->jcr; Dmsg0(130, "enter dir_ask_sysop_to_create_appendable_volume\n"); ASSERT(dev->dev_blocked); @@ -342,7 +347,7 @@ bool dir_ask_sysop_to_create_appendable_volume(JCR *jcr) return false; } /* First pass, we *know* there are no appendable volumes, so no need to call */ - if (!first && dir_find_next_appendable_volume(jcr)) { /* get suggested volume */ + if (!first && dir_find_next_appendable_volume(dcr)) { /* get suggested volume */ unmounted = (dev->dev_blocked == BST_UNMOUNTED) || (dev->dev_blocked == BST_UNMOUNTED_WAITING_FOR_SYSOP); /* @@ -386,7 +391,7 @@ Please use the \"label\" command to create a new Volume for:\n\ jcr->JobStatus = jstat; dir_send_job_status(jcr); - stat = wait_for_sysop(jcr, dev); + stat = wait_for_sysop(dcr); if (dev->poll) { Dmsg1(200, "Poll timeout in create append vol on device %s\n", dev_name(dev)); continue; @@ -416,7 +421,7 @@ Please use the \"label\" command to create a new Volume for:\n\ /* If no VolumeName, and cannot get one, try again */ if (jcr->VolumeName[0] == 0 && !job_canceled(jcr) && - !dir_find_next_appendable_volume(jcr)) { + !dir_find_next_appendable_volume(dcr)) { Jmsg(jcr, M_MOUNT, 0, _( "Someone woke me up, but I cannot find any appendable\n\ volumes for Job=%s.\n"), jcr->Job); @@ -453,11 +458,12 @@ volumes for Job=%s.\n"), jcr->Job); * Note, must create dev->errmsg on error return. * */ -bool dir_ask_sysop_to_mount_volume(JCR *jcr) +bool dir_ask_sysop_to_mount_volume(DCR *dcr) { int stat = 0; const char *msg; - DEVICE *dev = jcr->dcr->dev; + DEVICE *dev = dcr->dev; + JCR *jcr = dcr->jcr; Dmsg0(130, "enter dir_ask_sysop_to_mount_volume\n"); if (!jcr->VolumeName[0]) { @@ -483,7 +489,7 @@ bool dir_ask_sysop_to_mount_volume(JCR *jcr) jcr->JobStatus = JS_WaitMount; dir_send_job_status(jcr); - stat = wait_for_sysop(jcr, dev); /* wait on device */ + stat = wait_for_sysop(dcr); ; /* wait on device */ if (dev->poll) { Dmsg1(200, "Poll timeout in mount vol on device %s\n", dev_name(dev)); Dmsg1(200, "Blocked=%d\n", dev->dev_blocked); @@ -522,7 +528,7 @@ bool dir_ask_sysop_to_mount_volume(JCR *jcr) /* * Wait for SysOp to mount a tape */ -static int wait_for_sysop(JCR *jcr, DEVICE *dev) +static int wait_for_sysop(DCR *dcr) { struct timeval tv; struct timezone tz; @@ -532,6 +538,8 @@ static int wait_for_sysop(JCR *jcr, DEVICE *dev) int stat = 0; int add_wait; bool unmounted; + DEVICE *dev = dcr->dev; + JCR *jcr = dcr->jcr; P(dev->mutex); unmounted = (dev->dev_blocked == BST_UNMOUNTED) || diff --git a/bacula/src/stored/autochanger.c b/bacula/src/stored/autochanger.c index 447fa8bb28..d73c564092 100644 --- a/bacula/src/stored/autochanger.c +++ b/bacula/src/stored/autochanger.c @@ -48,8 +48,10 @@ static int get_autochanger_loaded_slot(JCR *jcr); * 0 on failure (no changer available) * -1 on error on autochanger */ -int autoload_device(JCR *jcr, DEVICE *dev, int writing, BSOCK *dir) +int autoload_device(DCR *dcr, int writing, BSOCK *dir) { + JCR *jcr = dcr->jcr; + DEVICE *dev = dcr->dev; int slot = jcr->VolCatInfo.Slot; int drive = jcr->device->drive_index; int rtn_stat = -1; /* error status */ @@ -62,7 +64,7 @@ int autoload_device(JCR *jcr, DEVICE *dev, int writing, BSOCK *dir) if (dir) { return 0; /* For user, bail out right now */ } - if (dir_find_next_appendable_volume(jcr)) { + if (dir_find_next_appendable_volume(dcr)) { slot = jcr->VolCatInfo.Slot; } else { slot = 0; @@ -168,15 +170,17 @@ static int get_autochanger_loaded_slot(JCR *jcr) * The Volume is not in the correct slot, so mark this * Volume as not being in the Changer. */ -void invalid_slot_in_catalog(JCR *jcr, DEVICE *dev) +void invalid_slot_in_catalog(DCR *dcr) { + JCR *jcr = dcr->jcr; + DEVICE *dev = dcr->dev; Jmsg(jcr, M_ERROR, 0, _("Autochanger Volume \"%s\" not found in slot %d.\n" " Setting slot to zero in catalog.\n"), jcr->VolCatInfo.VolCatName, jcr->VolCatInfo.Slot); jcr->VolCatInfo.InChanger = false; dev->VolCatInfo.InChanger = false; Dmsg0(100, "update vol info in mount\n"); - dir_update_volume_info(jcr, true); /* set new status */ + dir_update_volume_info(dcr, true); /* set new status */ } /* @@ -184,8 +188,10 @@ void invalid_slot_in_catalog(JCR *jcr, DEVICE *dev) * with their barcodes. * We assume that it is always the Console that is calling us. */ -int autochanger_list(JCR *jcr, DEVICE *dev, BSOCK *dir) +bool autochanger_list(DCR *dcr, BSOCK *dir) { + DEVICE *dev = dcr->dev; + JCR *jcr = dcr->jcr; uint32_t timeout = jcr->device->max_changer_wait; POOLMEM *changer; BPIPE *bpipe; @@ -195,7 +201,7 @@ int autochanger_list(JCR *jcr, DEVICE *dev, BSOCK *dir) if (!dev_cap(dev, CAP_AUTOCHANGER) || !jcr->device->changer_name || !jcr->device->changer_command) { bnet_fsend(dir, _("3993 Not a autochanger device.\n")); - return 0; + return false; } changer = get_pool_memory(PM_FNAME); @@ -220,7 +226,8 @@ int autochanger_list(JCR *jcr, DEVICE *dev, BSOCK *dir) bpipe = open_bpipe(changer, timeout, "r"); if (!bpipe) { bnet_fsend(dir, _("3993 Open bpipe failed.\n")); - goto bail_out; + free_pool_memory(changer); + return false; } /* Get output from changer */ while (fgets(dir->msg, len, bpipe->rfd)) { @@ -230,13 +237,11 @@ int autochanger_list(JCR *jcr, DEVICE *dev, BSOCK *dir) bnet_sig(dir, BNET_EOD); close_bpipe(bpipe); -bail_out: free_pool_memory(changer); - return 1; + return true; } - /* * Edit codes into ChangerCommand * %% = % diff --git a/bacula/src/stored/bcopy.c b/bacula/src/stored/bcopy.c index ead6fa2e29..29e2c9e483 100644 --- a/bacula/src/stored/bcopy.c +++ b/bacula/src/stored/bcopy.c @@ -259,18 +259,19 @@ static bool record_cb(JCR *in_jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *re /* Dummies to replace askdir.c */ -bool dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) { return 1;} -bool dir_find_next_appendable_volume(JCR *jcr) { return 1;} -bool dir_update_volume_info(JCR *jcr, bool relabel) { return 1; } -bool dir_create_jobmedia_record(JCR *jcr) { return 1; } -bool dir_ask_sysop_to_create_appendable_volume(JCR *jcr) { return 1; } -bool dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) { return 1;} +bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { return 1;} +bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} +bool dir_update_volume_info(DCR *dcr, bool relabel) { return 1; } +bool dir_create_jobmedia_record(DCR *dcr) { return 1; } +bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } +bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} -bool dir_ask_sysop_to_mount_volume(JCR *jcr) +bool dir_ask_sysop_to_mount_volume(DCR *dcr) { - DEVICE *dev = jcr->dcr->dev; + JCR *jcr = dcr->jcr; + DEVICE *dev = dcr->dev; fprintf(stderr, "Mount Volume \"%s\" on device %s and press return when ready: ", jcr->VolumeName, dev_name(dev)); getchar(); diff --git a/bacula/src/stored/bextract.c b/bacula/src/stored/bextract.c index ce8898bc71..d68bd73be8 100644 --- a/bacula/src/stored/bextract.c +++ b/bacula/src/stored/bextract.c @@ -436,18 +436,19 @@ static bool record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec) } /* Dummies to replace askdir.c */ -bool dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) { return 1;} -bool dir_find_next_appendable_volume(JCR *jcr) { return 1;} -bool dir_update_volume_info(JCR *jcr, bool relabel) { return 1; } -bool dir_create_jobmedia_record(JCR *jcr) { return 1; } -bool dir_ask_sysop_to_create_appendable_volume(JCR *jcr) { return 1; } -bool dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) { return 1;} +bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { return 1;} +bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} +bool dir_update_volume_info(DCR *dcr, bool relabel) { return 1; } +bool dir_create_jobmedia_record(DCR *dcr) { return 1; } +bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } +bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} -bool dir_ask_sysop_to_mount_volume(JCR *jcr) +bool dir_ask_sysop_to_mount_volume(DCR *dcr) { - DEVICE *dev = jcr->dcr->dev; + JCR *jcr = dcr->jcr; + DEVICE *dev = dcr->dev; fprintf(stderr, "Mount Volume \"%s\" on device %s and press return when ready: ", jcr->VolumeName, dev_name(dev)); getchar(); diff --git a/bacula/src/stored/block.c b/bacula/src/stored/block.c index 7174a89e96..91b6a55466 100644 --- a/bacula/src/stored/block.c +++ b/bacula/src/stored/block.c @@ -344,20 +344,20 @@ bool write_block_to_device(DCR *dcr, DEV_BLOCK *block) */ if (dcr->NewVol || dcr->NewFile) { /* Create a jobmedia record for this job */ - if (!dir_create_jobmedia_record(jcr)) { + if (!dir_create_jobmedia_record(dcr)) { dev->dev_errno = EIO; Jmsg(jcr, M_ERROR, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), jcr->VolCatInfo.VolCatName, jcr->Job); - set_new_volume_parameters(jcr, dev); + set_new_volume_parameters(dcr); stat = false; goto bail_out; } if (dcr->NewVol) { /* Note, setting a new volume also handles any pending new file */ - set_new_volume_parameters(jcr, dev); + set_new_volume_parameters(dcr); dcr->NewFile = false; /* this handled for new file too */ } else { - set_new_file_parameters(jcr, dev); + set_new_file_parameters(dcr); } } @@ -459,7 +459,7 @@ bool write_block_to_dev(DCR *dcr, DEV_BLOCK *block) /* Don't do update after second EOF or file count will be wrong */ Dmsg0(100, "dir_update_volume_info\n"); dev->VolCatInfo.VolCatFiles = dev->file; - dir_update_volume_info(jcr, false); + dir_update_volume_info(dcr, false); if (dev_cap(dev, CAP_TWOEOF) && weof_dev(dev, 1) != 0) { /* write eof */ Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg); dev->VolCatInfo.VolCatErrors++; @@ -481,7 +481,7 @@ bool write_block_to_dev(DCR *dcr, DEV_BLOCK *block) dev->state |= (ST_EOF | ST_EOT | ST_WEOT); Dmsg0(100, "dir_update_volume_info\n"); dev->VolCatInfo.VolCatFiles = dev->file; - dir_update_volume_info(jcr, false); + dir_update_volume_info(dcr, false); dev->dev_errno = ENOSPC; return false; } @@ -489,8 +489,8 @@ bool write_block_to_dev(DCR *dcr, DEV_BLOCK *block) /* Create a JobMedia record so restore can seek */ Dmsg0(100, "dir_update_volume_info\n"); dev->VolCatInfo.VolCatFiles = dev->file; - dir_update_volume_info(jcr, false); - if (!dir_create_jobmedia_record(jcr)) { + dir_update_volume_info(dcr, false); + if (!dir_create_jobmedia_record(dcr)) { dev->dev_errno = EIO; Jmsg(jcr, M_ERROR, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), dcr->VolCatInfo.VolCatName, jcr->Job); @@ -509,7 +509,7 @@ bool write_block_to_dev(DCR *dcr, DEV_BLOCK *block) } mjcr->dcr->NewFile = true; /* set reminder to do set_new_file_params */ } - set_new_file_parameters(jcr, dev); + set_new_file_parameters(dcr); } dev->VolCatInfo.VolCatWrites++; @@ -567,7 +567,7 @@ bool write_block_to_dev(DCR *dcr, DEV_BLOCK *block) } Dmsg0(100, "dir_update_volume_info\n"); dev->VolCatInfo.VolCatFiles = dev->file; - dir_update_volume_info(jcr, false); + dir_update_volume_info(dcr, false); if (dev_cap(dev, CAP_TWOEOF) && weof_dev(dev, 1) != 0) { /* end the tape */ dev->VolCatInfo.VolCatErrors++; Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg); diff --git a/bacula/src/stored/bls.c b/bacula/src/stored/bls.c index 5259008864..65e3a2a13a 100644 --- a/bacula/src/stored/bls.c +++ b/bacula/src/stored/bls.c @@ -421,18 +421,19 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess /* Dummies to replace askdir.c */ -bool dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) { return 1;} -bool dir_find_next_appendable_volume(JCR *jcr) { return 1;} -bool dir_update_volume_info(JCR *jcr, bool relabel) { return 1; } -bool dir_create_jobmedia_record(JCR *jcr) { return 1; } -bool dir_ask_sysop_to_create_appendable_volume(JCR *jcr) { return 1; } -bool dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) { return 1;} +bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { return 1;} +bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} +bool dir_update_volume_info(DCR *dcr, bool relabel) { return 1; } +bool dir_create_jobmedia_record(DCR *dcr) { return 1; } +bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } +bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} -bool dir_ask_sysop_to_mount_volume(JCR *jcr) +bool dir_ask_sysop_to_mount_volume(DCR *dcr) { - DEVICE *dev = jcr->dcr->dev; + JCR *jcr = dcr->jcr; + DEVICE *dev = dcr->dev; fprintf(stderr, "Mount Volume \"%s\" on device %s and press return when ready: ", jcr->VolumeName, dev_name(dev)); getchar(); diff --git a/bacula/src/stored/bscan.c b/bacula/src/stored/bscan.c index b972422587..add9076726 100644 --- a/bacula/src/stored/bscan.c +++ b/bacula/src/stored/bscan.c @@ -1158,18 +1158,19 @@ static JCR *create_jcr(JOB_DBR *jr, DEV_RECORD *rec, uint32_t JobId) } /* Dummies to replace askdir.c */ -bool dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) { return 1;} -bool dir_find_next_appendable_volume(JCR *jcr) { return 1;} -bool dir_update_volume_info(JCR *jcr, bool relabel) { return 1; } -bool dir_create_jobmedia_record(JCR *jcr) { return 1; } -bool dir_ask_sysop_to_create_appendable_volume(JCR *jcr) { return 1; } -bool dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) { return 1;} +bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { return 1;} +bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} +bool dir_update_volume_info(DCR *dcr, bool relabel) { return 1; } +bool dir_create_jobmedia_record(DCR *dcr) { return 1; } +bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } +bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} -bool dir_ask_sysop_to_mount_volume(JCR *jcr) +bool dir_ask_sysop_to_mount_volume(DCR *dcr) { - DEVICE *dev = jcr->dcr->dev; + DEVICE *dev = dcr->dev; + JCR *jcr = dcr->jcr; fprintf(stderr, _("Mount Volume \"%s\" on device \"%s\" and press return when ready: "), jcr->VolumeName, dev_name(dev)); getchar(); diff --git a/bacula/src/stored/btape.c b/bacula/src/stored/btape.c index ea2e4ea356..8f0199565d 100644 --- a/bacula/src/stored/btape.c +++ b/bacula/src/stored/btape.c @@ -1977,7 +1977,7 @@ static void do_unfill() if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) { offline_dev(dev); } - autochanger = autoload_device(jcr, dev, 1, NULL); + autochanger = autoload_device(dcr, 1, NULL); if (!autochanger) { force_close_dev(dev); get_cmd(_("Mount first tape. Press enter when ready: ")); @@ -2039,7 +2039,7 @@ static void do_unfill() set_volume_name("TestVolume2", 2); jcr->bsr = NULL; create_vol_list(jcr); - autochanger = autoload_device(jcr, dev, 1, NULL); + autochanger = autoload_device(dcr, 1, NULL); if (!autochanger) { force_close_dev(dev); get_cmd(_("Mount second tape. Press enter when ready: ")); @@ -2509,41 +2509,44 @@ get_cmd(const char *prompt) } /* Dummies to replace askdir.c */ -bool dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) { return 1;} +bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} -bool dir_update_volume_info(JCR *jcr, bool relabel) +bool dir_update_volume_info(DCR *dcr, bool relabel) { return 1; } -bool dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) +bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { + JCR *jcr = dcr->jcr; Dmsg0(20, "Enter dir_get_volume_info\n"); bstrncpy(jcr->VolCatInfo.VolCatName, jcr->VolumeName, sizeof(jcr->VolCatInfo.VolCatName)); return 1; } -bool dir_create_jobmedia_record(JCR *jcr) +bool dir_create_jobmedia_record(DCR *dcr) { - jcr->dcr->WroteVol = false; + dcr->WroteVol = false; return 1; } -bool dir_find_next_appendable_volume(JCR *jcr) +bool dir_find_next_appendable_volume(DCR *dcr) { + JCR *jcr = dcr->jcr; Dmsg1(20, "Enter dir_find_next_appendable_volume. stop=%d\n", stop); return jcr->VolumeName[0] != 0; } -bool dir_ask_sysop_to_mount_volume(JCR *jcr) +bool dir_ask_sysop_to_mount_volume(DCR *dcr) { - DEVICE *dev = jcr->dcr->dev; + DEVICE *dev = dcr->dev; + JCR *jcr = dcr->jcr; Dmsg0(20, "Enter dir_ask_sysop_to_mount_volume\n"); if (jcr->VolumeName[0] == 0) { - return dir_ask_sysop_to_create_appendable_volume(jcr); + return dir_ask_sysop_to_create_appendable_volume(dcr); } /* Close device so user can use autochanger if desired */ if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) { @@ -2562,10 +2565,11 @@ bool dir_ask_sysop_to_mount_volume(JCR *jcr) return true; } -bool dir_ask_sysop_to_create_appendable_volume(JCR *jcr) +bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { bool autochanger; - DEVICE *dev = jcr->dcr->dev; + DEVICE *dev = dcr->dev; + JCR *jcr = dcr->jcr; Dmsg0(20, "Enter dir_ask_sysop_to_create_appendable_volume\n"); if (stop == 0) { set_volume_name("TestVolume1", 1); @@ -2576,7 +2580,7 @@ bool dir_ask_sysop_to_create_appendable_volume(JCR *jcr) if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) { offline_dev(dev); } - autochanger = autoload_device(jcr, dev, 1, NULL); + autochanger = autoload_device(dcr, 1, NULL); if (!autochanger) { force_close_dev(dev); fprintf(stderr, "Mount blank Volume on device %s and press return when ready: ", diff --git a/bacula/src/stored/dev.c b/bacula/src/stored/dev.c index 554a5f4831..d3253f5eab 100644 --- a/bacula/src/stored/dev.c +++ b/bacula/src/stored/dev.c @@ -197,6 +197,14 @@ init_dev(DEVICE *dev, DEVRES *device) Mmsg1(&dev->errmsg, _("Unable to init mutex: ERR=%s\n"), strerror(errstat)); Emsg0(M_FATAL, 0, dev->errmsg); } +#ifdef xxx + if ((errstat = rwl_init(&dev->lock)) != 0) { + dev->dev_errno = errstat; + Mmsg1(&dev->errmsg, _("Unable to init mutex: ERR=%s\n"), strerror(errstat)); + Emsg0(M_FATAL, 0, dev->errmsg); + } +#endif + dev->fd = -1; dev->attached_dcrs = new dlist(dcr, &dcr->dev_link); Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev_is_tape(dev), dev->dev_name); diff --git a/bacula/src/stored/dev.h b/bacula/src/stored/dev.h index 1500592bc7..4efe4bd7d4 100644 --- a/bacula/src/stored/dev.h +++ b/bacula/src/stored/dev.h @@ -172,6 +172,10 @@ public: 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 */ diff --git a/bacula/src/stored/device.c b/bacula/src/stored/device.c index 8596c055af..77fe763489 100644 --- a/bacula/src/stored/device.c +++ b/bacula/src/stored/device.c @@ -100,7 +100,7 @@ bool fixup_device_block_write_error(DCR *dcr, DEV_BLOCK *block) unlock_device(dev); /* Create a jobmedia record for this job */ - if (!dir_create_jobmedia_record(jcr)) { + if (!dir_create_jobmedia_record(dcr)) { Jmsg(jcr, M_ERROR, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), jcr->VolCatInfo.VolCatName, jcr->Job); P(dev->mutex); @@ -113,7 +113,7 @@ bool fixup_device_block_write_error(DCR *dcr, DEV_BLOCK *block) dev->VolCatInfo.VolCatStatus, dev->VolCatInfo.VolCatName); dev->VolCatInfo.VolCatFiles = dev->file; /* set number of files */ dev->VolCatInfo.VolCatJobs++; /* increment number of jobs */ - if (!dir_update_volume_info(jcr, false)) { /* send Volume info to Director */ + if (!dir_update_volume_info(dcr, false)) { /* send Volume info to Director */ P(dev->mutex); unblock_device(dev); return false; /* device locked */ @@ -175,7 +175,7 @@ bool fixup_device_block_write_error(DCR *dcr, DEV_BLOCK *block) /* Clear NewVol now because dir_get_volume_info() already done */ jcr->dcr->NewVol = false; - set_new_volume_parameters(jcr, dev); + set_new_volume_parameters(dcr); jcr->run_time += time(NULL) - wait_time; /* correct run time for mount wait */ @@ -197,10 +197,11 @@ bool fixup_device_block_write_error(DCR *dcr, DEV_BLOCK *block) * concerning this job. The global changes were made earlier * in the dev structure. */ -void set_new_volume_parameters(JCR *jcr, DEVICE *dev) +void set_new_volume_parameters(DCR *dcr) { - DCR *dcr = jcr->dcr; - if (dcr->NewVol && !dir_get_volume_info(jcr, GET_VOL_INFO_FOR_WRITE)) { + JCR *jcr = dcr->jcr; + DEVICE *dev = dcr->dev; + if (dcr->NewVol && !dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) { Jmsg1(jcr, M_ERROR, 0, "%s", jcr->errmsg); } /* Set new start/end positions */ @@ -224,9 +225,9 @@ void set_new_volume_parameters(JCR *jcr, DEVICE *dev) * concerning this job. The global changes were made earlier * in the dev structure. */ -void set_new_file_parameters(JCR *jcr, DEVICE *dev) +void set_new_file_parameters(DCR *dcr) { - DCR *dcr = jcr->dcr; + DEVICE *dev = dcr->dev; /* Set new start/end positions */ if (dev_state(dev, ST_TAPE)) { @@ -317,6 +318,22 @@ int open_device(JCR *jcr, DEVICE *dev) return 1; } +void dev_lock(DEVICE *dev) +{ + int errstat; + if ((errstat=rwl_writelock(&dev->lock))) { + Emsg1(M_ABORT, 0, "Device write lock failure. ERR=%s\n", strerror(errstat)); + } +} + +void dev_unlock(DEVICE *dev) +{ + int errstat; + if ((errstat=rwl_writeunlock(&dev->lock))) { + Emsg1(M_ABORT, 0, "Device write unlock failure. ERR=%s\n", strerror(errstat)); + } +} + /* * When dev_blocked is set, all threads EXCEPT thread with id no_wait_id * must wait. The no_wait_id thread is out obtaining a new volume diff --git a/bacula/src/stored/dircmd.c b/bacula/src/stored/dircmd.c index 4695f731f0..a68fa8cb7a 100644 --- a/bacula/src/stored/dircmd.c +++ b/bacula/src/stored/dircmd.c @@ -363,13 +363,14 @@ static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *oldname, BSOCK *dir = jcr->dir_bsock; DEV_BLOCK *block; bsteal_lock_t hold; + DCR *dcr = jcr->dcr; steal_device_lock(dev, &hold, BST_WRITING_LABEL); block = new_block(dev); pm_strcpy(&jcr->VolumeName, newname); jcr->VolCatInfo.Slot = slot; - if (autoload_device(jcr, dev, 0, dir) < 0) { /* autoload if possible */ + if (autoload_device(dcr, 0, dir) < 0) { /* autoload if possible */ goto bail_out; } @@ -383,7 +384,7 @@ static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *oldname, } /* See what we have for a Volume */ - switch (read_dev_volume_label(jcr->dcr, block)) { + switch (read_dev_volume_label(dcr, block)) { case VOL_NAME_ERROR: case VOL_VERSION_ERROR: case VOL_LABEL_ERROR: @@ -402,7 +403,7 @@ static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *oldname, /* Fall through wanted! */ case VOL_IO_ERROR: case VOL_NO_LABEL: - if (!write_new_volume_label_to_dev(jcr->dcr, newname, poolname)) { + if (!write_new_volume_label_to_dev(dcr, newname, poolname)) { bnet_fsend(dir, _("3912 Failed to label Volume: ERR=%s\n"), strerror_dev(dev)); break; } @@ -437,13 +438,14 @@ static int read_label(JCR *jcr, DEVICE *dev) BSOCK *dir = jcr->dir_bsock; DEV_BLOCK *block; bsteal_lock_t hold; + DCR *dcr = jcr->dcr; steal_device_lock(dev, &hold, BST_DOING_ACQUIRE); jcr->VolumeName[0] = 0; block = new_block(dev); dev->state &= ~ST_LABEL; /* force read of label */ - switch (read_dev_volume_label(jcr->dcr, block)) { + switch (read_dev_volume_label(dcr, block)) { case VOL_OK: bnet_fsend(dir, _("3001 Mounted Volume: %s\n"), dev->VolHdr.VolName); stat = 1; @@ -497,10 +499,12 @@ static int mount_cmd(JCR *jcr) POOLMEM *dname; BSOCK *dir = jcr->dir_bsock; DEVICE *dev; + DCR *dcr; dname = get_memory(dir->msglen+1); if (sscanf(dir->msg, "mount %s", dname) == 1) { dev = find_device(jcr, dname); + dcr = jcr->dcr; if (dev) { DEV_BLOCK *block; P(dev->mutex); /* Use P to avoid indefinite block */ @@ -523,7 +527,7 @@ static int mount_cmd(JCR *jcr) break; } block = new_block(dev); - read_dev_volume_label(jcr->dcr, block); + read_dev_volume_label(dcr, block); free_block(block); if (dev->dev_blocked == BST_UNMOUNTED) { /* We blocked the device, so unblock it */ @@ -748,22 +752,24 @@ static int autochanger_cmd(JCR *jcr) POOLMEM *dname; BSOCK *dir = jcr->dir_bsock; DEVICE *dev; + DCR *dcr; dname = get_memory(dir->msglen+1); if (sscanf(dir->msg, "autochanger list %s ", dname) == 1) { dev = find_device(jcr, dname); + dcr = jcr->dcr; if (dev) { P(dev->mutex); /* Use P to avoid indefinite block */ if (!dev_is_tape(dev)) { bnet_fsend(dir, _("3995 Device %s is not an autochanger.\n"), dev_name(dev)); } else if (!(dev->state & ST_OPENED)) { - autochanger_list(jcr, dev, dir); + autochanger_list(dcr, dir); /* Under certain "safe" conditions, we can steal the lock */ } else if (dev->dev_blocked && (dev->dev_blocked == BST_UNMOUNTED || dev->dev_blocked == BST_WAITING_FOR_SYSOP || dev->dev_blocked == BST_UNMOUNTED_WAITING_FOR_SYSOP)) { - autochanger_list(jcr, dev, dir); + autochanger_list(dcr, dir); } else if (dev_state(dev, ST_READ) || dev->num_writers) { if (dev_state(dev, ST_READ)) { bnet_fsend(dir, _("3901 Device %s is busy with 1 reader.\n"), dev_name(dev)); @@ -772,7 +778,7 @@ static int autochanger_cmd(JCR *jcr) dev_name(dev), dev->num_writers); } } else { /* device not being used */ - autochanger_list(jcr, dev, dir); + autochanger_list(dcr, dir); } V(dev->mutex); } else { @@ -846,13 +852,14 @@ static void read_volume_label(JCR *jcr, DEVICE *dev, int Slot) BSOCK *dir = jcr->dir_bsock; DEV_BLOCK *block; bsteal_lock_t hold; + DCR *dcr = jcr->dcr; steal_device_lock(dev, &hold, BST_WRITING_LABEL); block = new_block(dev); jcr->VolumeName[0] = 0; jcr->VolCatInfo.Slot = Slot; - if (autoload_device(jcr, dev, 0, dir) < 0) { /* autoload if possible */ + if (autoload_device(dcr, 0, dir) < 0) { /* autoload if possible */ goto bail_out; } @@ -866,7 +873,7 @@ static void read_volume_label(JCR *jcr, DEVICE *dev, int Slot) } dev->state &= ~ST_LABEL; /* force read of label */ - switch (read_dev_volume_label(jcr->dcr, block)) { + switch (read_dev_volume_label(dcr, block)) { case VOL_OK: /* DO NOT add quotes around the Volume name. It is scanned in the DIR */ bnet_fsend(dir, _("3001 Volume=%s Slot=%d\n"), dev->VolHdr.VolName, Slot); diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index 1e55ca8e74..e41724439e 100644 --- a/bacula/src/stored/mount.c +++ b/bacula/src/stored/mount.c @@ -67,7 +67,7 @@ mount_next_vol: if (!dev->poll && retry++ > 4) { /* Last ditch effort before giving up, force operator to respond */ jcr->VolCatInfo.Slot = 0; - if (!dir_ask_sysop_to_mount_volume(jcr)) { + if (!dir_ask_sysop_to_mount_volume(dcr)) { Jmsg(jcr, M_FATAL, 0, _("Too many errors trying to mount device %s.\n"), dev_name(dev)); return false; @@ -89,9 +89,9 @@ mount_next_vol: * in jcr->VolCatInfo */ Dmsg0(200, "Before dir_find_next_appendable_volume.\n"); - while (!dir_find_next_appendable_volume(jcr)) { + while (!dir_find_next_appendable_volume(dcr)) { Dmsg0(200, "not dir_find_next\n"); - if (!dir_ask_sysop_to_create_appendable_volume(jcr)) { + if (!dir_ask_sysop_to_create_appendable_volume(dcr)) { return false; } Dmsg0(200, "Again dir_find_next_append...\n"); @@ -117,7 +117,7 @@ mount_next_vol: */ dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF); - if (autoload_device(jcr, dev, 1, NULL) > 0) { + if (autoload_device(dcr, 1, NULL) > 0) { autochanger = true; ask = false; } else { @@ -141,7 +141,7 @@ mount_next_vol: Dmsg2(100, "Ask=%d autochanger=%d\n", ask, autochanger); release = true; /* release next time if we "recurse" */ - if (ask && !dir_ask_sysop_to_mount_volume(jcr)) { + if (ask && !dir_ask_sysop_to_mount_volume(dcr)) { Dmsg0(100, "Error return ask_sysop ...\n"); return false; /* error return */ } @@ -215,7 +215,7 @@ read_volume: memcpy(&VolCatInfo, &jcr->VolCatInfo, sizeof(VolCatInfo)); /* Check if this is a valid Volume in the pool */ pm_strcpy(&jcr->VolumeName, dev->VolHdr.VolName); - if (!dir_get_volume_info(jcr, GET_VOL_INFO_FOR_WRITE)) { + if (!dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) { bstrncpy(dev->BadVolName, dev->VolHdr.VolName, sizeof(dev->BadVolName)); Jmsg(jcr, M_WARNING, 0, _("Director wanted Volume \"%s\".\n" " Current Volume \"%s\" not acceptable because:\n" @@ -260,7 +260,7 @@ read_volume: Dmsg0(100, "dir_update_vol_info. Set Append\n"); /* Copy Director's info into the device info */ memcpy(&dev->VolCatInfo, &jcr->VolCatInfo, sizeof(dev->VolCatInfo)); - dir_update_volume_info(jcr, true); /* indicate tape labeled */ + dir_update_volume_info(dcr, true); /* indicate tape labeled */ Jmsg(jcr, M_INFO, 0, _("Labeled new Volume \"%s\" on device %s.\n"), jcr->VolumeName, dev_name(dev)); goto read_volume; /* read label we just wrote */ @@ -336,7 +336,7 @@ The number of files mismatch! Volume=%u Catalog=%u\n"), } dev->VolCatInfo.VolCatMounts++; /* Update mounts */ Dmsg1(100, "update volinfo mounts=%d\n", dev->VolCatInfo.VolCatMounts); - dir_update_volume_info(jcr, false); + dir_update_volume_info(dcr, false); /* Return an empty block */ empty_block(block); /* we used it for reading so set for write */ } @@ -401,7 +401,7 @@ static bool rewrite_volume_label(DCR *dcr, DEV_BLOCK *block, bool recycle) } Dmsg0(100, "dir_update_vol_info. Set Append\n"); bstrncpy(dev->VolCatInfo.VolCatStatus, "Append", sizeof(dev->VolCatInfo.VolCatStatus)); - dir_update_volume_info(jcr, true); /* indicate doing relabel */ + dir_update_volume_info(dcr, true); /* indicate doing relabel */ if (recycle) { Jmsg(jcr, M_INFO, 0, _("Recycled volume \"%s\" on device \"%s\", all previous data lost.\n"), jcr->VolumeName, dev_name(dev)); @@ -426,7 +426,7 @@ void mark_volume_in_error(JCR *jcr, DEVICE *dev) jcr->VolumeName); bstrncpy(dev->VolCatInfo.VolCatStatus, "Error", sizeof(dev->VolCatInfo.VolCatStatus)); Dmsg0(100, "dir_update_vol_info. Set Error.\n"); - dir_update_volume_info(jcr, false); + dir_update_volume_info(jcr->dcr, false); } /* diff --git a/bacula/src/stored/protos.h b/bacula/src/stored/protos.h index fa45a7354f..a82eedb170 100644 --- a/bacula/src/stored/protos.h +++ b/bacula/src/stored/protos.h @@ -28,171 +28,173 @@ uint32_t new_VolSessionId(); /* From acquire.c */ -DCR *acquire_device_for_append(JCR *jcr); -DCR *acquire_device_for_read(JCR *jcr); -bool release_device(JCR *jcr); -DCR *new_dcr(JCR *jcr, DEVICE *dev); -void free_dcr(DCR *dcr); +DCR *acquire_device_for_append(JCR *jcr); +DCR *acquire_device_for_read(JCR *jcr); +bool release_device(JCR *jcr); +DCR *new_dcr(JCR *jcr, DEVICE *dev); +void free_dcr(DCR *dcr); /* From askdir.c */ enum get_vol_info_rw { GET_VOL_INFO_FOR_WRITE, GET_VOL_INFO_FOR_READ }; -bool dir_get_volume_info(JCR *jcr, enum get_vol_info_rw); -bool dir_find_next_appendable_volume(JCR *jcr); -bool dir_update_volume_info(JCR *jcr, bool label); -bool dir_ask_sysop_to_create_appendable_volume(JCR *jcr); -bool dir_ask_sysop_to_mount_volume(JCR *jcr); -bool dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec); -bool dir_send_job_status(JCR *jcr); -bool dir_create_jobmedia_record(JCR *jcr); +bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw); +bool dir_find_next_appendable_volume(DCR *dcr); +bool dir_update_volume_info(DCR *dcr, bool label); +bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr); +bool dir_ask_sysop_to_mount_volume(DCR *dcr); +bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec); +bool dir_send_job_status(JCR *jcr); +bool dir_create_jobmedia_record(DCR *dcr); /* 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, const char *msg); +void dump_block(DEV_BLOCK *b, const char *msg); DEV_BLOCK *new_block(DEVICE *dev); DEV_BLOCK *dup_block(DEV_BLOCK *eblock); -void init_block_write(DEV_BLOCK *block); -void empty_block(DEV_BLOCK *block); -void free_block(DEV_BLOCK *block); -bool write_block_to_device(DCR *dcr, DEV_BLOCK *block); -bool write_block_to_dev(DCR *dcr, DEV_BLOCK *block); -void print_block_read_errors(JCR *jcr, DEV_BLOCK *block); -void ser_block_header(DEV_BLOCK *block); +void init_block_write(DEV_BLOCK *block); +void empty_block(DEV_BLOCK *block); +void free_block(DEV_BLOCK *block); +bool write_block_to_device(DCR *dcr, DEV_BLOCK *block); +bool write_block_to_dev(DCR *dcr, DEV_BLOCK *block); +void print_block_read_errors(JCR *jcr, DEV_BLOCK *block); +void ser_block_header(DEV_BLOCK *block); #define CHECK_BLOCK_NUMBERS true #define NO_BLOCK_NUMBER_CHECK false -bool read_block_from_device(DCR *dcr, DEV_BLOCK *block, bool check_block_numbers); -bool read_block_from_dev(DCR *dcr, DEV_BLOCK *block, bool check_block_numbers); +bool read_block_from_device(DCR *dcr, DEV_BLOCK *block, bool check_block_numbers); +bool read_block_from_dev(DCR *dcr, DEV_BLOCK *block, bool check_block_numbers); /* From butil.c -- utilities for SD tool programs */ -void print_ls_output(const char *fname, const char *link, int type, struct stat *statp); +void print_ls_output(const char *fname, const char *link, int type, struct stat *statp); JCR *setup_jcr(const char *name, const char * device, BSR *bsr, const 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); +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); uint32_t status_dev(DEVICE *dev); -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); -void init_dev_wait_timers(DEVICE *dev); -bool double_dev_wait_time(DEVICE *dev); +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); +void init_dev_wait_timers(DEVICE *dev); +bool double_dev_wait_time(DEVICE *dev); /* 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(JCR *jcr, DEVICE *dev); -int first_open_device(DEVICE *dev); -bool fixup_device_block_write_error(DCR *dcr, DEV_BLOCK *block); -void _lock_device(const char *file, int line, DEVICE *dev); -void _unlock_device(const char *file, int line, DEVICE *dev); -void _block_device(const char *file, int line, DEVICE *dev, int state); -void _unblock_device(const char *file, int line, DEVICE *dev); -void _steal_device_lock(const char *file, int line, DEVICE *dev, bsteal_lock_t *hold, int state); -void _give_back_device_lock(const 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); +int open_device(JCR *jcr, DEVICE *dev); +int first_open_device(DEVICE *dev); +bool fixup_device_block_write_error(DCR *dcr, DEV_BLOCK *block); +void _lock_device(const char *file, int line, DEVICE *dev); +void _unlock_device(const char *file, int line, DEVICE *dev); +void _block_device(const char *file, int line, DEVICE *dev, int state); +void _unblock_device(const char *file, int line, DEVICE *dev); +void _steal_device_lock(const char *file, int line, DEVICE *dev, bsteal_lock_t *hold, int state); +void _give_back_device_lock(const char *file, int line, DEVICE *dev, bsteal_lock_t *hold); +void set_new_volume_parameters(DCR *dcr); +void set_new_file_parameters(DCR *dcr); +int device_is_unmounted(DEVICE *dev); +void dev_lock(DEVICE *dev); +void dev_unlock(DEVICE *dev); /* From dircmd.c */ -void *handle_connection_request(void *arg); +void *handle_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(DCR *dcr, DEV_BLOCK *block); -void create_session_label(DCR *dcr, DEV_RECORD *rec, int label); -void create_volume_label(DEVICE *dev, const char *VolName, const char *PoolName); -bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, const char *PoolName); -bool write_session_label(DCR *dcr, DEV_BLOCK *block, int label); -bool write_volume_label_to_block(DCR *dcr, DEV_BLOCK *block); -void dump_volume_label(DEVICE *dev); -void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose); -bool unser_volume_label(DEVICE *dev, DEV_RECORD *rec); -bool unser_session_label(SESSION_LABEL *label, DEV_RECORD *rec); +int read_dev_volume_label(DCR *dcr, DEV_BLOCK *block); +void create_session_label(DCR *dcr, DEV_RECORD *rec, int label); +void create_volume_label(DEVICE *dev, const char *VolName, const char *PoolName); +bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, const char *PoolName); +bool write_session_label(DCR *dcr, DEV_BLOCK *block, int label); +bool write_volume_label_to_block(DCR *dcr, DEV_BLOCK *block); +void dump_volume_label(DEVICE *dev); +void dump_label_record(DEVICE *dev, DEV_RECORD *rec, int verbose); +bool unser_volume_label(DEVICE *dev, DEV_RECORD *rec); +bool 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); -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); -bool match_set_eof(BSR *bsr, DEV_RECORD *rec); +int match_bsr(BSR *bsr, DEV_RECORD *rec, VOLUME_LABEL *volrec, + 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); +bool match_set_eof(BSR *bsr, DEV_RECORD *rec); /* From mount.c */ -bool mount_next_write_volume(DCR *dcr, DEV_BLOCK *block, bool release); -bool mount_next_read_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); -void release_volume(JCR *jcr, DEVICE *dev); -void mark_volume_in_error(JCR *jcr, DEVICE *dev); +bool mount_next_write_volume(DCR *dcr, DEV_BLOCK *block, bool release); +bool mount_next_read_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block); +void release_volume(JCR *jcr, DEVICE *dev); +void mark_volume_in_error(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, DEVICE *dev); +int autoload_device(DCR *dcr, int writing, BSOCK *dir); +bool autochanger_list(DCR *dcr, BSOCK *dir); +void invalidate_slot_in_catalog(DCR *dcr); /* From parse_bsr.c */ -BSR *parse_bsr(JCR *jcr, char *lf); -void dump_bsr(BSR *bsr, bool recurse); -void free_bsr(BSR *bsr); +BSR *parse_bsr(JCR *jcr, char *lf); +void dump_bsr(BSR *bsr, bool recurse); +void free_bsr(BSR *bsr); VOL_LIST *new_vol(); -int add_vol(JCR *jcr, VOL_LIST *vol); -void free_vol_list(JCR *jcr); -void create_vol_list(JCR *jcr); +int add_vol(JCR *jcr, VOL_LIST *vol); +void free_vol_list(JCR *jcr); +void create_vol_list(JCR *jcr); /* From record.c */ const char *FI_to_ascii(int fi); const 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 */ bool read_records(DCR *dcr, @@ -200,12 +202,12 @@ bool read_records(DCR *dcr, bool mount_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)); /* From spool.c */ -bool begin_data_spool (JCR *jcr); -bool discard_data_spool (JCR *jcr); -bool commit_data_spool (JCR *jcr); -bool are_attributes_spooled (JCR *jcr); -bool begin_attribute_spool (JCR *jcr); -bool discard_attribute_spool (JCR *jcr); -bool commit_attribute_spool (JCR *jcr); -bool write_block_to_spool_file (DCR *dcr, DEV_BLOCK *block); -void list_spool_stats (BSOCK *bs); +bool begin_data_spool (JCR *jcr); +bool discard_data_spool (JCR *jcr); +bool commit_data_spool (JCR *jcr); +bool are_attributes_spooled (JCR *jcr); +bool begin_attribute_spool (JCR *jcr); +bool discard_attribute_spool (JCR *jcr); +bool commit_attribute_spool (JCR *jcr); +bool write_block_to_spool_file (DCR *dcr, DEV_BLOCK *block); +void list_spool_stats (BSOCK *bs); -- 2.39.5