Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: vim2m: only cancel work if it is for right context

cancel_delayed_work_sync() was called for any queue, but it should only
be called for the queue that is associated with the currently running job.

Otherwise, if two filehandles are streaming at the same time, then closing the
first will cancel the work which might still be running for a job from the
second filehandle. As a result the second filehandle will never be able to
finish the job and an attempt to stop streaming on that second filehandle will
stall.

Fixes: 52117be68b82 ("media: vim2m: use cancel_delayed_work_sync instead of flush_schedule_work")

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Cc: <stable@vger.kernel.org> # for v4.20 and up
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
240809ef 7fe9f01c

+3 -1
+3 -1
drivers/media/platform/vim2m.c
··· 807 807 struct vb2_v4l2_buffer *vbuf; 808 808 unsigned long flags; 809 809 810 - cancel_delayed_work_sync(&dev->work_run); 810 + if (v4l2_m2m_get_curr_priv(dev->m2m_dev) == ctx) 811 + cancel_delayed_work_sync(&dev->work_run); 812 + 811 813 for (;;) { 812 814 if (V4L2_TYPE_IS_OUTPUT(q->type)) 813 815 vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);