mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-18 08:35:08 +08:00
b8b750e0c9
The current dlm version detection is very complex due to backwards compatablilty with earlier dlm protocol versions. It takes some time to detect if a peer node has a specific DLM version. If it's not detected, we just cut the socket connection. There could be cases where the local node has not detected the version yet, but the peer node has. In these cases, we are trying to shutdown the dlm connection with a FIN/ACK message exchange to be sure the other peer is ready to shutdown the connection on dlm application level. However this mechanism is only available on DLM protocol version 3.2 and we need to be sure the DLM version is detected before. To make it more robust we introduce a a "best effort" wait to wait for the version detection before shutdown the dlm connection. This need to be done before the kthread recoverd for recovery handling is stopped, because recovery handling will trigger enough messages to have a version detection going on. It is a corner case which was detected by modprobe dlm_locktroture module and rmmod dlm_locktorture module directly afterwards (in a looping behaviour). In practice probably nobody would leave a lockspace immediately after joining it. Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: David Teigland <teigland@redhat.com>
43 lines
1.7 KiB
C
43 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/******************************************************************************
|
|
*******************************************************************************
|
|
**
|
|
** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
|
|
** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
|
|
**
|
|
**
|
|
*******************************************************************************
|
|
******************************************************************************/
|
|
|
|
#ifndef __MIDCOMMS_DOT_H__
|
|
#define __MIDCOMMS_DOT_H__
|
|
|
|
struct midcomms_node;
|
|
|
|
int dlm_validate_incoming_buffer(int nodeid, unsigned char *buf, int len);
|
|
int dlm_process_incoming_buffer(int nodeid, unsigned char *buf, int buflen);
|
|
struct dlm_mhandle *dlm_midcomms_get_mhandle(int nodeid, int len,
|
|
gfp_t allocation, char **ppc);
|
|
void dlm_midcomms_commit_mhandle(struct dlm_mhandle *mh, const void *name,
|
|
int namelen);
|
|
void dlm_midcomms_version_wait(void);
|
|
int dlm_midcomms_close(int nodeid);
|
|
int dlm_midcomms_start(void);
|
|
void dlm_midcomms_stop(void);
|
|
void dlm_midcomms_init(void);
|
|
void dlm_midcomms_exit(void);
|
|
void dlm_midcomms_shutdown(void);
|
|
void dlm_midcomms_add_member(int nodeid);
|
|
void dlm_midcomms_remove_member(int nodeid);
|
|
void dlm_midcomms_unack_msg_resend(int nodeid);
|
|
const char *dlm_midcomms_state(struct midcomms_node *node);
|
|
unsigned long dlm_midcomms_flags(struct midcomms_node *node);
|
|
int dlm_midcomms_send_queue_cnt(struct midcomms_node *node);
|
|
uint32_t dlm_midcomms_version(struct midcomms_node *node);
|
|
int dlm_midcomms_rawmsg_send(struct midcomms_node *node, void *buf,
|
|
int buflen);
|
|
struct kmem_cache *dlm_midcomms_cache_create(void);
|
|
|
|
#endif /* __MIDCOMMS_DOT_H__ */
|
|
|