From: Mykola Golub Date: Mon, 2 Nov 2020 19:07:03 +0000 (+0000) Subject: rbd-nbd: when unmapping or detaching by device try to find process X-Git-Tag: v16.1.0~585^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4cda97a8228fa362405bb5a9497731edafcdc3d8;p=ceph.git rbd-nbd: when unmapping or detaching by device try to find process For `detach` failing to find the process is fatal while unmap will still try to send disconnect to the device. Signed-off-by: Mykola Golub --- diff --git a/qa/workunits/rbd/rbd-nbd.sh b/qa/workunits/rbd/rbd-nbd.sh index 879094dc92b..fd79ba5fe4d 100755 --- a/qa/workunits/rbd/rbd-nbd.sh +++ b/qa/workunits/rbd/rbd-nbd.sh @@ -321,6 +321,10 @@ _sudo rbd-nbd detach ${POOL}/${IMAGE} 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 diff --git a/src/tools/rbd_nbd/rbd-nbd.cc b/src/tools/rbd_nbd/rbd-nbd.cc index edec26932b5..a4fb7c10101 100644 --- a/src/tools/rbd_nbd/rbd-nbd.cc +++ b/src/tools/rbd_nbd/rbd-nbd.cc @@ -1864,6 +1864,17 @@ static bool find_mapped_dev_by_spec(Config *cfg, int skip_pid=-1) { 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& args, std::ostream *err_msg, Config *cfg) { @@ -2077,8 +2088,14 @@ static int rbd_nbd(int argc, const char *argv[]) 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; } @@ -2087,10 +2104,14 @@ static int rbd_nbd(int argc, const char *argv[]) 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)