diff options
author | Kurt Hackel <kurt.hackel@oracle.com> | 2006-04-27 22:26:15 -0400 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2006-06-26 17:42:57 -0400 |
commit | a9ee4c8a67b962db0208addf0e32935aa571af6b (patch) | |
tree | eec80824fba4b87dcf940533ab8dac87d25ed5f0 /fs/ocfs2/dlm | |
parent | a7f90d83ea8dc8b0999ab7c1c0539af9a6ed69d2 (diff) |
ocfs2: better error handling during assert master message
handle errors during lock assert master by either killing self or other node
Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs/ocfs2/dlm')
-rw-r--r-- | fs/ocfs2/dlm/dlmmaster.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 427c0af0d219..81ceee2e0d50 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
@@ -1633,6 +1633,8 @@ again: | |||
1633 | dlm_node_iter_init(nodemap, &iter); | 1633 | dlm_node_iter_init(nodemap, &iter); |
1634 | while ((to = dlm_node_iter_next(&iter)) >= 0) { | 1634 | while ((to = dlm_node_iter_next(&iter)) >= 0) { |
1635 | int r = 0; | 1635 | int r = 0; |
1636 | struct dlm_master_list_entry *mle = NULL; | ||
1637 | |||
1636 | mlog(0, "sending assert master to %d (%.*s)\n", to, | 1638 | mlog(0, "sending assert master to %d (%.*s)\n", to, |
1637 | namelen, lockname); | 1639 | namelen, lockname); |
1638 | memset(&assert, 0, sizeof(assert)); | 1640 | memset(&assert, 0, sizeof(assert)); |
@@ -1657,7 +1659,15 @@ again: | |||
1657 | /* ok, something horribly messed. kill thyself. */ | 1659 | /* ok, something horribly messed. kill thyself. */ |
1658 | mlog(ML_ERROR,"during assert master of %.*s to %u, " | 1660 | mlog(ML_ERROR,"during assert master of %.*s to %u, " |
1659 | "got %d.\n", namelen, lockname, to, r); | 1661 | "got %d.\n", namelen, lockname, to, r); |
1660 | dlm_dump_lock_resources(dlm); | 1662 | spin_lock(&dlm->spinlock); |
1663 | spin_lock(&dlm->master_lock); | ||
1664 | if (dlm_find_mle(dlm, &mle, (char *)lockname, | ||
1665 | namelen)) { | ||
1666 | dlm_print_one_mle(mle); | ||
1667 | __dlm_put_mle(mle); | ||
1668 | } | ||
1669 | spin_unlock(&dlm->master_lock); | ||
1670 | spin_unlock(&dlm->spinlock); | ||
1661 | BUG(); | 1671 | BUG(); |
1662 | } else if (r == EAGAIN) { | 1672 | } else if (r == EAGAIN) { |
1663 | mlog(0, "%.*s: node %u create mles on other " | 1673 | mlog(0, "%.*s: node %u create mles on other " |
@@ -1922,12 +1932,12 @@ done: | |||
1922 | 1932 | ||
1923 | kill: | 1933 | kill: |
1924 | /* kill the caller! */ | 1934 | /* kill the caller! */ |
1935 | mlog(ML_ERROR, "Bad message received from another node. Dumping state " | ||
1936 | "and killing the other node now! This node is OK and can continue.\n"); | ||
1937 | __dlm_print_one_lock_resource(res); | ||
1925 | spin_unlock(&res->spinlock); | 1938 | spin_unlock(&res->spinlock); |
1926 | spin_unlock(&dlm->spinlock); | 1939 | spin_unlock(&dlm->spinlock); |
1927 | dlm_lockres_put(res); | 1940 | dlm_lockres_put(res); |
1928 | mlog(ML_ERROR, "Bad message received from another node. Dumping state " | ||
1929 | "and killing the other node now! This node is OK and can continue.\n"); | ||
1930 | dlm_dump_lock_resources(dlm); | ||
1931 | dlm_put(dlm); | 1941 | dlm_put(dlm); |
1932 | return -EINVAL; | 1942 | return -EINVAL; |
1933 | } | 1943 | } |