]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-nbd: generate and send device cookie with netlink connect request
authorPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Wed, 12 May 2021 13:00:46 +0000 (18:30 +0530)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Tue, 26 Oct 2021 13:54:13 +0000 (19:24 +0530)
[root@linux-vm1]# rbd-nbd map rbd-pool/image0 --try-netlink
/dev/nbd0

[root@linux-vm1]# cat /sys/block/nbd0/backend
c704cb91-c6cf-466e-a335-0e935c0d5e47

Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
src/tools/rbd_nbd/nbd-netlink.h
src/tools/rbd_nbd/rbd-nbd.cc

index c5d0ef7aa7d5c25cdf8b0bebe935f353a7231311..2d0b90964227a068a0950ae549c70b4128bd3c72 100644 (file)
@@ -35,6 +35,7 @@ enum {
        NBD_ATTR_SOCKETS,
        NBD_ATTR_DEAD_CONN_TIMEOUT,
        NBD_ATTR_DEVICE_LIST,
+       NBD_ATTR_BACKEND_IDENTIFIER,
        __NBD_ATTR_MAX,
 };
 #define NBD_ATTR_MAX (__NBD_ATTR_MAX - 1)
index 1f8eb54fa016ad455b637a86810a704d5946f9bf..5356dfb5798c3892bf5c19a7ae42c9c470f5df26 100644 (file)
@@ -123,6 +123,7 @@ struct Config {
 
   Command command = None;
   int pid = 0;
+  std::string cookie;
 
   std::string image_spec() const {
     std::string spec = poolname + "/";
@@ -1325,6 +1326,8 @@ static int netlink_connect(Config *cfg, struct nl_sock *sock, int nl_id, int fd,
   NLA_PUT_U64(msg, NBD_ATTR_BLOCK_SIZE_BYTES, RBD_NBD_BLKSIZE);
   NLA_PUT_U64(msg, NBD_ATTR_SERVER_FLAGS, flags);
   NLA_PUT_U64(msg, NBD_ATTR_DEAD_CONN_TIMEOUT, cfg->reattach_timeout);
+  if (!cfg->cookie.empty())
+    NLA_PUT_STRING(msg, NBD_ATTR_BACKEND_IDENTIFIER, cfg->cookie.c_str());
 
   sock_attr = nla_nest_start(msg, NBD_ATTR_SOCKETS);
   if (!sock_attr) {
@@ -1719,6 +1722,11 @@ static int do_map(int argc, const char *argv[], Config *cfg, bool reconnect)
 
   use_netlink = cfg->try_netlink || reconnect;
   if (use_netlink) {
+    if (!reconnect) {
+      uuid_d uuid_gen;
+      uuid_gen.generate_random();
+      cfg->cookie = uuid_gen.to_string();
+    }
     r = try_netlink_setup(cfg, fd[0], size, flags, reconnect);
     if (r < 0) {
       goto free_server;