mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
dlm: fix wake_up() calls for pending remove
This patch move the wake_up() call at the point when a remove message
completed. Before it was only when a remove message was going to be
sent. The possible waiter in wait_pending_remove() waits until a remove
is done if the resource name matches with the per ls variable
ls->ls_remove_name. If this is the case we must wait until a pending
remove is done which is indicated if DLM_WAIT_PENDING_COND() returns
false which will always be the case when ls_remove_len and
ls_remove_name are unset to indicate that a remove is not going on
anymore.
Fixes: 21d9ac1a53
("fs: dlm: use event based wait for pending remove")
Cc: stable@vger.kernel.org
Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
parent
2c3fa6ae4d
commit
f6f7418357
1 changed files with 2 additions and 2 deletions
|
@ -1810,7 +1810,6 @@ static void shrink_bucket(struct dlm_ls *ls, int b)
|
|||
memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN);
|
||||
spin_unlock(&ls->ls_remove_spin);
|
||||
spin_unlock(&ls->ls_rsbtbl[b].lock);
|
||||
wake_up(&ls->ls_remove_wait);
|
||||
|
||||
send_remove(r);
|
||||
|
||||
|
@ -1819,6 +1818,7 @@ static void shrink_bucket(struct dlm_ls *ls, int b)
|
|||
ls->ls_remove_len = 0;
|
||||
memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN);
|
||||
spin_unlock(&ls->ls_remove_spin);
|
||||
wake_up(&ls->ls_remove_wait);
|
||||
|
||||
dlm_free_rsb(r);
|
||||
}
|
||||
|
@ -4096,7 +4096,6 @@ static void send_repeat_remove(struct dlm_ls *ls, char *ms_name, int len)
|
|||
memcpy(ls->ls_remove_name, name, DLM_RESNAME_MAXLEN);
|
||||
spin_unlock(&ls->ls_remove_spin);
|
||||
spin_unlock(&ls->ls_rsbtbl[b].lock);
|
||||
wake_up(&ls->ls_remove_wait);
|
||||
|
||||
rv = _create_message(ls, sizeof(struct dlm_message) + len,
|
||||
dir_nodeid, DLM_MSG_REMOVE, &ms, &mh);
|
||||
|
@ -4112,6 +4111,7 @@ static void send_repeat_remove(struct dlm_ls *ls, char *ms_name, int len)
|
|||
ls->ls_remove_len = 0;
|
||||
memset(ls->ls_remove_name, 0, DLM_RESNAME_MAXLEN);
|
||||
spin_unlock(&ls->ls_remove_spin);
|
||||
wake_up(&ls->ls_remove_wait);
|
||||
}
|
||||
|
||||
static int receive_request(struct dlm_ls *ls, struct dlm_message *ms)
|
||||
|
|
Loading…
Add table
Reference in a new issue