]> git.sur5r.net Git - bacula/bacula/commitdiff
More DCR changes
authorKern Sibbald <kern@sibbald.com>
Fri, 16 Jul 2004 21:27:10 +0000 (21:27 +0000)
committerKern Sibbald <kern@sibbald.com>
Fri, 16 Jul 2004 21:27:10 +0000 (21:27 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1471 91ce42f0-d328-0410-95d8-f526ca767f89

18 files changed:
bacula/src/filed/backup.c
bacula/src/filed/restore.c
bacula/src/stored/acquire.c
bacula/src/stored/append.c
bacula/src/stored/askdir.c
bacula/src/stored/autochanger.c
bacula/src/stored/bcopy.c
bacula/src/stored/bextract.c
bacula/src/stored/block.c
bacula/src/stored/bls.c
bacula/src/stored/bscan.c
bacula/src/stored/btape.c
bacula/src/stored/dev.c
bacula/src/stored/dev.h
bacula/src/stored/device.c
bacula/src/stored/dircmd.c
bacula/src/stored/mount.c
bacula/src/stored/protos.h

index 6adc77ecc356127f09cc682f075684be14eaa0de..8680c9ea64e86cfaacd962b27e5ebeb6fe7cade0 100644 (file)
@@ -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;
index e2da0c849a2edb9c978491e36765fe5c6ab4b584..af7e6bdfddee44629736606360454bd4e4e500d4 100644 (file)
@@ -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);
index 026fccc29f5c89bad0c3944e4e8d9574b2a00360..a1b2d5458ac7d7c97c8495234f610e15d6ed4883 100644 (file)
@@ -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))) {
index cbe87c3be0bcde2ea3370154ea55f943d52b9f4f..2a8df378ffdf3af63d3afbbca7b8e61be4a050d5 100644 (file)
@@ -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));
index 116a650f4d90413ed93b9fe59c5f49db66e0b736..9677fe50cf6e4f01887c855ee7f6d9859de8bba8 100644 (file)
@@ -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) ||
index 447fa8bb2849d2834ab24058cf22e84ef97178e9..d73c564092c8c7cfa69da1e1f0cf824399207000 100644 (file)
@@ -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
  *  %% = %
index ead6fa2e29ed7cee4f20afc24c764f8846b9879a..29e2c9e4830d559b10fc377245d768fe4fba0378 100644 (file)
@@ -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();  
index ce8898bc71f6700947dd49aa7eee74212b85a4f0..d68bd73be8003ad24fd1ea1647ce71b2c026c07d 100644 (file)
@@ -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();  
index 7174a89e9664638c753ad68bb1167ceadd372840..91b6a5546693ba39fc0e6d600ad536930e22de6b 100644 (file)
@@ -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);
index 5259008864a2139a52103aef204d10da11462c8d..65e3a2a13a2ecbb5af3e71a1943d7cd21e227877 100644 (file)
@@ -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();  
index b97242258707bea43a9f3899ed6b6fc237591e69..add9076726e0191fea7f76872f3b1a9fede8a18c 100644 (file)
@@ -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();  
index ea2e4ea356f729110d79435f0145b411b7c66f2d..8f0199565d143ad8e57eaa90a5dc57452dcca253 100644 (file)
@@ -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: ",
index 554a5f4831397222234ad024b513cd6f3bcc80a4..d3253f5eabbefb7e184c95744beffd403c47dcfc 100644 (file)
@@ -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);
index 1500592bc78b88660935bfb34fb8565189fbd652..4efe4bd7d40948b700cceebd5c00e655d9a77e1e 100644 (file)
@@ -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 */
index 8596c055afb3b6e362b7adc996a0d8f07a476a36..77fe76348924e5b66636074c68acc25d0c72898c 100644 (file)
@@ -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
index 4695f731f0dabaf25b3b4b94a8654d69d6b937fc..a68fa8cb7ad42594523a5614f1880bb2b16c000b 100644 (file)
@@ -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);
index 1e55ca8e7400ccc8ba4516dc813a89be55fee35b..e41724439ede81c48aff1c42a34459948f6983de 100644 (file)
@@ -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);
 }
 
 /* 
index fa45a7354faa88c0892ce8a69fb3626f6501d501..a82eedb1709b91cee9f5f7606b16438af444e781 100644 (file)
 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);