mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
e125fbeb53
This patch fixes an deadlock issue when dlm_lowcomms_close() is called. When dlm_lowcomms_close() is called the clusters_root.subsys.su_mutex is held to remove configfs items. At this time we flushing (e.g. cancel_work_sync()) the workers of send and recv workqueue. Due the fact that we accessing configfs items (mark values), these workers will lock clusters_root.subsys.su_mutex as well which are already hold by dlm_lowcomms_close() and ends in a deadlock situation. [67170.703046] ====================================================== [67170.703965] WARNING: possible circular locking dependency detected [67170.704758] 5.11.0-rc4+ #22 Tainted: G W [67170.705433] ------------------------------------------------------ [67170.706228] dlm_controld/280 is trying to acquire lock: [67170.706915] ffff9f2f475a6948 ((wq_completion)dlm_recv){+.+.}-{0:0}, at: __flush_work+0x203/0x4c0 [67170.708026] but task is already holding lock: [67170.708758] ffffffffa132f878 (&clusters_root.subsys.su_mutex){+.+.}-{3:3}, at: configfs_rmdir+0x29b/0x310 [67170.710016] which lock already depends on the new lock. The new behaviour adds the mark value to the node address configuration which doesn't require to held the clusters_root.subsys.su_mutex by accessing mark values in a separate datastructure. However the mark values can be set now only after a node address was set which is the case when the user is using dlm_controld. Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: David Teigland <teigland@redhat.com>
56 lines
1.4 KiB
C
56 lines
1.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/******************************************************************************
|
|
*******************************************************************************
|
|
**
|
|
** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
|
|
** Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
|
|
**
|
|
**
|
|
*******************************************************************************
|
|
******************************************************************************/
|
|
|
|
#ifndef __CONFIG_DOT_H__
|
|
#define __CONFIG_DOT_H__
|
|
|
|
#define DEFAULT_BUFFER_SIZE 4096
|
|
|
|
struct dlm_config_node {
|
|
int nodeid;
|
|
int weight;
|
|
int new;
|
|
uint32_t comm_seq;
|
|
};
|
|
|
|
#define DLM_MAX_ADDR_COUNT 3
|
|
|
|
struct dlm_config_info {
|
|
int ci_tcp_port;
|
|
int ci_buffer_size;
|
|
int ci_rsbtbl_size;
|
|
int ci_recover_timer;
|
|
int ci_toss_secs;
|
|
int ci_scan_secs;
|
|
int ci_log_debug;
|
|
int ci_log_info;
|
|
int ci_protocol;
|
|
int ci_mark;
|
|
int ci_timewarn_cs;
|
|
int ci_waitwarn_us;
|
|
int ci_new_rsb_count;
|
|
int ci_recover_callbacks;
|
|
char ci_cluster_name[DLM_LOCKSPACE_LEN];
|
|
};
|
|
|
|
extern struct dlm_config_info dlm_config;
|
|
|
|
int dlm_config_init(void);
|
|
void dlm_config_exit(void);
|
|
int dlm_config_nodes(char *lsname, struct dlm_config_node **nodes_out,
|
|
int *count_out);
|
|
int dlm_comm_seq(int nodeid, uint32_t *seq);
|
|
int dlm_our_nodeid(void);
|
|
int dlm_our_addr(struct sockaddr_storage *addr, int num);
|
|
|
|
#endif /* __CONFIG_DOT_H__ */
|
|
|