ocfs2: update lvb immediately during recovery
authorKurt Hackel <kurt.hackel@oracle.com>
Mon, 1 May 2006 18:32:14 +0000 (11:32 -0700)
committerMark Fasheh <mark.fasheh@oracle.com>
Mon, 26 Jun 2006 21:43:02 +0000 (14:43 -0700)
Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
fs/ocfs2/dlm/dlmrecovery.c

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