|
@@ -1108,14 +1108,16 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|
|
case FBIOPUT_VSCREENINFO:
|
|
|
if (copy_from_user(&var, argp, sizeof(var)))
|
|
|
return -EFAULT;
|
|
|
- if (!lock_fb_info(info))
|
|
|
- return -ENODEV;
|
|
|
console_lock();
|
|
|
+ if (!lock_fb_info(info)) {
|
|
|
+ console_unlock();
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
info->flags |= FBINFO_MISC_USEREVENT;
|
|
|
ret = fb_set_var(info, &var);
|
|
|
info->flags &= ~FBINFO_MISC_USEREVENT;
|
|
|
- console_unlock();
|
|
|
unlock_fb_info(info);
|
|
|
+ console_unlock();
|
|
|
if (!ret && copy_to_user(argp, &var, sizeof(var)))
|
|
|
ret = -EFAULT;
|
|
|
break;
|
|
@@ -1144,12 +1146,14 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|
|
case FBIOPAN_DISPLAY:
|
|
|
if (copy_from_user(&var, argp, sizeof(var)))
|
|
|
return -EFAULT;
|
|
|
- if (!lock_fb_info(info))
|
|
|
- return -ENODEV;
|
|
|
console_lock();
|
|
|
+ if (!lock_fb_info(info)) {
|
|
|
+ console_unlock();
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
ret = fb_pan_display(info, &var);
|
|
|
- console_unlock();
|
|
|
unlock_fb_info(info);
|
|
|
+ console_unlock();
|
|
|
if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
|
|
|
return -EFAULT;
|
|
|
break;
|
|
@@ -1184,23 +1188,27 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|
|
break;
|
|
|
}
|
|
|
event.data = &con2fb;
|
|
|
- if (!lock_fb_info(info))
|
|
|
- return -ENODEV;
|
|
|
console_lock();
|
|
|
+ if (!lock_fb_info(info)) {
|
|
|
+ console_unlock();
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
event.info = info;
|
|
|
ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, &event);
|
|
|
- console_unlock();
|
|
|
unlock_fb_info(info);
|
|
|
+ console_unlock();
|
|
|
break;
|
|
|
case FBIOBLANK:
|
|
|
- if (!lock_fb_info(info))
|
|
|
- return -ENODEV;
|
|
|
console_lock();
|
|
|
+ if (!lock_fb_info(info)) {
|
|
|
+ console_unlock();
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
info->flags |= FBINFO_MISC_USEREVENT;
|
|
|
ret = fb_blank(info, arg);
|
|
|
info->flags &= ~FBINFO_MISC_USEREVENT;
|
|
|
- console_unlock();
|
|
|
unlock_fb_info(info);
|
|
|
+ console_unlock();
|
|
|
break;
|
|
|
default:
|
|
|
if (!lock_fb_info(info))
|
|
@@ -1660,12 +1668,15 @@ static int do_register_framebuffer(struct fb_info *fb_info)
|
|
|
registered_fb[i] = fb_info;
|
|
|
|
|
|
event.info = fb_info;
|
|
|
- if (!lock_fb_info(fb_info))
|
|
|
- return -ENODEV;
|
|
|
console_lock();
|
|
|
+ if (!lock_fb_info(fb_info)) {
|
|
|
+ console_unlock();
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
|
|
|
- console_unlock();
|
|
|
unlock_fb_info(fb_info);
|
|
|
+ console_unlock();
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1678,13 +1689,16 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
|
|
|
if (i < 0 || i >= FB_MAX || registered_fb[i] != fb_info)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (!lock_fb_info(fb_info))
|
|
|
- return -ENODEV;
|
|
|
console_lock();
|
|
|
+ if (!lock_fb_info(fb_info)) {
|
|
|
+ console_unlock();
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
event.info = fb_info;
|
|
|
ret = fb_notifier_call_chain(FB_EVENT_FB_UNBIND, &event);
|
|
|
- console_unlock();
|
|
|
unlock_fb_info(fb_info);
|
|
|
+ console_unlock();
|
|
|
|
|
|
if (ret)
|
|
|
return -EINVAL;
|