DECLARE_WAITQUEUE(wait, current);
        struct dlm_callback cb;
        int rv, resid, copy_lvb = 0;
+       int old_mode, new_mode;
 
        if (count == sizeof(struct dlm_device_version)) {
                rv = copy_version_to_user(buf, count);
 
        lkb = list_entry(proc->asts.next, struct dlm_lkb, lkb_cb_list);
 
+       /* rem_lkb_callback sets a new lkb_last_cast */
+       old_mode = lkb->lkb_last_cast.mode;
+
        rv = dlm_rem_lkb_callback(lkb->lkb_resource->res_ls, lkb, &cb, &resid);
        if (rv < 0) {
                /* this shouldn't happen; lkb should have been removed from
        }
 
        if (cb.flags & DLM_CB_CAST) {
-               int old_mode, new_mode;
-
-               old_mode = lkb->lkb_last_cast.mode;
                new_mode = cb.mode;
 
                if (!cb.sb_status && lkb->lkb_lksb->sb_lvbptr &&
 
 /* Version of the device interface */
 #define DLM_DEVICE_VERSION_MAJOR 6
 #define DLM_DEVICE_VERSION_MINOR 0
-#define DLM_DEVICE_VERSION_PATCH 1
+#define DLM_DEVICE_VERSION_PATCH 2
 
 /* struct passed to the lock write */
 struct dlm_lock_params {