Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 737cc81e authored by Ilya Dryomov's avatar Ilya Dryomov
Browse files

libceph: support for subscribing to "mdsmap.<id>" maps



Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 7cca78c9
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -208,6 +208,8 @@ struct ceph_mon_subscribe_ack {
	struct ceph_fsid fsid;
} __attribute__ ((packed));

#define CEPH_FS_CLUSTER_ID_NONE  -1

/*
 * mdsmap flags
 */
+1 −0
Original line number Diff line number Diff line
@@ -96,6 +96,7 @@ struct ceph_mon_client {
		bool want;
		u32 have; /* epoch */
	} subs[3];
	int fs_cluster_id; /* "mdsmap.<id>" sub */

#ifdef CONFIG_DEBUG_FS
	struct dentry *debugfs_file;
+1 −0
Original line number Diff line number Diff line
@@ -128,6 +128,7 @@ static int monc_show(struct seq_file *s, void *p)
					CEPH_SUBSCRIBE_ONETIME ?  "" : "+"));
		seq_putc(s, '\n');
	}
	seq_printf(s, "fs_cluster_id %d\n", monc->fs_cluster_id);

	for (rp = rb_first(&monc->generic_request_tree); rp; rp = rb_next(rp)) {
		__u16 op;
+13 −5
Original line number Diff line number Diff line
@@ -260,20 +260,26 @@ static void __send_subscribe(struct ceph_mon_client *monc)
	BUG_ON(num < 1); /* monmap sub is always there */
	ceph_encode_32(&p, num);
	for (i = 0; i < ARRAY_SIZE(monc->subs); i++) {
		const char *s = ceph_sub_str[i];
		char buf[32];
		int len;

		if (!monc->subs[i].want)
			continue;

		dout("%s %s start %llu flags 0x%x\n", __func__, s,
		len = sprintf(buf, "%s", ceph_sub_str[i]);
		if (i == CEPH_SUB_MDSMAP &&
		    monc->fs_cluster_id != CEPH_FS_CLUSTER_ID_NONE)
			len += sprintf(buf + len, ".%d", monc->fs_cluster_id);

		dout("%s %s start %llu flags 0x%x\n", __func__, buf,
		     le64_to_cpu(monc->subs[i].item.start),
		     monc->subs[i].item.flags);
		ceph_encode_string(&p, end, s, strlen(s));
		ceph_encode_string(&p, end, buf, len);
		memcpy(p, &monc->subs[i].item, sizeof(monc->subs[i].item));
		p += sizeof(monc->subs[i].item);
	}

	BUG_ON(p != (end - 35 - (ARRAY_SIZE(monc->subs) - num) * 19));
	BUG_ON(p > end);
	msg->front.iov_len = p - msg->front.iov_base;
	msg->hdr.front_len = cpu_to_le32(msg->front.iov_len);
	ceph_msg_revoke(msg);
@@ -948,7 +954,7 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
	if (!monc->m_subscribe_ack)
		goto out_auth;

	monc->m_subscribe = ceph_msg_new(CEPH_MSG_MON_SUBSCRIBE, 96, GFP_NOFS,
	monc->m_subscribe = ceph_msg_new(CEPH_MSG_MON_SUBSCRIBE, 128, GFP_NOFS,
					 true);
	if (!monc->m_subscribe)
		goto out_subscribe_ack;
@@ -974,6 +980,8 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
	monc->generic_request_tree = RB_ROOT;
	monc->last_tid = 0;

	monc->fs_cluster_id = CEPH_FS_CLUSTER_ID_NONE;

	return 0;

out_auth_reply: