diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h
index 302fe3d3e86b..6557fb1e59b5 100644
--- a/include/libcamera/buffer.h
+++ b/include/libcamera/buffer.h
@@ -49,6 +49,7 @@ public:
 	Request *request() const { return request_; }
 	void setRequest(Request *request) { request_ = request; }
 	const FrameMetadata &metadata() const { return metadata_; }
+	void cancel() { metadata_.status = FrameMetadata::FrameCancelled; }
 
 	unsigned int cookie() const { return cookie_; }
 	void setCookie(unsigned int cookie) { cookie_ = cookie; }
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index fc40dcb381ea..44bd5a9d042b 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -1256,8 +1256,11 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)
 
 	/* If the buffer is cancelled force a complete of the whole request. */
 	if (buffer->metadata().status == FrameMetadata::FrameCancelled) {
-		for (auto it : request->buffers())
-			pipe_->completeBuffer(request, it.second);
+		for (auto it : request->buffers()) {
+			FrameBuffer *b = it.second;
+			b->cancel();
+			pipe_->completeBuffer(request, b);
+		}
 
 		frameInfos_.remove(info);
 		pipe_->completeRequest(request);
