Commit 1b05fae7 authored by Ilya Dryomov's avatar Ilya Dryomov
Browse files

libceph: switch to the new "osd blocklist add" command



Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 0b98acd6
Loading
Loading
Loading
Loading
+52 −15
Original line number Diff line number Diff line
@@ -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,27 +926,63 @@ 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)
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.
	 */
		ret = ceph_wait_for_latest_osdmap(monc->client, 0);

out:
	put_generic_request(req);
	return ret;
	return ceph_wait_for_latest_osdmap(monc->client, 0);
}
EXPORT_SYMBOL(ceph_monc_blocklist_add);