expect_false get_pid
_sudo rbd-nbd attach --device ${DEV} ${POOL}/${IMAGE}
get_pid
+_sudo rbd-nbd detach ${DEV}
+expect_false get_pid
+_sudo rbd-nbd attach --device ${DEV} ${POOL}/${IMAGE}
+get_pid
ls ${TEMPDIR}/mnt/
dd if=${TEMPDIR}/mnt/test of=/dev/null bs=1M count=1
_sudo dd if=${DATA} of=${TEMPDIR}/mnt/test1 bs=1M count=1 oflag=direct
return false;
}
+static int find_proc_by_dev(Config *cfg) {
+ Config c;
+ NBDListIterator it;
+ while (it.get(&c)) {
+ if (c.devpath == cfg->devpath) {
+ *cfg = c;
+ return true;
+ }
+ }
+ return false;
+}
static int parse_args(vector<const char*>& args, std::ostream *err_msg,
Config *cfg) {
return -EINVAL;
break;
case Detach:
- if (cfg.devpath.empty() && !find_mapped_dev_by_spec(&cfg)) {
- cerr << "rbd-nbd: " << cfg.image_spec() << " is not mapped"
+ if (cfg.devpath.empty()) {
+ if (!find_mapped_dev_by_spec(&cfg)) {
+ cerr << "rbd-nbd: " << cfg.image_spec() << " is not mapped"
+ << std::endl;
+ return -ENOENT;
+ }
+ } else if (!find_proc_by_dev(&cfg)) {
+ cerr << "rbd-nbd: no process attached to " << cfg.devpath << " found"
<< std::endl;
return -ENOENT;
}
return -EINVAL;
break;
case Unmap:
- if (cfg.devpath.empty() && !find_mapped_dev_by_spec(&cfg)) {
- cerr << "rbd-nbd: " << cfg.image_spec() << " is not mapped"
- << std::endl;
- return -ENOENT;
+ if (cfg.devpath.empty()) {
+ if (!find_mapped_dev_by_spec(&cfg)) {
+ cerr << "rbd-nbd: " << cfg.image_spec() << " is not mapped"
+ << std::endl;
+ return -ENOENT;
+ }
+ } else if (!find_proc_by_dev(&cfg)) {
+ // still try to send disconnect to the device
}
r = do_unmap(&cfg);
if (r < 0)