]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/acquire.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / stored / acquire.c
index f7905d8a8304b0bd10e7b59a70acfeb32d0819ef..671fb8bee278826bbfb315a8f1c8ef821a5c8803 100644 (file)
@@ -42,6 +42,9 @@ DCR *new_dcr(JCR *jcr, DEVICE *dev)
    }
    dcr->jcr = jcr;
    dcr->dev = dev;
+   if (dev) {
+      dcr->device = dev->device;
+   }
    dcr->block = new_block(dev);
    dcr->rec = new_record();
    dcr->spool_fd = -1;
@@ -132,6 +135,7 @@ DCR *acquire_device_for_read(JCR *jcr)
    bstrncpy(dcr->VolumeName, vol->VolumeName, sizeof(dcr->VolumeName));
 
    for (i=0; i<5; i++) {
+      dcr->dev->state &= ~ST_LABEL;          /* force reread of label */
       if (job_canceled(jcr)) {
          Mmsg1(dev->errmsg, _("Job %d canceled.\n"), jcr->JobId);
         goto get_out;                /* error return */
@@ -144,6 +148,9 @@ DCR *acquire_device_for_read(JCR *jcr)
       for ( ; !(dev->state & ST_OPENED); ) {
          Dmsg1(120, "bstored: open vol=%s\n", dcr->VolumeName);
         if (open_dev(dev, dcr->VolumeName, OPEN_READ_ONLY) < 0) {
+           if (dev->dev_errno == EIO) {   /* no tape loaded */
+              goto default_path;
+           }
             Jmsg(jcr, M_FATAL, 0, _("Open device %s volume %s failed, ERR=%s\n"), 
                dev_name(dev), dcr->VolumeName, strerror_dev(dev));
            goto get_out;
@@ -154,7 +161,6 @@ DCR *acquire_device_for_read(JCR *jcr)
        *  correctly possitioned.  Possibly have way user can turn
        *  this optimization (to be implemented) off.
        */
-      dcr->dev->state &= ~ST_LABEL;          /* force reread of label */
       Dmsg0(200, "calling read-vol-label\n");
       switch (read_dev_volume_label(dcr)) {
       case VOL_OK:
@@ -336,7 +342,10 @@ DCR *acquire_device_for_append(JCR *jcr)
 
    if (do_mount || recycle) {
       Dmsg0(190, "Do mount_next_write_vol\n");
-      if (!mount_next_write_volume(dcr, release)) {
+      V(mutex);                       /* don't lock everything during mount */
+      bool mounted = mount_next_write_volume(dcr, release);
+      P(mutex);                      /* re-lock */
+      if (!mounted) {
         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"),
@@ -380,8 +389,8 @@ bool release_device(JCR *jcr)
    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)) {
-      dev->state &= ~ST_READ;        /* clear read bit */
+   if (dev->can_read()) {
+      dev->clear_read();             /* clear read bit */
       if (!dev_is_tape(dev) || !dev_cap(dev, CAP_ALWAYSOPEN)) {
         offline_or_rewind_dev(dev);
         close_dev(dev);
@@ -391,7 +400,7 @@ bool release_device(JCR *jcr)
    } else if (dev->num_writers > 0) {
       dev->num_writers--;
       Dmsg1(100, "There are %d writers in release_device\n", dev->num_writers);
-      if (dev_state(dev, ST_LABEL)) {
+      if (dev->is_labeled()) {
          Dmsg0(100, "dir_create_jobmedia_record. Release\n");
         if (!dir_create_jobmedia_record(dcr)) {
             Jmsg(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"),
@@ -429,7 +438,7 @@ bool release_device(JCR *jcr)
       bpipe = open_bpipe(alert, 0, "r");
       if (bpipe) {
         while (fgets(line, sizeof(line), bpipe->rfd)) {
-            Jmsg(jcr, M_INFO, 0, _("Alert: %s"), line);
+            Jmsg(jcr, M_ALERT, 0, _("Alert: %s"), line);
         }
         status = close_bpipe(bpipe);
       } else {
@@ -437,7 +446,7 @@ bool release_device(JCR *jcr)
       }
       if (status != 0) {
         berrno be;
-         Jmsg(jcr, M_INFO, 0, _("3997 Bad alert command: %s: ERR=%s.\n"),
+         Jmsg(jcr, M_ALERT, 0, _("3997 Bad alert command: %s: ERR=%s.\n"),
              alert, be.strerror(status));
       }