ocfs2: update lvb immediately during recovery

Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
Kurt Hackel 2006-05-01 11:32:14 -07:00 committed by Mark Fasheh
parent 588e00902b
commit ccd8b1f916

View File

@ -1674,40 +1674,48 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm,
} }
lksb->flags |= (ml->flags & lksb->flags |= (ml->flags &
(DLM_LKSB_PUT_LVB|DLM_LKSB_GET_LVB)); (DLM_LKSB_PUT_LVB|DLM_LKSB_GET_LVB));
if (ml->type == LKM_NLMODE)
goto skip_lvb;
if (!dlm_lvb_is_empty(mres->lvb)) { if (!dlm_lvb_is_empty(mres->lvb)) {
if (lksb->flags & DLM_LKSB_PUT_LVB) { if (lksb->flags & DLM_LKSB_PUT_LVB) {
/* other node was trying to update /* other node was trying to update
* lvb when node died. recreate the * lvb when node died. recreate the
* lksb with the updated lvb. */ * lksb with the updated lvb. */
memcpy(lksb->lvb, mres->lvb, DLM_LVB_LEN); memcpy(lksb->lvb, mres->lvb, DLM_LVB_LEN);
/* the lock resource lvb update must happen
* NOW, before the spinlock is dropped.
* we no longer wait for the AST to update
* the lvb. */
memcpy(res->lvb, mres->lvb, DLM_LVB_LEN);
} else { } else {
/* otherwise, the node is sending its /* otherwise, the node is sending its
* most recent valid lvb info */ * most recent valid lvb info */
BUG_ON(ml->type != LKM_EXMODE && BUG_ON(ml->type != LKM_EXMODE &&
ml->type != LKM_PRMODE); ml->type != LKM_PRMODE);
if (!dlm_lvb_is_empty(res->lvb) && if (!dlm_lvb_is_empty(res->lvb) &&
(ml->type == LKM_EXMODE || (ml->type == LKM_EXMODE ||
memcmp(res->lvb, mres->lvb, DLM_LVB_LEN))) { memcmp(res->lvb, mres->lvb, DLM_LVB_LEN))) {
int i; int i;
mlog(ML_ERROR, "%s:%.*s: received bad " mlog(ML_ERROR, "%s:%.*s: received bad "
"lvb! type=%d\n", dlm->name, "lvb! type=%d\n", dlm->name,
res->lockname.len, res->lockname.len,
res->lockname.name, ml->type); res->lockname.name, ml->type);
printk("lockres lvb=["); printk("lockres lvb=[");
for (i=0; i<DLM_LVB_LEN; i++) for (i=0; i<DLM_LVB_LEN; i++)
printk("%02x", res->lvb[i]); printk("%02x", res->lvb[i]);
printk("]\nmigrated lvb=["); printk("]\nmigrated lvb=[");
for (i=0; i<DLM_LVB_LEN; i++) for (i=0; i<DLM_LVB_LEN; i++)
printk("%02x", mres->lvb[i]); printk("%02x", mres->lvb[i]);
printk("]\n"); printk("]\n");
dlm_print_one_lock_resource(res); dlm_print_one_lock_resource(res);
BUG(); BUG();
} }
memcpy(res->lvb, mres->lvb, DLM_LVB_LEN); memcpy(res->lvb, mres->lvb, DLM_LVB_LEN);
} }
} }
skip_lvb:
/* NOTE: /* NOTE:
* wrt lock queue ordering and recovery: * wrt lock queue ordering and recovery: