mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 16:14:13 +08:00
fbcon: Fix error paths in set_con2fb_map
This is a regressoin introduced inb07db39584
("fbcon: Ditch error handling for con2fb_release_oldinfo"). I failed to realize what the if (!err) checks. The mentioned commit was dropping the con2fb_release_oldinfo() return value but the if (!err) was also checking whether the con2fb_acquire_newinfo() function call above failed or not. Fix this with an early return statement. Note that there's still a difference compared to the orginal state of the code, the below lines are now also skipped on error: if (!search_fb_in_map(info_idx)) info_idx = newidx; These are only needed when we've actually thrown out an old fb_info from the console mappings, which only happens later on. Also move the fbcon_add_cursor_work() call into the same if block, it's all protected by console_lock so doesn't matter when we set up the blinking cursor delayed work anyway. This further simplifies the control flow and allows us to ditch the found local variable. v2: Clarify commit message (Javier) Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> Acked-by: Helge Deller <deller@gmx.de> Tested-by: Xingyuan Mo <hdthky0@gmail.com> Fixes:b07db39584
("fbcon: Ditch error handling for con2fb_release_oldinfo") Cc: Thomas Zimmermann <tzimmermann@suse.de> Cc: Sam Ravnborg <sam@ravnborg.org> Cc: Xingyuan Mo <hdthky0@gmail.com> Cc: Thomas Zimmermann <tzimmermann@suse.de> Cc: Helge Deller <deller@gmx.de> Cc: <stable@vger.kernel.org> # v5.19+
This commit is contained in:
parent
a552b73f36
commit
edf79dd217
@ -823,7 +823,7 @@ static int set_con2fb_map(int unit, int newidx, int user)
|
|||||||
int oldidx = con2fb_map[unit];
|
int oldidx = con2fb_map[unit];
|
||||||
struct fb_info *info = fbcon_registered_fb[newidx];
|
struct fb_info *info = fbcon_registered_fb[newidx];
|
||||||
struct fb_info *oldinfo = NULL;
|
struct fb_info *oldinfo = NULL;
|
||||||
int found, err = 0, show_logo;
|
int err = 0, show_logo;
|
||||||
|
|
||||||
WARN_CONSOLE_UNLOCKED();
|
WARN_CONSOLE_UNLOCKED();
|
||||||
|
|
||||||
@ -841,26 +841,25 @@ static int set_con2fb_map(int unit, int newidx, int user)
|
|||||||
if (oldidx != -1)
|
if (oldidx != -1)
|
||||||
oldinfo = fbcon_registered_fb[oldidx];
|
oldinfo = fbcon_registered_fb[oldidx];
|
||||||
|
|
||||||
found = search_fb_in_map(newidx);
|
if (!search_fb_in_map(newidx)) {
|
||||||
|
|
||||||
if (!err && !found) {
|
|
||||||
err = con2fb_acquire_newinfo(vc, info, unit);
|
err = con2fb_acquire_newinfo(vc, info, unit);
|
||||||
if (!err)
|
if (err)
|
||||||
con2fb_map[unit] = newidx;
|
return err;
|
||||||
|
|
||||||
|
con2fb_map[unit] = newidx;
|
||||||
|
fbcon_add_cursor_work(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If old fb is not mapped to any of the consoles,
|
* If old fb is not mapped to any of the consoles,
|
||||||
* fbcon should release it.
|
* fbcon should release it.
|
||||||
*/
|
*/
|
||||||
if (!err && oldinfo && !search_fb_in_map(oldidx))
|
if (oldinfo && !search_fb_in_map(oldidx))
|
||||||
con2fb_release_oldinfo(vc, oldinfo, info);
|
con2fb_release_oldinfo(vc, oldinfo, info);
|
||||||
|
|
||||||
show_logo = (fg_console == 0 && !user &&
|
show_logo = (fg_console == 0 && !user &&
|
||||||
logo_shown != FBCON_LOGO_DONTSHOW);
|
logo_shown != FBCON_LOGO_DONTSHOW);
|
||||||
|
|
||||||
if (!found)
|
|
||||||
fbcon_add_cursor_work(info);
|
|
||||||
con2fb_map_boot[unit] = newidx;
|
con2fb_map_boot[unit] = newidx;
|
||||||
con2fb_init_display(vc, info, unit, show_logo);
|
con2fb_init_display(vc, info, unit, show_logo);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user