X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Facquire.c;h=59b335ea360d8cf457c7d1d926a7b06c7ea9f7c7;hb=b1ee6a0c8dc117f22197979081a90116c76bbf6b;hp=940b0171f2ee86fa8830a101f295f5aa8507f66e;hpb=84a05f3bfbde64c606b014d68b45b2d060e2a478;p=bacula%2Fbacula diff --git a/bacula/src/stored/acquire.c b/bacula/src/stored/acquire.c index 940b0171f2..59b335ea36 100644 --- a/bacula/src/stored/acquire.c +++ b/bacula/src/stored/acquire.c @@ -40,30 +40,36 @@ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; */ int acquire_device_for_read(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) { - int stat = 0; - int tape_previously_mounted; + bool vol_ok = false; + bool tape_previously_mounted; + bool tape_initially_mounted; VOL_LIST *vol; int autochanger = 0; int i; if (device_is_unmounted(dev)) { - Jmsg(jcr, M_WARNING, 0, _("device is BLOCKED due to user unmount.\n")); + Jmsg(jcr, M_WARNING, 0, _("device %s is BLOCKED due to user unmount.\n"), + dev_name(dev)); } lock_device(dev); block_device(dev, BST_DOING_ACQUIRE); unlock_device(dev); - tape_previously_mounted = (dev->state & ST_READ) || (dev->state & ST_APPEND); - - if (dev->state & ST_READ || dev->num_writers > 0) { - Jmsg1(jcr, M_FATAL, 0, _("Device %s is busy. Job canceled.\n"), dev_name(dev)); + if (dev_state(dev, ST_READ) || dev->num_writers > 0) { + Jmsg2(jcr, M_FATAL, 0, _("Device %s is busy. Job %d canceled.\n"), + dev_name(dev), jcr->JobId); goto get_out; } + tape_previously_mounted = dev_state(dev, ST_READ) || + dev_state(dev, ST_APPEND) || + dev_state(dev, ST_LABEL); + tape_initially_mounted = tape_previously_mounted; + /* Find next Volume, if any */ vol = jcr->VolList; if (!vol) { - Jmsg(jcr, M_FATAL, 0, _("No volumes specified. Job canceled.\n")); + Jmsg(jcr, M_FATAL, 0, _("No volumes specified. Job %d canceled.\n"), jcr->JobId); goto get_out; } jcr->CurVolume++; @@ -74,7 +80,7 @@ int acquire_device_for_read(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) for (i=0; i<5; i++) { if (job_canceled(jcr)) { - Mmsg0(&dev->errmsg, _("Job canceled.\n")); + Mmsg1(&dev->errmsg, _("Job %d canceled.\n"), jcr->JobId); goto get_out; /* error return */ } /* @@ -91,11 +97,15 @@ int acquire_device_for_read(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) } Dmsg1(129, "open_dev %s OK\n", dev_name(dev)); } + /****FIXME***** do not reread label if ioctl() says we are + * correctly possitioned. Possibly have way user can turn + * this optimization (to be implemented) off. + */ dev->state &= ~ST_LABEL; /* force reread of label */ Dmsg0(200, "calling read-vol-label\n"); switch (read_dev_volume_label(jcr, dev, block)) { case VOL_OK: - stat = 1; + vol_ok = true; break; /* got it */ case VOL_IO_ERROR: /* @@ -107,10 +117,16 @@ int acquire_device_for_read(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg); } goto default_path; + case VOL_NAME_ERROR: + if (tape_initially_mounted) { + tape_initially_mounted = false; + goto default_path; + } + /* Fall through */ default: Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg); default_path: - tape_previously_mounted = 1; + tape_previously_mounted = true; Dmsg0(200, "dir_get_volume_info\n"); if (!dir_get_volume_info(jcr, GET_VOL_INFO_FOR_READ)) { Jmsg1(jcr, M_WARNING, 0, "%s", jcr->errmsg); @@ -133,13 +149,14 @@ default_path: } /* end switch */ break; } /* end for loop */ - if (stat == 0) { + if (!vol_ok) { Jmsg1(jcr, M_FATAL, 0, _("Too many errors trying to mount device \"%s\".\n"), dev_name(dev)); goto get_out; } - dev->state |= ST_READ; + dev->state &= ~ST_APPEND; /* clear any previous append mode */ + dev->state |= ST_READ; /* set reed mode */ attach_jcr_to_device(dev, jcr); /* attach jcr to device */ Jmsg(jcr, M_INFO, 0, _("Ready to read from volume \"%s\" on device %s.\n"), jcr->VolumeName, dev_name(dev)); @@ -148,7 +165,7 @@ get_out: P(dev->mutex); unblock_device(dev); V(dev->mutex); - return stat; + return vol_ok; } /* @@ -169,7 +186,8 @@ DEVICE *acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) DEVICE *rtn_dev = NULL; if (device_is_unmounted(dev)) { - Jmsg(jcr, M_WARNING, 0, _("device is BLOCKED due to user unmount.\n")); + Jmsg(jcr, M_WARNING, 0, _("device %s is BLOCKED due to user unmount.\n"), + dev_name(dev)); } lock_device(dev); block_device(dev, BST_DOING_ACQUIRE); @@ -178,7 +196,7 @@ DEVICE *acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) Dmsg1(190, "acquire_append device is %s\n", dev_is_tape(dev)?"tape":"disk"); - if (dev->state & ST_APPEND) { + if (dev_state(dev, ST_APPEND)) { /* * Device already in append mode * @@ -198,7 +216,7 @@ DEVICE *acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) for ( ; d; d=d->next) { open_vols++; } - if (dev->state & ST_FILE && dev->max_open_vols > open_vols) { + if (dev_state(dev, ST_FILE) && dev->max_open_vols > open_vols) { d = init_dev(NULL, (DEVRES *)dev->device); /* init new device */ d->prev = dev; /* chain in new device */ d->next = dev->next; @@ -235,7 +253,7 @@ DEVICE *acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) } } else { /* Not already in append mode, so mount the device */ - if (dev->state & ST_READ) { + if (dev_state(dev, ST_READ)) { Jmsg(jcr, M_FATAL, 0, _("Device %s is busy reading.\n"), dev_name(dev)); goto get_out; } @@ -245,8 +263,11 @@ DEVICE *acquire_device_for_append(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) if (do_mount || recycle) { if (!mount_next_write_volume(jcr, dev, block, release)) { - Jmsg(jcr, M_FATAL, 0, _("Could not ready device %s for append.\n"), - dev_name(dev)); + if (!job_canceled(jcr)) { + /* Reduce "noise" -- don't print if job canceled */ + Jmsg(jcr, M_FATAL, 0, _("Could not ready device %s for append.\n"), + dev_name(dev)); + } goto get_out; } } @@ -279,7 +300,7 @@ int release_device(JCR *jcr, DEVICE *dev) { lock_device(dev); Dmsg1(100, "release_device device is %s\n", dev_is_tape(dev)?"tape":"disk"); - if (dev->state & ST_READ) { + if (dev_state(dev, ST_READ)) { dev->state &= ~ST_READ; /* clear read bit */ if (!dev_is_tape(dev) || !dev_cap(dev, CAP_ALWAYSOPEN)) { offline_or_rewind_dev(dev); @@ -290,39 +311,33 @@ int release_device(JCR *jcr, DEVICE *dev) } else if (dev->num_writers > 0) { dev->num_writers--; Dmsg1(100, "There are %d writers in release_device\n", dev->num_writers); - if (dev->num_writers == 0) { - /* If we are the only writer, write EOF after job */ - if (dev->state & ST_LABEL) { - Dmsg0(100, "dir_create_jobmedia_record. Release\n"); - dir_create_jobmedia_record(jcr); - if (dev_can_write(dev)) { - weof_dev(dev, 1); - } - dev->VolCatInfo.VolCatFiles = dev->file; /* set number of files */ - dev->VolCatInfo.VolCatJobs++; /* increment number of jobs */ - /* Note! do volume update before close, which zaps VolCatInfo */ - Dmsg0(200, "dir_update_vol_info. Release0\n"); - dir_update_volume_info(jcr, &dev->VolCatInfo, 0); /* send Volume info to Director */ + if (dev_state(dev, ST_LABEL)) { + Dmsg0(100, "dir_create_jobmedia_record. Release\n"); + if (!dir_create_jobmedia_record(jcr)) { + Jmsg(jcr, M_ERROR, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), + jcr->VolCatInfo.VolCatName, jcr->Job); } - - if (!dev_is_tape(dev) || !dev_cap(dev, CAP_ALWAYSOPEN)) { - offline_or_rewind_dev(dev); - close_dev(dev); + /* If no more writers, write an EOF */ + if (!dev->num_writers && dev_can_write(dev)) { + weof_dev(dev, 1); } - } else if (dev->state & ST_LABEL) { - Dmsg0(100, "dir_create_jobmedia_record. Release\n"); - dir_create_jobmedia_record(jcr); - Dmsg0(200, "dir_update_vol_info. Release1\n"); dev->VolCatInfo.VolCatFiles = dev->file; /* set number of files */ dev->VolCatInfo.VolCatJobs++; /* increment number of jobs */ - dir_update_volume_info(jcr, &dev->VolCatInfo, 0); /* send Volume info to Director */ + /* Note! do volume update before close, which zaps VolCatInfo */ + Dmsg0(100, "dir_update_vol_info. Release0\n"); + dir_update_volume_info(jcr, dev, 0); /* send Volume info to Director */ + } + + if (!dev->num_writers && (!dev_is_tape(dev) || !dev_cap(dev, CAP_ALWAYSOPEN))) { + offline_or_rewind_dev(dev); + close_dev(dev); } } else { - Jmsg2(jcr, M_ERROR, 0, _("BAD ERROR: release_device %s, Volume %s not in use.\n"), + Jmsg2(jcr, M_ERROR, 0, _("BAD ERROR: release_device %s, Volume \"%s\" not in use.\n"), dev_name(dev), NPRT(jcr->VolumeName)); } detach_jcr_from_device(dev, jcr); - if (dev->prev && !(dev->state & ST_READ) && dev->num_writers == 0) { + if (dev->prev && !dev_state(dev, ST_READ) && !dev->num_writers) { P(mutex); unlock_device(dev); dev->prev->next = dev->next; /* dechain */