}
dcr->despool_wait = true;
dcr->spooling = false;
- dcr->dev->r_dlock();
+ /*
+ * We work with device blocked, but not locked so that
+ * other threads -- e.g. reservations can lock the device
+ * structure.
+ */
+ dcr->dblock(BST_DESPOOLING);
dcr->despool_wait = false;
dcr->despooling = true;
- dcr->dev_locked = true;
/*
* This is really quite kludgy and should be fixed some time.
rdev->max_block_size = dcr->dev->max_block_size;
rdev->min_block_size = dcr->dev->min_block_size;
rdev->device = dcr->dev->device;
- rdcr = new_dcr(jcr, rdev);
+ rdcr = new_dcr(jcr, NULL, rdev);
rdcr->spool_fd = dcr->spool_fd;
- rdcr->jcr = jcr; /* set a valid jcr */
block = dcr->block; /* save block */
dcr->block = rdcr->block; /* make read and write block the same */
free(rdev);
dcr->spooling = true; /* turn on spooling again */
dcr->despooling = false;
+ /*
+ * We are done, so unblock the device, but if we have done a
+ * commit, leave it locked so that the job cleanup does not
+ * need to wait to release the device (no re-acquire of the lock).
+ */
+ dcr->dlock();
+ unblock_device(dcr->dev);
/* If doing a commit, leave the device locked -- unlocked in release_device() */
if (!commit) {
- dcr->dev_locked = false;
- dcr->dev->dunlock();
+ dcr->dunlock();
}
return ok;
}
unlink(name);
free_pool_memory(name);
bs->m_spool_fd = NULL;
- bs->m_spool = false;
+ bs->clear_spooling();
return true;
}