if (WARN_ON(!src_buf || !dst_buf))
                goto unlock;
-       v4l2_m2m_buf_done(src_buf, state);
        dst_buf->is_held = src_buf->flags & V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF;
        if (!dst_buf->is_held) {
                v4l2_m2m_dst_buf_remove(m2m_ctx);
                v4l2_m2m_buf_done(dst_buf, state);
        }
+       /*
+        * If the request API is being used, returning the OUTPUT
+        * (src) buffer will wake-up any process waiting on the
+        * request file descriptor.
+        *
+        * Therefore, return the CAPTURE (dst) buffer first,
+        * to avoid signalling the request file descriptor
+        * before the CAPTURE buffer is done.
+        */
+       v4l2_m2m_buf_done(src_buf, state);
        schedule_next = _v4l2_m2m_job_finish(m2m_dev, m2m_ctx);
 unlock:
        spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);