dlm: fix race between remove and lookup
It was possible for a remove message on an old rsb to be sent after a lookup message on a new rsb, where the rsbs were for the same resource name. This could lead to a missing directory entry for the new rsb. It is fixed by keeping a copy of the resource name being removed until after the remove has been sent. A lookup checks if this in-progress remove matches the name it is looking up. Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
@@ -498,6 +498,13 @@ struct rcom_lock {
|
||||
char rl_lvb[0];
|
||||
};
|
||||
|
||||
/*
|
||||
* The max number of resources per rsbtbl bucket that shrink will attempt
|
||||
* to remove in each iteration.
|
||||
*/
|
||||
|
||||
#define DLM_REMOVE_NAMES_MAX 8
|
||||
|
||||
struct dlm_ls {
|
||||
struct list_head ls_list; /* list of lockspaces */
|
||||
dlm_lockspace_t *ls_local_handle;
|
||||
@@ -531,6 +538,12 @@ struct dlm_ls {
|
||||
int ls_new_rsb_count;
|
||||
struct list_head ls_new_rsb; /* new rsb structs */
|
||||
|
||||
spinlock_t ls_remove_spin;
|
||||
char ls_remove_name[DLM_RESNAME_MAXLEN+1];
|
||||
char *ls_remove_names[DLM_REMOVE_NAMES_MAX];
|
||||
int ls_remove_len;
|
||||
int ls_remove_lens[DLM_REMOVE_NAMES_MAX];
|
||||
|
||||
struct list_head ls_nodes; /* current nodes in ls */
|
||||
struct list_head ls_nodes_gone; /* dead node list, recovery */
|
||||
int ls_num_nodes; /* number of nodes in ls */
|
||||
|
Reference in New Issue
Block a user