static int fbcon_fb_unregistered(struct fb_info *info)
 {
-       int i, idx = info->node;
+       int i, idx;
 
+       if (!lock_fb_info(info))
+               return -ENODEV;
+       idx = info->node;
        for (i = first_fb_vc; i <= last_fb_vc; i++) {
                if (con2fb_map[i] == idx)
                        con2fb_map[i] = -1;
                }
        }
 
-       if (!num_registered_fb)
-               unregister_con_driver(&fb_con);
-
-
        if (primary_device == idx)
                primary_device = -1;
 
+       unlock_fb_info(info);
+
+       if (!num_registered_fb)
+               unregister_con_driver(&fb_con);
+
        return 0;
 }
 
 
 static int fbcon_fb_registered(struct fb_info *info)
 {
-       int ret = 0, i, idx = info->node;
+       int ret = 0, i, idx;
 
+       if (!lock_fb_info(info))
+               return -ENODEV;
+       idx = info->node;
        fbcon_select_primary(info);
+       unlock_fb_info(info);
 
        if (info_idx == -1) {
                for (i = first_fb_vc; i <= last_fb_vc; i++) {
        }
 }
 
-static int fbcon_event_notify(struct notifier_block *self, 
+static int fbcon_event_notify(struct notifier_block *self,
                              unsigned long action, void *data)
 {
        struct fb_event *event = data;
        struct fb_videomode *mode;
        struct fb_con2fbmap *con2fb;
        struct fb_blit_caps *caps;
-       int ret = 0;
+       int idx, ret = 0;
 
        /*
         * ignore all events except driver registration and deregistration
 
        switch(action) {
        case FB_EVENT_SUSPEND:
+               if (!lock_fb_info(info)) {
+                       ret = -ENODEV;
+                       goto done;
+               }
                fbcon_suspended(info);
+               unlock_fb_info(info);
                break;
        case FB_EVENT_RESUME:
+               if (!lock_fb_info(info)) {
+                       ret = -ENODEV;
+                       goto done;
+               }
                fbcon_resumed(info);
+               unlock_fb_info(info);
                break;
        case FB_EVENT_MODE_CHANGE:
+               if (!lock_fb_info(info)) {
+                       ret = -ENODEV;
+                       goto done;
+               }
                fbcon_modechanged(info);
+               unlock_fb_info(info);
                break;
        case FB_EVENT_MODE_CHANGE_ALL:
+               if (!lock_fb_info(info)) {
+                       ret = -ENODEV;
+                       goto done;
+               }
                fbcon_set_all_vcs(info);
+               unlock_fb_info(info);
                break;
        case FB_EVENT_MODE_DELETE:
                mode = event->data;
+               if (!lock_fb_info(info)) {
+                       ret = -ENODEV;
+                       goto done;
+               }
                ret = fbcon_mode_deleted(info, mode);
+               unlock_fb_info(info);
                break;
        case FB_EVENT_FB_UNBIND:
-               ret = fbcon_fb_unbind(info->node);
+               if (!lock_fb_info(info)) {
+                       ret = -ENODEV;
+                       goto done;
+               }
+               idx = info->node;
+               unlock_fb_info(info);
+               ret = fbcon_fb_unbind(idx);
                break;
        case FB_EVENT_FB_REGISTERED:
                ret = fbcon_fb_registered(info);
                con2fb->framebuffer = con2fb_map[con2fb->console - 1];
                break;
        case FB_EVENT_BLANK:
+               if (!lock_fb_info(info)) {
+                       ret = -ENODEV;
+                       goto done;
+               }
                fbcon_fb_blanked(info, *(int *)event->data);
+               unlock_fb_info(info);
                break;
        case FB_EVENT_NEW_MODELIST:
+               if (!lock_fb_info(info)) {
+                       ret = -ENODEV;
+                       goto done;
+               }
                fbcon_new_modelist(info);
+               unlock_fb_info(info);
                break;
        case FB_EVENT_GET_REQ:
                caps = event->data;
+               if (!lock_fb_info(info)) {
+                       ret = -ENODEV;
+                       goto done;
+               }
                fbcon_get_requirement(info, caps);
+               unlock_fb_info(info);
                break;
        }
-
 done:
        return ret;
 }
 
                        return -EINVAL;
                con2fb.framebuffer = -1;
                event.data = &con2fb;
-
-               if (!lock_fb_info(info))
-                       return -ENODEV;
                event.info = info;
                fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, &event);
-               unlock_fb_info(info);
-
                ret = copy_to_user(argp, &con2fb, sizeof(con2fb)) ? -EFAULT : 0;
                break;
        case FBIOPUT_CON2FBMAP:
                        break;
                }
                event.data = &con2fb;
-               if (!lock_fb_info(info))
-                       return -ENODEV;
                event.info = info;
-               ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP,
-                                             &event);
-               unlock_fb_info(info);
+               ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, &event);
                break;
        case FBIOBLANK:
                if (!lock_fb_info(info))