libceph: switch to the new "osd blocklist add" command
authorIlya Dryomov <idryomov@gmail.com>
Tue, 15 Sep 2020 18:38:34 +0000 (20:38 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 12 Oct 2020 13:29:26 +0000 (15:29 +0200)
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
net/ceph/mon_client.c

index efcdde4..c4cf252 100644 (file)
@@ -896,8 +896,9 @@ bad:
        ceph_msg_dump(msg);
 }
 
-int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
-                           struct ceph_entity_addr *client_addr)
+static __printf(2, 0)
+int do_mon_command_vargs(struct ceph_mon_client *monc, const char *fmt,
+                        va_list ap)
 {
        struct ceph_mon_generic_request *req;
        struct ceph_mon_command *h;
@@ -925,28 +926,64 @@ int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
        h->monhdr.session_mon_tid = 0;
        h->fsid = monc->monmap->fsid;
        h->num_strs = cpu_to_le32(1);
-       len = sprintf(h->str, "{ \"prefix\": \"osd blacklist\", \
-                                \"blacklistop\": \"add\", \
-                                \"addr\": \"%pISpc/%u\" }",
-                     &client_addr->in_addr, le32_to_cpu(client_addr->nonce));
+       len = vsprintf(h->str, fmt, ap);
        h->str_len = cpu_to_le32(len);
        send_generic_request(monc, req);
        mutex_unlock(&monc->mutex);
 
        ret = wait_generic_request(req);
-       if (!ret)
-               /*
-                * Make sure we have the osdmap that includes the blocklist
-                * entry.  This is needed to ensure that the OSDs pick up the
-                * new blocklist before processing any future requests from
-                * this client.
-                */
-               ret = ceph_wait_for_latest_osdmap(monc->client, 0);
-
 out:
        put_generic_request(req);
        return ret;
 }
+
+static __printf(2, 3)
+int do_mon_command(struct ceph_mon_client *monc, const char *fmt, ...)
+{
+       va_list ap;
+       int ret;
+
+       va_start(ap, fmt);
+       ret = do_mon_command_vargs(monc, fmt, ap);
+       va_end(ap);
+       return ret;
+}
+
+int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
+                           struct ceph_entity_addr *client_addr)
+{
+       int ret;
+
+       ret = do_mon_command(monc,
+                            "{ \"prefix\": \"osd blocklist\", \
+                               \"blocklistop\": \"add\", \
+                               \"addr\": \"%pISpc/%u\" }",
+                            &client_addr->in_addr,
+                            le32_to_cpu(client_addr->nonce));
+       if (ret == -EINVAL) {
+               /*
+                * The monitor returns EINVAL on an unrecognized command.
+                * Try the legacy command -- it is exactly the same except
+                * for the name.
+                */
+               ret = do_mon_command(monc,
+                                    "{ \"prefix\": \"osd blacklist\", \
+                                       \"blacklistop\": \"add\", \
+                                       \"addr\": \"%pISpc/%u\" }",
+                                    &client_addr->in_addr,
+                                    le32_to_cpu(client_addr->nonce));
+       }
+       if (ret)
+               return ret;
+
+       /*
+        * Make sure we have the osdmap that includes the blocklist
+        * entry.  This is needed to ensure that the OSDs pick up the
+        * new blocklist before processing any future requests from
+        * this client.
+        */
+       return ceph_wait_for_latest_osdmap(monc->client, 0);
+}
 EXPORT_SYMBOL(ceph_monc_blocklist_add);
 
 /*