]> 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)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 23 Mar 2022 12:31:59 +0000 (13:31 +0100)
[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>
(cherry picked from commit eee8d8a32e3f39440ac417b2e9ea46d93d4a1d73)

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 044808830084c65100786133cabb73f590dd4b6a..98090860fe11529ef388d6f94ccb4157ac807110 100644 (file)
@@ -120,6 +120,7 @@ struct Config {
 
   Command command = None;
   int pid = 0;
+  std::string cookie;
 
   std::string image_spec() const {
     std::string spec = poolname + "/";
@@ -1330,6 +1331,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) {
@@ -1722,6 +1725,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;