dequeue_messages(jcr); /* dequeue any daemon messages */
+ jcr->set_killable(true); /* allow dir to kill/cancel job */
+
for (quit=false; !quit;) {
/* Read command */
if ((bnet_stat = bs->recv()) <= 0) {
if (reserve_volume(dcr, newname) == NULL) {
ok = false;
}
- Dmsg1(400, "Reserved volume \"%s\"\n", newname);
+ Dmsg1(400, "Reserved Volume=\"%s\" for relabel/truncate.\n", newname);
} else {
ok = false;
}
if (!ok) {
- dir->fsend(_("3908 Error reserving volume: %s\n"), jcr->errmsg);
+ dir->fsend(_("3908 Error reserving Volume=\"%s\": %s"), newname, jcr->errmsg);
dev->max_concurrent_jobs = max_jobs;
dev->Unlock();
goto bail_out;
}
/* some command use recv and don't accept catalog update.
- * it's not the case here, so we force dir_update_volume_info catalog update */
+ * it's not the case here, so we force dir_update_volume_info catalog update */
dcr->force_update_volume_info = true;
if (!dev->is_open() && !dev->is_busy()) {
label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
dev->close(dcr);
/* Under certain "safe" conditions, we can steal the lock */
- } else if (dev->can_steal_lock()) {
- Dmsg0(400, "Can relabel. can_steal_lock\n");
+ } else if (dev->can_obtain_block()) {
+ Dmsg0(400, "Can relabel. can_obtain_block\n");
label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
} else if (dev->is_busy() || dev->is_blocked()) {
send_dir_busy_message(dir, dev);
ok = false;
}
if (!ok) {
- dir->fsend(_("3908 Error reserving volume \"%s\": %s\n"), volname, jcr->errmsg);
+ dir->fsend(_("3908 Error reserving Volume=\"%s\": %s"), volname, jcr->errmsg);
dev->max_concurrent_jobs = max_jobs;
dev->Unlock();
goto bail_out;
}
- if ((!dev->is_open() && !dev->is_busy()) || dev->can_steal_lock()) {
+ if ((!dev->is_open() && !dev->is_busy()) || dev->can_obtain_block()) {
Dmsg0(400, "Call truncate_cache\n");
nbpart = dev->truncate_cache(dcr, volname, &size);
if (nbpart >= 0) {
ok = false;
}
if (!ok) {
- dir->fsend(_("3908 Error reserving volume \"%s\": %s\n"), volname, jcr->errmsg);
+ dir->fsend(_("3908 Error reserving Volume=\"%s\": %s"), volname, jcr->errmsg);
dev->max_concurrent_jobs = max_jobs;
dev->Unlock();
goto bail_out;
}
- if ((!dev->is_open() && !dev->is_busy()) || dev->can_steal_lock()) {
+ if ((!dev->is_open() && !dev->is_busy()) || dev->can_obtain_block()) {
Dmsg0(400, "Can upload, because device is not open.\n");
dev->setVolCatName(volname);
dev->part = 0;
const char *volname = (relabel == 1) ? oldname : newname;
uint64_t volCatBytes;
- steal_device_lock(dev, &hold, BST_WRITING_LABEL);
+ if (!obtain_device_block(dev, &hold, BST_WRITING_LABEL)) {
+ send_dir_busy_message(dir, dev);
+ return;
+ }
Dmsg1(100, "Stole device %s lock, writing label.\n", dev->print_name());
Dmsg0(90, "try_autoload_device - looking for volume_info\n");
case VOL_NO_LABEL:
if (!dev->write_volume_label(dcr, newname, poolname,
relabel, true /* write label now */)) {
- dir->fsend(_("3912 Failed to label Volume: ERR=%s\n"), dcr->jcr->errmsg);
+ dir->fsend(_("3912 Failed to label Volume %s: ERR=%s\n"),
+ newname, dcr->jcr->errmsg);
break;
}
volCatBytes = dev->VolCatInfo.VolCatBytes;
if (dev->is_open() && !dev->has_cap(CAP_ALWAYSOPEN)) {
dev->close(dcr);
}
-
+
dev->end_of_job(dcr);
-
+
if (!dev->is_open()) {
dev->clear_volhdr();
}
volume_unused(dcr); /* no longer using volume */
- give_back_device_lock(dev, &hold);
+ give_back_device_block(dev, &hold);
return;
}
bsteal_lock_t hold;
DEVICE *dev = dcr->dev;
- steal_device_lock(dev, &hold, BST_DOING_ACQUIRE);
+ if (!obtain_device_block(dev, &hold, BST_DOING_ACQUIRE)) {
+ send_dir_busy_message(dir, dev);
+ return false;
+ }
dcr->VolumeName[0] = 0;
dev->clear_labeled(); /* force read of label */
break;
}
volume_unused(dcr);
- give_back_device_lock(dev, &hold);
+ give_back_device_block(dev, &hold);
return ok;
}
dir->fsend(_("3998 Device \"%s\" is not an autochanger.\n"),
dev->print_name());
/* Under certain "safe" conditions, we can steal the lock */
- } else if (safe_cmd || !dev->is_open() || dev->can_steal_lock()) {
+ } else if (safe_cmd || !dev->is_open() || dev->can_obtain_block()) {
autochanger_cmd(dcr, dir, cmd);
} else if (dev->is_busy() || dev->is_blocked()) {
send_dir_busy_message(dir, dev);
read_volume_label(jcr, dcr, dev, Slot);
dev->close(dcr);
/* Under certain "safe" conditions, we can steal the lock */
- } else if (dev->can_steal_lock()) {
+ } else if (dev->can_obtain_block()) {
read_volume_label(jcr, dcr, dev, Slot);
} else if (dev->is_busy() || dev->is_blocked()) {
send_dir_busy_message(dir, dev);
bsteal_lock_t hold;
dcr->set_dev(dev);
- steal_device_lock(dev, &hold, BST_WRITING_LABEL);
+ if (!obtain_device_block(dev, &hold, BST_WRITING_LABEL)) {
+ send_dir_busy_message(dir, dev);
+ return;
+ }
if (!try_autoload_device(jcr, dcr, Slot, "")) {
goto bail_out; /* error */
}
bail_out:
- give_back_device_lock(dev, &hold);
+ give_back_device_block(dev, &hold);
return;
}