diff options
author | Kurt Hackel <kurt.hackel@oracle.com> | 2006-04-27 21:02:10 -0400 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2006-06-26 17:42:46 -0400 |
commit | 8bc674cb4834fb25206b7f7f5e37fe571aa76b34 (patch) | |
tree | 9c9ba3801669e66a30bac121846153879a19dfd6 /fs/ocfs2 | |
parent | aba9aac78817d88aa2b223f1aedf1e9815ae97b8 (diff) |
ocfs2: Fix empty lvb check
The check for an empty lvb should check the entire buffer not just the first
byte.
Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/dlm/dlmcommon.h | 9 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmrecovery.c | 12 |
2 files changed, 16 insertions, 5 deletions
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index 4fc1be3a3fa2..bf873919b009 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h | |||
@@ -315,6 +315,15 @@ enum dlm_lockres_list { | |||
315 | DLM_BLOCKED_LIST | 315 | DLM_BLOCKED_LIST |
316 | }; | 316 | }; |
317 | 317 | ||
318 | static inline int dlm_lvb_is_empty(char *lvb) | ||
319 | { | ||
320 | int i; | ||
321 | for (i=0; i<DLM_LVB_LEN; i++) | ||
322 | if (lvb[i]) | ||
323 | return 0; | ||
324 | return 1; | ||
325 | } | ||
326 | |||
318 | static inline struct list_head * | 327 | static inline struct list_head * |
319 | dlm_list_idx_to_ptr(struct dlm_lock_resource *res, enum dlm_lockres_list idx) | 328 | dlm_list_idx_to_ptr(struct dlm_lock_resource *res, enum dlm_lockres_list idx) |
320 | { | 329 | { |
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index b568bb6617d8..8a3f0173ff56 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c | |||
@@ -1021,8 +1021,9 @@ static int dlm_add_lock_to_array(struct dlm_lock *lock, | |||
1021 | ml->type == LKM_PRMODE) { | 1021 | ml->type == LKM_PRMODE) { |
1022 | /* if it is already set, this had better be a PR | 1022 | /* if it is already set, this had better be a PR |
1023 | * and it has to match */ | 1023 | * and it has to match */ |
1024 | if (mres->lvb[0] && (ml->type == LKM_EXMODE || | 1024 | if (!dlm_lvb_is_empty(mres->lvb) && |
1025 | memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN))) { | 1025 | (ml->type == LKM_EXMODE || |
1026 | memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN))) { | ||
1026 | mlog(ML_ERROR, "mismatched lvbs!\n"); | 1027 | mlog(ML_ERROR, "mismatched lvbs!\n"); |
1027 | __dlm_print_one_lock_resource(lock->lockres); | 1028 | __dlm_print_one_lock_resource(lock->lockres); |
1028 | BUG(); | 1029 | BUG(); |
@@ -1554,7 +1555,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, | |||
1554 | lksb->flags |= (ml->flags & | 1555 | lksb->flags |= (ml->flags & |
1555 | (DLM_LKSB_PUT_LVB|DLM_LKSB_GET_LVB)); | 1556 | (DLM_LKSB_PUT_LVB|DLM_LKSB_GET_LVB)); |
1556 | 1557 | ||
1557 | if (mres->lvb[0]) { | 1558 | if (!dlm_lvb_is_empty(mres->lvb)) { |
1558 | if (lksb->flags & DLM_LKSB_PUT_LVB) { | 1559 | if (lksb->flags & DLM_LKSB_PUT_LVB) { |
1559 | /* other node was trying to update | 1560 | /* other node was trying to update |
1560 | * lvb when node died. recreate the | 1561 | * lvb when node died. recreate the |
@@ -1565,8 +1566,9 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, | |||
1565 | * most recent valid lvb info */ | 1566 | * most recent valid lvb info */ |
1566 | BUG_ON(ml->type != LKM_EXMODE && | 1567 | BUG_ON(ml->type != LKM_EXMODE && |
1567 | ml->type != LKM_PRMODE); | 1568 | ml->type != LKM_PRMODE); |
1568 | if (res->lvb[0] && (ml->type == LKM_EXMODE || | 1569 | if (!dlm_lvb_is_empty(res->lvb) && |
1569 | memcmp(res->lvb, mres->lvb, DLM_LVB_LEN))) { | 1570 | (ml->type == LKM_EXMODE || |
1571 | memcmp(res->lvb, mres->lvb, DLM_LVB_LEN))) { | ||
1570 | mlog(ML_ERROR, "received bad lvb!\n"); | 1572 | mlog(ML_ERROR, "received bad lvb!\n"); |
1571 | __dlm_print_one_lock_resource(res); | 1573 | __dlm_print_one_lock_resource(res); |
1572 | BUG(); | 1574 | BUG(); |