]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/dircmd.c
Status cleanup and cancelling FD
[bacula/bacula] / bacula / src / stored / dircmd.c
index ebfd6f7c50e9ece6c88d1ee214dc2c720dce7c67..aaed0fea09b7355f21d3f9040bd482de9b823ac0 100644 (file)
@@ -69,6 +69,7 @@ static int unmount_cmd(JCR *jcr);
 static int status_cmd(JCR *sjcr);
 static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *vname, char *poolname, 
                               int Slot);
+static void send_blocked_status(JCR *jcr, DEVICE *dev);
 
 struct s_cmds {
    char *cmd;
@@ -207,16 +208,15 @@ static int cancel_cmd(JCR *cjcr)
       } else {
         P(jcr->mutex);
         oldStatus = jcr->JobStatus;
-        jcr->JobStatus = JS_Cancelled;
-        if (!jcr->authenticated && jcr->JobStatus == JS_WaitFD) {
+        set_jcr_job_status(jcr, JS_Cancelled);
+        if (!jcr->authenticated && oldStatus == JS_WaitFD) {
            pthread_cond_signal(&jcr->job_start_wait); /* wake waiting thread */
         }
         V(jcr->mutex);
         if (jcr->file_bsock) {
            bnet_sig(jcr->file_bsock, BNET_TERMINATE);
         }
-         bnet_fsend(dir, _("3000 Job %s Status=%c marked to be cancelled.\n"), 
-           jcr->Job, oldStatus);
+         bnet_fsend(dir, _("3000 Job %s marked to be cancelled.\n"), jcr->Job);
         free_jcr(jcr);
       }
    } else {
@@ -327,6 +327,18 @@ static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *vname, char *poolnam
    autoload_device(jcr, dev, 0, dir);     /* autoload if possible */
    block = new_block(dev);
 
+   /* Ensure that the device is open -- not autoload_device() closes it */
+   for ( ; !(dev->state & ST_OPENED); ) {
+       if (open_dev(dev, jcr->VolumeName, READ_WRITE) < 0) {
+         if (dev->dev_errno == EAGAIN || dev->dev_errno == EBUSY) {
+            sleep(30);
+         }
+          bnet_fsend(dir, _("3903 Unable to open device %s. ERR=%s\n"), 
+            dev_name(dev), strerror_dev(dev));
+         goto bail_out;
+       }
+   }
+
    /* See what we have for a Volume */
    switch (read_dev_volume_label(jcr, dev, block)) {               
       case VOL_NAME_ERROR:
@@ -351,6 +363,7 @@ already labeled: %s\n"), dev->VolHdr.VolName);
 Unknown status %d from read_volume_label()\n"), jcr->label_status);
         break;
    }
+bail_out:
    free_block(block);
    return_device_lock(dev, &hold);
 }
@@ -641,29 +654,7 @@ static int status_cmd(JCR *jcr)
            } else {
                bnet_fsend(user, _("Device %s open but no Bacula volume is mounted.\n"), dev_name(dev));
            }
-           switch (dev->dev_blocked) {
-              case BST_UNMOUNTED:
-                  bnet_fsend(user, _("    Deviced is blocked. User unmounted.\n"));
-                 break;
-              case BST_UNMOUNTED_WAITING_FOR_SYSOP:
-                  bnet_fsend(user, _("    Deviced is blocked. User unmounted during wait for media/mount.\n"));
-                 break;
-              case BST_WAITING_FOR_SYSOP:
-                 if (jcr->JobStatus == JS_WaitMount) {
-                     bnet_fsend(user, _("    Device is blocked waiting for mount.\n"));
-                 } else {
-                     bnet_fsend(user, _("    Device is blocked waiting for appendable media.\n"));
-                 }
-                 break;
-              case BST_DOING_ACQUIRE:
-                  bnet_fsend(user, _("    Device is being initialized.\n"));
-                 break;
-              case BST_WRITING_LABEL:
-                  bnet_fsend(user, _("    Device is blocked labeling a Volume.\n"));
-                 break;
-              default:
-                 break;
-           }
+           send_blocked_status(jcr, dev);
            bpb = dev->VolCatInfo.VolCatBlocks;
            if (bpb <= 0) {
               bpb = 1;
@@ -679,6 +670,7 @@ static int status_cmd(JCR *jcr)
 
         } else {
             bnet_fsend(user, _("Device %s is not open.\n"), dev_name(dev));
+           send_blocked_status(jcr, dev);
         }
       }
    }
@@ -732,3 +724,32 @@ static int status_cmd(JCR *jcr)
    bnet_sig(user, BNET_EOD);
    return 1;
 }
+
+static void send_blocked_status(JCR *jcr, DEVICE *dev) 
+{
+   BSOCK *user = jcr->dir_bsock;
+
+   switch (dev->dev_blocked) {
+      case BST_UNMOUNTED:
+         bnet_fsend(user, _("    Device is BLOCKED. User unmounted.\n"));
+        break;
+      case BST_UNMOUNTED_WAITING_FOR_SYSOP:
+         bnet_fsend(user, _("    Device is BLOCKED. User unmounted during wait for media/mount.\n"));
+        break;
+      case BST_WAITING_FOR_SYSOP:
+        if (jcr->JobStatus == JS_WaitMount) {
+            bnet_fsend(user, _("    Device is BLOCKED waiting for mount.\n"));
+        } else {
+            bnet_fsend(user, _("    Device is BLOCKED waiting for appendable media.\n"));
+        }
+        break;
+      case BST_DOING_ACQUIRE:
+         bnet_fsend(user, _("    Device is being initialized.\n"));
+        break;
+      case BST_WRITING_LABEL:
+         bnet_fsend(user, _("    Device is blocked labeling a Volume.\n"));
+        break;
+      default:
+        break;
+   }
+}