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

Commit e76f8237 authored by Junxiao Bi's avatar Junxiao Bi Committed by Linus Torvalds
Browse files

ocfs2: o2hb: add NEGOTIATE_APPROVE message



This message is used to re-queue write timeout timer and negotiate timer
when all nodes suffer a write hung to storage, this makes node not fence
self if storage down.

Signed-off-by: default avatarJunxiao Bi <junxiao.bi@oracle.com>
Reviewed-by: default avatarRyan Ding <ryan.ding@oracle.com>
Reviewed-by: default avatarMark Fasheh <mfasheh@suse.de>
Cc: Gang He <ghe@suse.com>
Cc: rwxybh <rwxybh@126.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Joseph Qi <joseph.qi@huawei.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 34069b88
Loading
Loading
Loading
Loading
+27 −1
Original line number Original line Diff line number Diff line
@@ -294,6 +294,7 @@ struct o2hb_bio_wait_ctxt {


enum {
enum {
	O2HB_NEGO_TIMEOUT_MSG = 1,
	O2HB_NEGO_TIMEOUT_MSG = 1,
	O2HB_NEGO_APPROVE_MSG = 2,
};
};


struct o2hb_nego_msg {
struct o2hb_nego_msg {
@@ -388,7 +389,7 @@ static int o2hb_send_nego_msg(int key, int type, u8 target)
static void o2hb_nego_timeout(struct work_struct *work)
static void o2hb_nego_timeout(struct work_struct *work)
{
{
	unsigned long live_node_bitmap[BITS_TO_LONGS(O2NM_MAX_NODES)];
	unsigned long live_node_bitmap[BITS_TO_LONGS(O2NM_MAX_NODES)];
	int master_node;
	int master_node, i;
	struct o2hb_region *reg;
	struct o2hb_region *reg;


	reg = container_of(work, struct o2hb_region, hr_nego_timeout_work.work);
	reg = container_of(work, struct o2hb_region, hr_nego_timeout_work.work);
@@ -410,6 +411,17 @@ static void o2hb_nego_timeout(struct work_struct *work)
		}
		}


		/* approve negotiate timeout request. */
		/* approve negotiate timeout request. */
		o2hb_arm_timeout(reg);

		i = -1;
		while ((i = find_next_bit(live_node_bitmap,
				O2NM_MAX_NODES, i + 1)) < O2NM_MAX_NODES) {
			if (i == master_node)
				continue;

			o2hb_send_nego_msg(reg->hr_key,
					O2HB_NEGO_APPROVE_MSG, i);
		}
	} else {
	} else {
		/* negotiate timeout with master node. */
		/* negotiate timeout with master node. */
		o2hb_send_nego_msg(reg->hr_key, O2HB_NEGO_TIMEOUT_MSG,
		o2hb_send_nego_msg(reg->hr_key, O2HB_NEGO_TIMEOUT_MSG,
@@ -432,6 +444,13 @@ static int o2hb_nego_timeout_handler(struct o2net_msg *msg, u32 len, void *data,
	return 0;
	return 0;
}
}


static int o2hb_nego_approve_handler(struct o2net_msg *msg, u32 len, void *data,
				void **ret_data)
{
	o2hb_arm_timeout(data);
	return 0;
}

static inline void o2hb_bio_wait_init(struct o2hb_bio_wait_ctxt *wc)
static inline void o2hb_bio_wait_init(struct o2hb_bio_wait_ctxt *wc)
{
{
	atomic_set(&wc->wc_num_reqs, 1);
	atomic_set(&wc->wc_num_reqs, 1);
@@ -2099,6 +2118,13 @@ static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *g
	if (ret)
	if (ret)
		goto free;
		goto free;


	ret = o2net_register_handler(O2HB_NEGO_APPROVE_MSG, reg->hr_key,
			sizeof(struct o2hb_nego_msg),
			o2hb_nego_approve_handler,
			reg, NULL, &reg->hr_handler_list);
	if (ret)
		goto unregister_handler;

	ret = o2hb_debug_region_init(reg, o2hb_debug_dir);
	ret = o2hb_debug_region_init(reg, o2hb_debug_dir);
	if (ret) {
	if (ret) {
		config_item_put(&reg->hr_item);
		config_item_put(&reg->hr_item);