From 8785440f5255258b3c6df338f8b8605080662896 Mon Sep 17 00:00:00 2001 From: Simon Graham Date: Sat, 22 Dec 2007 13:17:14 -0500 Subject: [PATCH] Add split-brain event to netlink --- drbd/drbd_int.h | 1 + drbd/drbd_nl.c | 35 +++++++++++++++++++++++++++++++++++ drbd/drbd_receiver.c | 1 + drbd/linux/drbd_nl.h | 4 ++++ user/drbdsetup.c | 8 ++++++++ 5 files changed, 49 insertions(+), 0 deletions(-) diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h index 01eeba6..b374dc7 100644 --- a/drbd/drbd_int.h +++ b/drbd/drbd_int.h @@ -1426,6 +1426,7 @@ void drbd_nl_cleanup(void); int __init drbd_nl_init(void); void drbd_bcast_state(drbd_dev *mdev, drbd_state_t state); void drbd_bcast_sync_progress(drbd_dev *mdev); +void drbd_bcast_split_brain(drbd_dev *mdev,int flag); /* * inline helper functions diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c index 61593ed..5ef1d89 100644 --- a/drbd/drbd_nl.c +++ b/drbd/drbd_nl.c @@ -1769,6 +1769,41 @@ void drbd_bcast_ev_helper(drbd_dev *mdev, char* helper_name) cn_netlink_send(cn_reply, CN_IDX_DRBD, GFP_KERNEL); } +void drbd_bcast_split_brain(drbd_dev *mdev,int flag) +{ + char buffer[sizeof(struct cn_msg)+ + sizeof(struct drbd_nl_cfg_reply)+ + sizeof(struct split_brain_tag_len_struct)+ + sizeof(short int)]; + struct cn_msg *cn_reply = (struct cn_msg *) buffer; + struct drbd_nl_cfg_reply* reply = (struct drbd_nl_cfg_reply*)cn_reply->data; + unsigned short *tl = reply->tag_list; + int val = flag; + + *tl++ = T_split_brain; + *tl++ = sizeof(int); + memcpy(tl, &val, sizeof(int)); + tl=(unsigned short*)((char*)tl + sizeof(int)); + *tl++ = TT_END; /* Close the tag list */ + + cn_reply->id.idx = CN_IDX_DRBD; + cn_reply->id.val = CN_VAL_DRBD; + + cn_reply->seq = atomic_add_return(1,&drbd_nl_seq); + cn_reply->ack = 0; // not used here. + cn_reply->len = sizeof(struct drbd_nl_cfg_reply) + + (int)((char*)tl - (char*)reply->tag_list); + cn_reply->flags = 0; + + reply->packet_type = P_split_brain; + reply->minor = mdev_to_minor(mdev); + reply->ret_code = NoError; + + TRACE(TraceTypeNl, TraceLvlSummary, nl_trace_reply(cn_reply);); + + cn_netlink_send(cn_reply, CN_IDX_DRBD, GFP_KERNEL); +} + void drbd_bcast_sync_progress(drbd_dev *mdev) { char buffer[sizeof(struct cn_msg)+ diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c index 08ade49..a89921c 100644 --- a/drbd/drbd_receiver.c +++ b/drbd/drbd_receiver.c @@ -2023,6 +2023,7 @@ STATIC drbd_conns_t drbd_sync_handshake(drbd_dev *mdev, drbd_role_t peer_role, drbd_uuid_dump(mdev,"self",mdev->bc->md.uuid); drbd_uuid_dump(mdev,"peer",mdev->p_uuid); drbd_force_state(mdev,NS(conn,Disconnecting)); + drbd_bcast_split_brain(mdev,1);//Tell user we split brained drbd_khelper(mdev,"split-brain"); return conn_mask; } diff --git a/drbd/linux/drbd_nl.h b/drbd/linux/drbd_nl.h index b0e770c..8c6168f 100644 --- a/drbd/linux/drbd_nl.h +++ b/drbd/linux/drbd_nl.h @@ -97,6 +97,10 @@ NL_PACKET(sync_progress, 23, NL_INTEGER( 43, T_MAY_IGNORE, sync_progress) ) +NL_PACKET(split_brain, 24, + NL_INTEGER( 44, T_MAY_IGNORE, split_brain) +) + #undef NL_PACKET #undef NL_INTEGER #undef NL_INT64 diff --git a/user/drbdsetup.c b/user/drbdsetup.c index 0f5ddc2..d088cd8 100644 --- a/user/drbdsetup.c +++ b/user/drbdsetup.c @@ -1238,6 +1238,14 @@ int print_state(unsigned int seq, int u __attribute((unused)), synced % 10); } else fprintf(stderr,"Missing tag !?\n"); break; + case P_split_brain: + if (consume_tag_int(T_split_brain, reply->tag_list, &synced)) { + printf("%u SB %d %d\n", + seq, + reply->minor, + synced); + } else fprintf(stderr,"Missing tag !?\n"); + break; default: printf("%u ?? %d \n",seq, reply->minor); break; -- 1.5.4.rc1