]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-nbd: fix unused nbd device search bug in container 18663/head
authorLi Wang <laurence.liwang@gmail.com>
Wed, 1 Nov 2017 09:21:29 +0000 (09:21 +0000)
committerLi Wang <laurence.liwang@gmail.com>
Fri, 3 Nov 2017 03:02:08 +0000 (03:02 +0000)
In some container scenarios, the host may choose to
map a specific nbd device, for example, /dev/nbd6 into the
container, in that case, the nbd device available in the
container is not numbered from 0. The current unused
nbd device search function will return no result.
This patch fixes it.

Fixes: http://tracker.ceph.com/issues/22012
Signed-off-by: Li Wang <laurence.liwang@gmail.com>
Reviewed-by: Yunchuan Wen <yunchuan.wen@kylin-cloud.com>
src/tools/rbd_nbd/rbd-nbd.cc

index d5d614fa8359c3e1dec7561601053ac1035db0ff..371f5301ba06a55ceee8215f13f87f28959b521e 100644 (file)
@@ -605,12 +605,27 @@ static int do_map(int argc, const char *argv[], Config *cfg)
   if (cfg->devpath.empty()) {
     char dev[64];
     bool try_load_module = true;
+    const char *path = "/sys/module/nbd/parameters/nbds_max";
+    int nbds_max = -1;
+    if (access(path, F_OK) == 0) {
+      std::ifstream ifs;
+      ifs.open(path, std::ifstream::in);
+      if (ifs.is_open()) {
+        ifs >> nbds_max;
+        ifs.close();
+      }
+    }
+
     while (true) {
       snprintf(dev, sizeof(dev), "/dev/nbd%d", index);
 
       nbd = open_device(dev, cfg, try_load_module);
       try_load_module = false;
       if (nbd < 0) {
+        if (nbd == -EPERM && nbds_max != -1 && index < (nbds_max-1)) {
+          ++index;
+          continue;
+        }
         r = nbd;
         cerr << "rbd-nbd: failed to find unused device" << std::endl;
         goto close_fd;