From 0f9cc2cc798ddd5eadecdfd7847ee47730421ffc Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 22 Jan 2024 11:39:36 -0800 Subject: [PATCH] 4.19-stable patches added patches: fbdev-flush-deferred-work-in-fb_deferred_io_fsync.patch --- ...eferred-work-in-fb_deferred_io_fsync.patch | 51 +++++++++++++++++++ queue-4.19/series | 1 + 2 files changed, 52 insertions(+) create mode 100644 queue-4.19/fbdev-flush-deferred-work-in-fb_deferred_io_fsync.patch diff --git a/queue-4.19/fbdev-flush-deferred-work-in-fb_deferred_io_fsync.patch b/queue-4.19/fbdev-flush-deferred-work-in-fb_deferred_io_fsync.patch new file mode 100644 index 00000000000..ffdabcee382 --- /dev/null +++ b/queue-4.19/fbdev-flush-deferred-work-in-fb_deferred_io_fsync.patch @@ -0,0 +1,51 @@ +From 15e4c1f462279b4e128f27de48133e0debe9e0df Mon Sep 17 00:00:00 2001 +From: Nam Cao +Date: Mon, 18 Dec 2023 10:57:30 +0100 +Subject: fbdev: flush deferred work in fb_deferred_io_fsync() + +From: Nam Cao + +commit 15e4c1f462279b4e128f27de48133e0debe9e0df upstream. + +The driver's fsync() is supposed to flush any pending operation to +hardware. It is implemented in this driver by cancelling the queued +deferred IO first, then schedule it for "immediate execution" by calling +schedule_delayed_work() again with delay=0. However, setting delay=0 +only means the work is scheduled immediately, it does not mean the work +is executed immediately. There is no guarantee that the work is finished +after schedule_delayed_work() returns. After this driver's fsync() +returns, there can still be pending work. Furthermore, if close() is +called by users immediately after fsync(), the pending work gets +cancelled and fsync() may do nothing. + +To ensure that the deferred IO completes, use flush_delayed_work() +instead. Write operations to this driver either write to the device +directly, or invoke schedule_delayed_work(); so by flushing the +workqueue, it can be guaranteed that all previous writes make it to the +device. + +Fixes: 5e841b88d23d ("fb: fsync() method for deferred I/O flush.") +Cc: stable@vger.kernel.org +Signed-off-by: Nam Cao +Reviewed-by: Sebastian Andrzej Siewior +Signed-off-by: Helge Deller +Signed-off-by: Greg Kroah-Hartman +--- + drivers/video/fbdev/core/fb_defio.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +--- a/drivers/video/fbdev/core/fb_defio.c ++++ b/drivers/video/fbdev/core/fb_defio.c +@@ -78,11 +78,7 @@ int fb_deferred_io_fsync(struct file *fi + return 0; + + inode_lock(inode); +- /* Kill off the delayed work */ +- cancel_delayed_work_sync(&info->deferred_work); +- +- /* Run it immediately */ +- schedule_delayed_work(&info->deferred_work, 0); ++ flush_delayed_work(&info->deferred_work); + inode_unlock(inode); + + return 0; diff --git a/queue-4.19/series b/queue-4.19/series index 3f4e228468d..cd1807757d9 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -125,3 +125,4 @@ revert-usb-typec-class-fix-typec_altmode_put_partner-to-put-plugs.patch usb-typec-class-fix-typec_altmode_put_partner-to-put-plugs.patch usb-mon-fix-atomicity-violation-in-mon_bin_vma_fault.patch alsa-oxygen-fix-right-channel-of-capture-volume-mixer.patch +fbdev-flush-deferred-work-in-fb_deferred_io_fsync.patch -- 2.47.3