diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-16 17:04:08 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-16 17:04:08 -0500 |
| commit | ab479995b191b4256183956c13caabb86331af8e (patch) | |
| tree | 2ea790675933d907d6d6b549de22b940c6ce76b7 /fs/ocfs2/dlm/dlmrecovery.c | |
| parent | 26d451b603e754ded83f0e5becab2a78253ad100 (diff) | |
| parent | f671c09bce88ea253d576c842f8f39d9a2a29028 (diff) | |
Merge branch 'upstream-linus' of git://oss.oracle.com/home/sourcebo/git/ocfs2
Diffstat (limited to 'fs/ocfs2/dlm/dlmrecovery.c')
| -rw-r--r-- | fs/ocfs2/dlm/dlmrecovery.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index 186e9a76aa58..ed76bda1a534 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c | |||
| @@ -278,6 +278,24 @@ int dlm_is_node_dead(struct dlm_ctxt *dlm, u8 node) | |||
| 278 | return dead; | 278 | return dead; |
| 279 | } | 279 | } |
| 280 | 280 | ||
| 281 | int dlm_wait_for_node_death(struct dlm_ctxt *dlm, u8 node, int timeout) | ||
| 282 | { | ||
| 283 | if (timeout) { | ||
| 284 | mlog(ML_NOTICE, "%s: waiting %dms for notification of " | ||
| 285 | "death of node %u\n", dlm->name, timeout, node); | ||
| 286 | wait_event_timeout(dlm->dlm_reco_thread_wq, | ||
| 287 | dlm_is_node_dead(dlm, node), | ||
| 288 | msecs_to_jiffies(timeout)); | ||
| 289 | } else { | ||
| 290 | mlog(ML_NOTICE, "%s: waiting indefinitely for notification " | ||
| 291 | "of death of node %u\n", dlm->name, node); | ||
| 292 | wait_event(dlm->dlm_reco_thread_wq, | ||
| 293 | dlm_is_node_dead(dlm, node)); | ||
| 294 | } | ||
| 295 | /* for now, return 0 */ | ||
| 296 | return 0; | ||
| 297 | } | ||
| 298 | |||
| 281 | /* callers of the top-level api calls (dlmlock/dlmunlock) should | 299 | /* callers of the top-level api calls (dlmlock/dlmunlock) should |
| 282 | * block on the dlm->reco.event when recovery is in progress. | 300 | * block on the dlm->reco.event when recovery is in progress. |
| 283 | * the dlm recovery thread will set this state when it begins | 301 | * the dlm recovery thread will set this state when it begins |
| @@ -2032,6 +2050,30 @@ again: | |||
| 2032 | dlm->reco.new_master); | 2050 | dlm->reco.new_master); |
| 2033 | status = -EEXIST; | 2051 | status = -EEXIST; |
| 2034 | } else { | 2052 | } else { |
| 2053 | status = 0; | ||
| 2054 | |||
| 2055 | /* see if recovery was already finished elsewhere */ | ||
| 2056 | spin_lock(&dlm->spinlock); | ||
| 2057 | if (dlm->reco.dead_node == O2NM_INVALID_NODE_NUM) { | ||
| 2058 | status = -EINVAL; | ||
| 2059 | mlog(0, "%s: got reco EX lock, but " | ||
| 2060 | "node got recovered already\n", dlm->name); | ||
| 2061 | if (dlm->reco.new_master != O2NM_INVALID_NODE_NUM) { | ||
| 2062 | mlog(ML_ERROR, "%s: new master is %u " | ||
| 2063 | "but no dead node!\n", | ||
| 2064 | dlm->name, dlm->reco.new_master); | ||
| 2065 | BUG(); | ||
| 2066 | } | ||
| 2067 | } | ||
| 2068 | spin_unlock(&dlm->spinlock); | ||
| 2069 | } | ||
| 2070 | |||
| 2071 | /* if this node has actually become the recovery master, | ||
| 2072 | * set the master and send the messages to begin recovery */ | ||
| 2073 | if (!status) { | ||
| 2074 | mlog(0, "%s: dead=%u, this=%u, sending " | ||
| 2075 | "begin_reco now\n", dlm->name, | ||
| 2076 | dlm->reco.dead_node, dlm->node_num); | ||
| 2035 | status = dlm_send_begin_reco_message(dlm, | 2077 | status = dlm_send_begin_reco_message(dlm, |
| 2036 | dlm->reco.dead_node); | 2078 | dlm->reco.dead_node); |
| 2037 | /* this always succeeds */ | 2079 | /* this always succeeds */ |
