-
- if (sscanf(dir->msg, "mount %127s", dname.c_str()) == 1) {
- dev = find_device(jcr, dname);
- dcr = jcr->dcr;
- if (dev) {
- P(dev->mutex); /* Use P to avoid indefinite block */
- switch (dev->dev_blocked) { /* device blocked? */
- case BST_WAITING_FOR_SYSOP:
- /* Someone is waiting, wake him */
- Dmsg0(100, "Waiting for mount. Attempting to wake thread\n");
- dev->dev_blocked = BST_MOUNT;
- bnet_fsend(dir, "3001 OK mount. Device=%s\n", dev_name(dev));
- pthread_cond_signal(&dev->wait_next_vol);
- break;
-
- /* In both of these two cases, we (the user) unmounted the Volume */
- case BST_UNMOUNTED_WAITING_FOR_SYSOP:
- case BST_UNMOUNTED:
- /* We freed the device, so reopen it and wake any waiting threads */
- if (open_dev(dev, NULL, OPEN_READ_WRITE) < 0) {
- bnet_fsend(dir, _("3901 open device failed: ERR=%s\n"),
- strerror_dev(dev));
- break;
- }
- read_dev_volume_label(dcr);
- if (dev->dev_blocked == BST_UNMOUNTED) {
- /* We blocked the device, so unblock it */
- Dmsg0(100, "Unmounted. Unblocking device\n");
- read_label(dcr); /* this should not be necessary */
- unblock_device(dev);
- } else {
- Dmsg0(100, "Unmounted waiting for mount. Attempting to wake thread\n");
- dev->dev_blocked = BST_MOUNT;
- }
- if (dev_state(dev, ST_LABEL)) {
- bnet_fsend(dir, _("3001 Device %s is mounted with Volume \"%s\"\n"),
- dev_name(dev), dev->VolHdr.VolName);
- } else {
- bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n"
- "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
- dev_name(dev));
- }
- pthread_cond_signal(&dev->wait_next_vol);
- break;
-
- case BST_DOING_ACQUIRE:
- bnet_fsend(dir, _("3001 Device %s is mounted; doing acquire.\n"),
- dev_name(dev));
- break;
-
- case BST_WRITING_LABEL:
- bnet_fsend(dir, _("3903 Device %s is being labeled.\n"), dev_name(dev));
- break;
-
- case BST_NOT_BLOCKED:
- if (dev_state(dev, ST_OPENED)) {
- if (dev_state(dev, ST_LABEL)) {
- bnet_fsend(dir, _("3001 Device %s is mounted with Volume \"%s\"\n"),
- dev_name(dev), dev->VolHdr.VolName);
- } else {
- bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n"
- "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
- dev_name(dev));
- }
- } else {
- if (!dev_is_tape(dev)) {
- bnet_fsend(dir, _("3906 cannot mount non-tape.\n"));
- break;
- }
- if (open_dev(dev, NULL, OPEN_READ_WRITE) < 0) {
- bnet_fsend(dir, _("3901 open device failed: ERR=%s\n"),
- strerror_dev(dev));
- break;
- }
- read_label(dcr);
- if (dev_state(dev, ST_LABEL)) {
- bnet_fsend(dir, _("3001 Device %s is already mounted with Volume \"%s\"\n"),
- dev_name(dev), dev->VolHdr.VolName);
- } else {
- bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n"
- "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
- dev_name(dev));
- }
- }
- break;
-
- default:
- bnet_fsend(dir, _("3905 Bizarre wait state %d\n"), dev->dev_blocked);
- break;
- }
- V(dev->mutex);
+ int drive;
+ int slot = 0;
+ bool ok;
+
+ ok = sscanf(dir->msg, "mount %127s drive=%d slot=%d", devname.c_str(),
+ &drive, &slot) == 3;
+ if (!ok) {
+ ok = sscanf(dir->msg, "mount %127s drive=%d", devname.c_str(), &drive) == 2;
+ }
+ if (ok) {
+ dcr = find_device(jcr, devname, drive);
+ if (dcr) {
+ dev = dcr->dev;
+ dev->dlock(); /* Use P to avoid indefinite block */
+ Dmsg1(100, "mount cmd blocked=%d\n", dev->blocked());
+ switch (dev->blocked()) { /* device blocked? */
+ case BST_WAITING_FOR_SYSOP:
+ /* Someone is waiting, wake him */
+ Dmsg0(100, "Waiting for mount. Attempting to wake thread\n");
+ dev->set_blocked(BST_MOUNT);
+ bnet_fsend(dir, "3001 OK mount. Device=%s\n",
+ dev->print_name());
+ pthread_cond_broadcast(&dev->wait_next_vol);
+ Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)dcr->jcr->JobId);
+ pthread_cond_broadcast(&wait_device_release);
+ break;
+
+ /* In both of these two cases, we (the user) unmounted the Volume */
+ case BST_UNMOUNTED_WAITING_FOR_SYSOP:
+ case BST_UNMOUNTED:
+ if (dev->is_autochanger() && slot > 0) {
+ try_autoload_device(jcr, slot, "");
+ }
+ /* We freed the device, so reopen it and wake any waiting threads */
+ if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
+ bnet_fsend(dir, _("3901 open device failed: ERR=%s\n"),
+ dev->bstrerror());
+ if (dev->blocked() == BST_UNMOUNTED) {
+ /* We blocked the device, so unblock it */
+ Dmsg0(100, "Unmounted. Unblocking device\n");
+ unblock_device(dev);
+ }
+ break;
+ }
+ read_dev_volume_label(dcr);
+ if (dev->blocked() == BST_UNMOUNTED) {
+ /* We blocked the device, so unblock it */
+ Dmsg0(100, "Unmounted. Unblocking device\n");
+ read_label(dcr); /* this should not be necessary */
+ unblock_device(dev);
+ } else {
+ Dmsg0(100, "Unmounted waiting for mount. Attempting to wake thread\n");
+ dev->set_blocked(BST_MOUNT);
+ }
+ if (dev->is_labeled()) {
+ bnet_fsend(dir, _("3001 Device %s is mounted with Volume \"%s\"\n"),
+ dev->print_name(), dev->VolHdr.VolumeName);
+ } else {
+ bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n"
+ "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
+ dev->print_name());
+ }
+ pthread_cond_broadcast(&dev->wait_next_vol);
+ Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)dcr->jcr->JobId);
+ pthread_cond_broadcast(&wait_device_release);
+ break;
+
+ case BST_DOING_ACQUIRE:
+ bnet_fsend(dir, _("3001 Device %s is doing acquire.\n"),
+ dev->print_name());
+ break;
+
+ case BST_WRITING_LABEL:
+ bnet_fsend(dir, _("3903 Device %s is being labeled.\n"),
+ dev->print_name());
+ break;
+
+ case BST_NOT_BLOCKED:
+ if (dev->is_autochanger() && slot > 0) {
+ try_autoload_device(jcr, slot, "");
+ }
+ if (dev->is_open()) {
+ if (dev->is_labeled()) {
+ bnet_fsend(dir, _("3001 Device %s is mounted with Volume \"%s\"\n"),
+ dev->print_name(), dev->VolHdr.VolumeName);
+ } else {
+ bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n"
+ "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
+ dev->print_name());
+ }
+ } else if (dev->is_tape()) {
+ if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
+ bnet_fsend(dir, _("3901 open device failed: ERR=%s\n"),
+ dev->bstrerror());
+ break;
+ }
+ read_label(dcr);
+ if (dev->is_labeled()) {
+ bnet_fsend(dir, _("3001 Device %s is already mounted with Volume \"%s\"\n"),
+ dev->print_name(), dev->VolHdr.VolumeName);
+ } else {
+ bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n"
+ "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
+ dev->print_name());
+ }
+ } else if (dev->is_dvd()) {
+ if (dev->mount(1)) {
+ bnet_fsend(dir, _("3002 Device %s is mounted.\n"),
+ dev->print_name());
+ } else {
+ bnet_fsend(dir, _("3907 %s"), dev->bstrerror());
+ }
+ } else { /* must be file */
+ bnet_fsend(dir, _("3906 File device %s is always mounted.\n"),
+ dev->print_name());
+ }
+ break;
+
+ default:
+ bnet_fsend(dir, _("3905 Bizarre wait state %d\n"), dev->blocked());
+ break;
+ }
+ dev->dunlock();
+ free_dcr(dcr);
+ jcr->dcr = NULL;