diff options
author | David Teigland <teigland@redhat.com> | 2006-05-02 13:34:03 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-05-02 13:34:03 -0400 |
commit | 97a35d1e5fab9ff8de27814082b78b2fc9ad94f0 (patch) | |
tree | 551025da17641ccc4df7378da2bb94cedfb2482e /fs/dlm/dlm_internal.h | |
parent | d2d7b8a2a756fb520792ca3db3abdeed9214ae5b (diff) |
[DLM] fix grant_after_purge softlockup
In dlm_grant_after_purge() we were holding a hash table read_lock while
calling put_rsb() which potentially removes the rsb from the hash table,
taking the same lock in write. Fix this by flagging rsb's ahead of time
that have been purged. Then iteratively read_lock the hash table, find a
flagged rsb, unlock, process rsb.
Signed-off-by: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/dlm/dlm_internal.h')
-rw-r--r-- | fs/dlm/dlm_internal.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h index c3299020c8f3..149106f2b80f 100644 --- a/fs/dlm/dlm_internal.h +++ b/fs/dlm/dlm_internal.h | |||
@@ -280,6 +280,7 @@ enum rsb_flags { | |||
280 | RSB_NEW_MASTER, | 280 | RSB_NEW_MASTER, |
281 | RSB_NEW_MASTER2, | 281 | RSB_NEW_MASTER2, |
282 | RSB_RECOVER_CONVERT, | 282 | RSB_RECOVER_CONVERT, |
283 | RSB_LOCKS_PURGED, | ||
283 | }; | 284 | }; |
284 | 285 | ||
285 | static inline void rsb_set_flag(struct dlm_rsb *r, enum rsb_flags flag) | 286 | static inline void rsb_set_flag(struct dlm_rsb *r, enum rsb_flags flag) |